diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2012-03-02 10:51:00 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-03-19 08:57:59 -0700 |
commit | 25705e3a3e9f91280b51124a28e74418aff00c7d (patch) | |
tree | 4ae031ef034ef5fba5866821e08204a3826644d6 /include | |
parent | aaa136d348dc723f45667aa8b39eb58c7e7c4383 (diff) | |
download | kernel_samsung_smdk4412-25705e3a3e9f91280b51124a28e74418aff00c7d.zip kernel_samsung_smdk4412-25705e3a3e9f91280b51124a28e74418aff00c7d.tar.gz kernel_samsung_smdk4412-25705e3a3e9f91280b51124a28e74418aff00c7d.tar.bz2 |
Block: use a freezable workqueue for disk-event polling
commit 62d3c5439c534b0e6c653fc63e6d8c67be3a57b1 upstream.
This patch (as1519) fixes a bug in the block layer's disk-events
polling. The polling is done by a work routine queued on the
system_nrt_wq workqueue. Since that workqueue isn't freezable, the
polling continues even in the middle of a system sleep transition.
Obviously, polling a suspended drive for media changes and such isn't
a good thing to do; in the case of USB mass-storage devices it can
lead to real problems requiring device resets and even re-enumeration.
The patch fixes things by creating a new system-wide, non-reentrant,
freezable workqueue and using it for disk-events polling.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/workqueue.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index f584aba..6c56a14 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -289,12 +289,16 @@ enum { * * system_freezable_wq is equivalent to system_wq except that it's * freezable. + * + * system_nrt_freezable_wq is equivalent to system_nrt_wq except that + * it's freezable. */ extern struct workqueue_struct *system_wq; extern struct workqueue_struct *system_long_wq; extern struct workqueue_struct *system_nrt_wq; extern struct workqueue_struct *system_unbound_wq; extern struct workqueue_struct *system_freezable_wq; +extern struct workqueue_struct *system_nrt_freezable_wq; extern struct workqueue_struct * __alloc_workqueue_key(const char *name, unsigned int flags, int max_active, |