• T
    block: don't use non-syncing event blocking in disk_check_events() · a9dce2a3
    Tejun Heo 提交于
    This patch is part of fix for triggering of WARN_ON_ONCE() in
    disk_clear_events() reported in bug#34662.
    
      https://bugzilla.kernel.org/show_bug.cgi?id=34662
    
    disk_clear_events() blocks events, schedules and flushes the event
    work.  It expects the work to have started execution on schedule and
    finished on return from flush.  WARN_ON_ONCE() triggers if the event
    work hasn't executed as expected.  This problem happens because
    __disk_block_events() fails to guarantee that the event work item is
    not in flight on return from the function in race-free manner.  The
    problem is two-fold and this patch addresses one of them.
    
    When __disk_block_events() is called with @sync == %false, it bumps
    event block count, calls cancel_delayed_work() and return.  This makes
    it impossible to guarantee that event polling is not in flight on
    return from syncing __disk_block_events() - if the first blocker was
    non-syncing, polling could still be in progress and later syncing ones
    would assume that the first blocker already canceled it.
    
    Making __disk_block_events() cancel_sync regardless of block count
    isn't feasible either as it may race with forced event checking in
    disk_clear_events().
    
    As disk_check_events() is the only user of non-syncing
    __disk_block_events(), updating it to directly cancel and schedule
    event work is the easiest way to solve the issue.
    
    Note that there's another bug in __disk_block_events() and this patch
    doesn't fix the issue completely.  Later patch will fix the other bug.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Tested-by: NSitsofe Wheeler <sitsofe@yahoo.com>
    Reported-by: NSitsofe Wheeler <sitsofe@yahoo.com>
    Reported-by: NBorislav Petkov <bp@alien8.de>
    Reported-by: NMeelis Roos <mroos@linux.ee>
    Reported-by: NLinus Torvalds <torvalds@linux-foundation.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Kay Sievers <kay.sievers@vrfy.org>
    Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
    a9dce2a3
genhd.c 42.6 KB