| From 0b074f6986751361ff442bc1127c1648567aa8d6 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Thu, 19 Sep 2019 10:30:39 +0200 |
| Subject: USB: legousbtower: fix open after failed reset request |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| 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> |
| |
| --- |
| drivers/usb/misc/legousbtower.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/usb/misc/legousbtower.c |
| +++ b/drivers/usb/misc/legousbtower.c |
| @@ -354,7 +354,6 @@ static int tower_open (struct inode *ino |
| retval = -EBUSY; |
| goto unlock_exit; |
| } |
| - dev->open_count = 1; |
| |
| /* reset the tower */ |
| result = usb_control_msg (dev->udev, |
| @@ -394,13 +393,14 @@ static int tower_open (struct inode *ino |
| 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); |
| |