usb: serial: Fix race between write after suspend and resume
wwan serial driver sets suspend flag when it goes to suspend.
Driver puts any write request to delayed queue during suspend
and submits the delayed write requests while resuming and clears
the suspend flag after that. This creates a race condition where
write request comes between queuing the delayed write request and
clearing the suspend flag.
CRs-Fixed: 360555
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
Change-Id: Ib15b80bb7e289db66a6306b6147f058b5e78f3e5
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c
index 2a08101..94de730 100644
--- a/drivers/usb/serial/usb_wwan.c
+++ b/drivers/usb/serial/usb_wwan.c
@@ -734,6 +734,10 @@
}
}
+ spin_lock_irq(&intfdata->susp_lock);
+ intfdata->suspended = 0;
+ spin_unlock_irq(&intfdata->susp_lock);
+
for (i = 0; i < serial->num_ports; i++) {
/* walk all ports */
port = serial->port[i];
@@ -759,9 +763,6 @@
play_delayed(port);
spin_unlock_irq(&intfdata->susp_lock);
}
- spin_lock_irq(&intfdata->susp_lock);
- intfdata->suspended = 0;
- spin_unlock_irq(&intfdata->susp_lock);
err_out:
return err;
}