Without this memory barrier, the file-storage thread may fail to escape from the following while loop, because it may observe new common->thread_wakeup_needed and old bh->state which are updated by the callback functions. /* Wait for the CBW to arrive */ while (bh->state != BUF_STATE_FULL) { rc = sleep_thread(common); if (rc) return rc; } Cc: stable@xxxxxxxxxxxxxxx Signed-off-by: UCHINO Satoshi <satoshi.uchino@xxxxxxxxxxxxx> --- drivers/usb/gadget/f_mass_storage.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index fc5c16c..0b6d351 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -414,6 +414,7 @@ static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep) static void wakeup_thread(struct fsg_common *common) { /* Tell the main thread that something has happened */ + smp_wmb(); common->thread_wakeup_needed = 1; if (common->thread_task) wake_up_process(common->thread_task); @@ -632,6 +633,7 @@ static int sleep_thread(struct fsg_common *common) } __set_current_state(TASK_RUNNING); common->thread_wakeup_needed = 0; + smp_rmb(); return rc; } -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html