aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
authorTejun Heo <[email protected]>2011-06-09 18:43:59 +0000
committerJens Axboe <[email protected]>2011-06-09 18:43:59 +0000
commitfdd514e16bb2531c0c61ae8a1f87740ce217f630 (patch)
tree5d7b6d4f9112b0b6f93f7ce939045fb634abc3fa /net/tipc/msg.c
parentblock: remove non-syncing __disk_block_events() and fold it into disk_block_e... (diff)
downloadkernel-fdd514e16bb2531c0c61ae8a1f87740ce217f630.tar.gz
kernel-fdd514e16bb2531c0c61ae8a1f87740ce217f630.zip
block: make disk_block_events() properly wait for work cancellation
disk_block_events() should guarantee that the event work is not in flight on return and once blocked it shouldn't issue further cancellations. Because there was no synchronization between the first blocker doing cancel_delayed_work_sync() and the following blockers, the following blockers could finish before cancellation was complete, which broke both guarantees - event work could be in flight and cancellation could happen after return. This bug triggered WARN_ON_ONCE() in disk_clear_events() reported in bug#34662. https://bugzilla.kernel.org/show_bug.cgi?id=34662 Fix it by adding an outer mutex which protects both block count manipulation and work cancellation. -v2: Use outer mutex instead of bit waitqueue per Linus. Signed-off-by: Tejun Heo <[email protected]> Tested-by: Sitsofe Wheeler <[email protected]> Reported-by: Sitsofe Wheeler <[email protected]> Reported-by: Borislav Petkov <[email protected]> Reported-by: Meelis Roos <[email protected]> Reported-by: Linus Torvalds <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Jens Axboe <[email protected]> Cc: Kay Sievers <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
Diffstat (limited to 'net/tipc/msg.c')
0 files changed, 0 insertions, 0 deletions