Message ID | 20200923092136.14824-8-oneukum@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | CDC_WDM: fix hangs and error reporting in multithreaded cases | expand |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 6ea03c12380c..b9cca1cb5058 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -622,7 +622,7 @@ static int wdm_flush(struct file *file, fl_owner_t id) struct wdm_device *desc = file->private_data; int rv; - rv = wait_event_timeout(desc->wait, + rv = wait_event_interruptible_timeout(desc->wait, /* * needs both flags. We cannot do with one * because resetting it would cause a race @@ -642,6 +642,8 @@ static int wdm_flush(struct file *file, fl_owner_t id) return -ENODEV; if (!rv) return -EIO; + if (rv < 0) + return -EINTR; spin_lock_irq(&desc->iuspin); rv = desc->werr;
There is no need for flush() to be uninterruptible. close(2) is allowed to return -EINTR. 30 seconds is quite long a time to sleep in an uninterruptible state. Change it to an interruptible sleep. Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: Oliver Neukum <oneukum@suse.com> --- drivers/usb/class/cdc-wdm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)