| From 587ab9c1e4fc7df1c7fd99700bfc5a86bcd018a1 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Thu, 19 Sep 2019 10:30:39 +0200 |
| Subject: [PATCH] USB: legousbtower: fix open after failed reset request |
| |
| commit 0b074f6986751361ff442bc1127c1648567aa8d6 upstream. |
| |
| The driver would return with a nonzero open count in case the reset |
| control request failed. This would prevent any further attempts to open |
| the char dev until the device was disconnected. |
| |
| Fix this by incrementing the open count only on successful open. |
| |
| Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Cc: stable <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20190919083039.30898-5-johan@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c |
| index 4fa999882635..44d6a3381804 100644 |
| --- a/drivers/usb/misc/legousbtower.c |
| +++ b/drivers/usb/misc/legousbtower.c |
| @@ -348,7 +348,6 @@ static int tower_open (struct inode *inode, struct file *file) |
| retval = -EBUSY; |
| goto unlock_exit; |
| } |
| - dev->open_count = 1; |
| |
| /* reset the tower */ |
| result = usb_control_msg (dev->udev, |
| @@ -388,13 +387,14 @@ static int tower_open (struct inode *inode, struct file *file) |
| dev_err(&dev->udev->dev, |
| "Couldn't submit interrupt_in_urb %d\n", retval); |
| dev->interrupt_in_running = 0; |
| - dev->open_count = 0; |
| goto unlock_exit; |
| } |
| |
| /* save device in the file's private structure */ |
| file->private_data = dev; |
| |
| + dev->open_count = 1; |
| + |
| unlock_exit: |
| mutex_unlock(&dev->lock); |
| |
| -- |
| 2.7.4 |
| |