Commit 2cf93bea authored by George Cherian's avatar George Cherian Committed by Felipe Balbi

usb: gadget: f_mass_storage: call try_to_freeze only when its safe

Call try_to_freeze() in sleep_thread() only when it's safe to sleep.
do_read() and do_write() calls sleep_thread with lock held.
Make sure these won't call try_to_freeze() by passing can_freeze flag
to sleep_thread.

Calling try_to_freeze() with a lock hold was done since day one in
f_mass_storage but since commit 0f9548ca ("lockdep: check that no
locks held at freeze time") lockdep complains about it.
Signed-off-by: default avatarGeorge Cherian <george.cherian@ti.com>
Acked-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 3f79265c
...@@ -602,13 +602,14 @@ static bool start_out_transfer(struct fsg_common *common, struct fsg_buffhd *bh) ...@@ -602,13 +602,14 @@ static bool start_out_transfer(struct fsg_common *common, struct fsg_buffhd *bh)
return true; return true;
} }
static int sleep_thread(struct fsg_common *common) static int sleep_thread(struct fsg_common *common, bool can_freeze)
{ {
int rc = 0; int rc = 0;
/* Wait until a signal arrives or we are woken up */ /* Wait until a signal arrives or we are woken up */
for (;;) { for (;;) {
try_to_freeze(); if (can_freeze)
try_to_freeze();
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (signal_pending(current)) { if (signal_pending(current)) {
rc = -EINTR; rc = -EINTR;
...@@ -682,7 +683,7 @@ static int do_read(struct fsg_common *common) ...@@ -682,7 +683,7 @@ static int do_read(struct fsg_common *common)
/* Wait for the next buffer to become available */ /* Wait for the next buffer to become available */
bh = common->next_buffhd_to_fill; bh = common->next_buffhd_to_fill;
while (bh->state != BUF_STATE_EMPTY) { while (bh->state != BUF_STATE_EMPTY) {
rc = sleep_thread(common); rc = sleep_thread(common, false);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -937,7 +938,7 @@ static int do_write(struct fsg_common *common) ...@@ -937,7 +938,7 @@ static int do_write(struct fsg_common *common)
} }
/* Wait for something to happen */ /* Wait for something to happen */
rc = sleep_thread(common); rc = sleep_thread(common, false);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -1504,7 +1505,7 @@ static int throw_away_data(struct fsg_common *common) ...@@ -1504,7 +1505,7 @@ static int throw_away_data(struct fsg_common *common)
} }
/* Otherwise wait for something to happen */ /* Otherwise wait for something to happen */
rc = sleep_thread(common); rc = sleep_thread(common, true);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -1625,7 +1626,7 @@ static int send_status(struct fsg_common *common) ...@@ -1625,7 +1626,7 @@ static int send_status(struct fsg_common *common)
/* Wait for the next buffer to become available */ /* Wait for the next buffer to become available */
bh = common->next_buffhd_to_fill; bh = common->next_buffhd_to_fill;
while (bh->state != BUF_STATE_EMPTY) { while (bh->state != BUF_STATE_EMPTY) {
rc = sleep_thread(common); rc = sleep_thread(common, true);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -1828,7 +1829,7 @@ static int do_scsi_command(struct fsg_common *common) ...@@ -1828,7 +1829,7 @@ static int do_scsi_command(struct fsg_common *common)
bh = common->next_buffhd_to_fill; bh = common->next_buffhd_to_fill;
common->next_buffhd_to_drain = bh; common->next_buffhd_to_drain = bh;
while (bh->state != BUF_STATE_EMPTY) { while (bh->state != BUF_STATE_EMPTY) {
rc = sleep_thread(common); rc = sleep_thread(common, true);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -2174,7 +2175,7 @@ static int get_next_command(struct fsg_common *common) ...@@ -2174,7 +2175,7 @@ static int get_next_command(struct fsg_common *common)
/* Wait for the next buffer to become available */ /* Wait for the next buffer to become available */
bh = common->next_buffhd_to_fill; bh = common->next_buffhd_to_fill;
while (bh->state != BUF_STATE_EMPTY) { while (bh->state != BUF_STATE_EMPTY) {
rc = sleep_thread(common); rc = sleep_thread(common, true);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -2193,7 +2194,7 @@ static int get_next_command(struct fsg_common *common) ...@@ -2193,7 +2194,7 @@ static int get_next_command(struct fsg_common *common)
/* Wait for the CBW to arrive */ /* Wait for the CBW to arrive */
while (bh->state != BUF_STATE_FULL) { while (bh->state != BUF_STATE_FULL) {
rc = sleep_thread(common); rc = sleep_thread(common, true);
if (rc) if (rc)
return rc; return rc;
} }
...@@ -2379,7 +2380,7 @@ static void handle_exception(struct fsg_common *common) ...@@ -2379,7 +2380,7 @@ static void handle_exception(struct fsg_common *common)
} }
if (num_active == 0) if (num_active == 0)
break; break;
if (sleep_thread(common)) if (sleep_thread(common, true))
return; return;
} }
...@@ -2516,7 +2517,7 @@ static int fsg_main_thread(void *common_) ...@@ -2516,7 +2517,7 @@ static int fsg_main_thread(void *common_)
} }
if (!common->running) { if (!common->running) {
sleep_thread(common); sleep_thread(common, true);
continue; continue;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment