• Coly Li's avatar
    bcache: set CACHE_SET_IO_DISABLE in bch_cached_dev_error() · 6147305c
    Coly Li authored
    Commit c7b7bd07 ("bcache: add io_disable to struct cached_dev") tries
    to stop bcache device by calling bcache_device_stop() when too many I/O
    errors happened on backing device. But if there is internal I/O happening
    on cache device (writeback scan, garbage collection, etc), a regular I/O
    request triggers the internal I/Os may still holds a refcount of dc->count,
    and the refcount may only be dropped after the internal I/O stopped.
    
    By this patch, bch_cached_dev_error() will check if the backing device is
    attached to a cache set, if yes that CACHE_SET_IO_DISABLE will be set to
    flags of this cache set. Then internal I/Os on cache device will be
    rejected and stopped immediately, and the bcache device can be stopped.
    
    For people who are not familiar with the interesting refcount dependance,
    let me explain a bit more how the fix works. Example the writeback thread
    will scan cache device for dirty data writeback purpose. Before it stopps,
    it holds a refcount of dc->count. When CACHE_SET_IO_DISABLE bit is set,
    the internal I/O will stopped and the while-loop in bch_writeback_thread()
    quits and calls cached_dev_put() to drop dc->count. If this is the last
    refcount to drop, then cached_dev_detach_finish() will be called. In this
    call back function, in turn closure_put(dc->disk.cl) is called to drop a
    refcount of closure dc->disk.cl. If this is the last refcount of this
    closure to drop, then cached_dev_flush() will be called. Then the cached
    device is freed. So if CACHE_SET_IO_DISABLE is not set, the bache device
    can not be stopped until all inernal cache device I/O stopped. For large
    size cache device, and writeback thread competes locks with gc thread,
    there might be a quite long time to wait.
    
    Fixes: c7b7bd07 ("bcache: add io_disable to struct cached_dev")
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    6147305c
super.c 56.3 KB