diff options
| author | George Cherian <george.cherian@ti.com> | 2013-11-08 00:20:52 -0500 |
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2013-11-25 12:34:09 -0500 |
| commit | 2cf93bea3d7b2dbf1e0ebfa9d381aad1b637e2aa (patch) | |
| tree | 075e087c384b74a833f9e2c606368179eae7354d | |
| parent | 3f79265c964ed501cd61eddfc893262d04a6aa4a (diff) | |
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 0f9548ca1 ("lockdep: check that no
locks held at freeze time") lockdep complains about it.
Signed-off-by: George Cherian <george.cherian@ti.com>
Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Felipe Balbi <balbi@ti.com>
| -rw-r--r-- | drivers/usb/gadget/f_mass_storage.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 1b2c19b1e829..b96393908860 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
| @@ -602,13 +602,14 @@ static bool start_out_transfer(struct fsg_common *common, struct fsg_buffhd *bh) | |||
| 602 | return true; | 602 | return true; |
| 603 | } | 603 | } |
| 604 | 604 | ||
| 605 | static int sleep_thread(struct fsg_common *common) | 605 | static int sleep_thread(struct fsg_common *common, bool can_freeze) |
| 606 | { | 606 | { |
| 607 | int rc = 0; | 607 | int rc = 0; |
| 608 | 608 | ||
| 609 | /* Wait until a signal arrives or we are woken up */ | 609 | /* Wait until a signal arrives or we are woken up */ |
| 610 | for (;;) { | 610 | for (;;) { |
| 611 | try_to_freeze(); | 611 | if (can_freeze) |
| 612 | try_to_freeze(); | ||
| 612 | set_current_state(TASK_INTERRUPTIBLE); | 613 | set_current_state(TASK_INTERRUPTIBLE); |
| 613 | if (signal_pending(current)) { | 614 | if (signal_pending(current)) { |
| 614 | rc = -EINTR; | 615 | rc = -EINTR; |
| @@ -682,7 +683,7 @@ static int do_read(struct fsg_common *common) | |||
| 682 | /* Wait for the next buffer to become available */ | 683 | /* Wait for the next buffer to become available */ |
| 683 | bh = common->next_buffhd_to_fill; | 684 | bh = common->next_buffhd_to_fill; |
| 684 | while (bh->state != BUF_STATE_EMPTY) { | 685 | while (bh->state != BUF_STATE_EMPTY) { |
| 685 | rc = sleep_thread(common); | 686 | rc = sleep_thread(common, false); |
| 686 | if (rc) | 687 | if (rc) |
| 687 | return rc; | 688 | return rc; |
| 688 | } | 689 | } |
| @@ -937,7 +938,7 @@ static int do_write(struct fsg_common *common) | |||
| 937 | } | 938 | } |
| 938 | 939 | ||
| 939 | /* Wait for something to happen */ | 940 | /* Wait for something to happen */ |
| 940 | rc = sleep_thread(common); | 941 | rc = sleep_thread(common, false); |
| 941 | if (rc) | 942 | if (rc) |
| 942 | return rc; | 943 | return rc; |
| 943 | } | 944 | } |
| @@ -1504,7 +1505,7 @@ static int throw_away_data(struct fsg_common *common) | |||
| 1504 | } | 1505 | } |
| 1505 | 1506 | ||
| 1506 | /* Otherwise wait for something to happen */ | 1507 | /* Otherwise wait for something to happen */ |
| 1507 | rc = sleep_thread(common); | 1508 | rc = sleep_thread(common, true); |
| 1508 | if (rc) | 1509 | if (rc) |
| 1509 | return rc; | 1510 | return rc; |
| 1510 | } | 1511 | } |
| @@ -1625,7 +1626,7 @@ static int send_status(struct fsg_common *common) | |||
| 1625 | /* Wait for the next buffer to become available */ | 1626 | /* Wait for the next buffer to become available */ |
| 1626 | bh = common->next_buffhd_to_fill; | 1627 | bh = common->next_buffhd_to_fill; |
| 1627 | while (bh->state != BUF_STATE_EMPTY) { | 1628 | while (bh->state != BUF_STATE_EMPTY) { |
| 1628 | rc = sleep_thread(common); | 1629 | rc = sleep_thread(common, true); |
| 1629 | if (rc) | 1630 | if (rc) |
| 1630 | return rc; | 1631 | return rc; |
| 1631 | } | 1632 | } |
| @@ -1828,7 +1829,7 @@ static int do_scsi_command(struct fsg_common *common) | |||
| 1828 | bh = common->next_buffhd_to_fill; | 1829 | bh = common->next_buffhd_to_fill; |
| 1829 | common->next_buffhd_to_drain = bh; | 1830 | common->next_buffhd_to_drain = bh; |
| 1830 | while (bh->state != BUF_STATE_EMPTY) { | 1831 | while (bh->state != BUF_STATE_EMPTY) { |
| 1831 | rc = sleep_thread(common); | 1832 | rc = sleep_thread(common, true); |
| 1832 | if (rc) | 1833 | if (rc) |
| 1833 | return rc; | 1834 | return rc; |
| 1834 | } | 1835 | } |
| @@ -2174,7 +2175,7 @@ static int get_next_command(struct fsg_common *common) | |||
| 2174 | /* Wait for the next buffer to become available */ | 2175 | /* Wait for the next buffer to become available */ |
| 2175 | bh = common->next_buffhd_to_fill; | 2176 | bh = common->next_buffhd_to_fill; |
| 2176 | while (bh->state != BUF_STATE_EMPTY) { | 2177 | while (bh->state != BUF_STATE_EMPTY) { |
| 2177 | rc = sleep_thread(common); | 2178 | rc = sleep_thread(common, true); |
| 2178 | if (rc) | 2179 | if (rc) |
| 2179 | return rc; | 2180 | return rc; |
| 2180 | } | 2181 | } |
| @@ -2193,7 +2194,7 @@ static int get_next_command(struct fsg_common *common) | |||
| 2193 | 2194 | ||
| 2194 | /* Wait for the CBW to arrive */ | 2195 | /* Wait for the CBW to arrive */ |
| 2195 | while (bh->state != BUF_STATE_FULL) { | 2196 | while (bh->state != BUF_STATE_FULL) { |
| 2196 | rc = sleep_thread(common); | 2197 | rc = sleep_thread(common, true); |
| 2197 | if (rc) | 2198 | if (rc) |
| 2198 | return rc; | 2199 | return rc; |
| 2199 | } | 2200 | } |
| @@ -2379,7 +2380,7 @@ static void handle_exception(struct fsg_common *common) | |||
| 2379 | } | 2380 | } |
| 2380 | if (num_active == 0) | 2381 | if (num_active == 0) |
| 2381 | break; | 2382 | break; |
| 2382 | if (sleep_thread(common)) | 2383 | if (sleep_thread(common, true)) |
| 2383 | return; | 2384 | return; |
| 2384 | } | 2385 | } |
| 2385 | 2386 | ||
| @@ -2516,7 +2517,7 @@ static int fsg_main_thread(void *common_) | |||
| 2516 | } | 2517 | } |
| 2517 | 2518 | ||
| 2518 | if (!common->running) { | 2519 | if (!common->running) { |
| 2519 | sleep_thread(common); | 2520 | sleep_thread(common, true); |
| 2520 | continue; | 2521 | continue; |
| 2521 | } | 2522 | } |
| 2522 | 2523 | ||
