Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec012476 authored by Tejun Heo's avatar Tejun Heo
Browse files

usb_storage: don't use set_freezable_with_signal()



The current implementation of set_freezable_with_signal() is buggy and
tricky to get right.  usb-storage is the only user and its use can be
avoided trivially.

All usb-storage wants is to be able to sleep with timeout and get
woken up if freezing() becomes true.  This can be trivially
implemented by doing interruptible wait w/ freezing() included in the
wait condition.  There's no reason to use set_freezable_with_signal().

Perform interruptible wait on freezing() instead of using
set_freezable_with_signal(), which is scheduled for removal.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Seth Forshee <seth.forshee@canonical.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
parent 839e3407
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -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 */