Commit e6dcbd3e authored by Coly Li's avatar Coly Li Committed by Jens Axboe

bcache: avoid flushing btree node in cache_set_flush() if io disabled

When cache_set_flush() is called for too many I/O errors detected on
cache device and the cache set is retiring, inside the function it
doesn't make sense to flushing cached btree nodes from c->btree_cache
because CACHE_SET_IO_DISABLE is set on c->flags already and all I/Os
onto cache device will be rejected.

This patch checks in cache_set_flush() that whether CACHE_SET_IO_DISABLE
is set. If yes, then avoids to flush the cached btree nodes to reduce
more time and make cache set retiring more faster.
Signed-off-by: default avatarColy Li <colyli@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 695277f1
...@@ -1553,7 +1553,11 @@ static void cache_set_flush(struct closure *cl) ...@@ -1553,7 +1553,11 @@ static void cache_set_flush(struct closure *cl)
if (!IS_ERR_OR_NULL(c->root)) if (!IS_ERR_OR_NULL(c->root))
list_add(&c->root->list, &c->btree_cache); list_add(&c->root->list, &c->btree_cache);
/* Should skip this if we're unregistering because of an error */ /*
* Avoid flushing cached nodes if cache set is retiring
* due to too many I/O errors detected.
*/
if (!test_bit(CACHE_SET_IO_DISABLE, &c->flags))
list_for_each_entry(b, &c->btree_cache, list) { list_for_each_entry(b, &c->btree_cache, list) {
mutex_lock(&b->write_lock); mutex_lock(&b->write_lock);
if (btree_node_dirty(b)) if (btree_node_dirty(b))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment