diff options
Diffstat (limited to 'drivers/usb/storage/usb.c')
| -rw-r--r-- | drivers/usb/storage/usb.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index c325e69415a..aa84b3d7727 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -831,7 +831,8 @@ static int usb_stor_scan_thread(void * __us)  	dev_dbg(dev, "device found\n"); -	set_freezable_with_signal(); +	set_freezable(); +  	/*  	 * Wait for the timeout to expire or for a disconnect  	 * @@ -839,16 +840,16 @@ static int usb_stor_scan_thread(void * __us)  	 * fail to freeze, but we can't be non-freezable either. Nor can  	 * khubd freeze while waiting for scanning to complete as it may  	 * hold the device lock, causing a hang when suspending devices. -	 * So we request a fake signal when freezing and use -	 * interruptible sleep to kick us out of our wait early when -	 * freezing happens. +	 * So instead of using wait_event_freezable(), explicitly test +	 * for (DONT_SCAN || freezing) in interruptible wait and proceed +	 * if any of DONT_SCAN, freezing or timeout has happened.  	 */  	if (delay_use > 0) {  		dev_dbg(dev, "waiting for device to settle "  				"before scanning\n");  		wait_event_interruptible_timeout(us->delay_wait, -				test_bit(US_FLIDX_DONT_SCAN, &us->dflags), -				delay_use * HZ); +				test_bit(US_FLIDX_DONT_SCAN, &us->dflags) || +				freezing(current), delay_use * HZ);  	}  	/* If the device is still connected, perform the scanning */  |