mirror of https://gitee.com/openkylin/linux.git
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: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
695277f16b
commit
e6dcbd3e6c
|
@ -1553,13 +1553,17 @@ static void cache_set_flush(struct closure *cl)
|
|||
if (!IS_ERR_OR_NULL(c->root))
|
||||
list_add(&c->root->list, &c->btree_cache);
|
||||
|
||||
/* Should skip this if we're unregistering because of an error */
|
||||
list_for_each_entry(b, &c->btree_cache, list) {
|
||||
mutex_lock(&b->write_lock);
|
||||
if (btree_node_dirty(b))
|
||||
__bch_btree_node_write(b, NULL);
|
||||
mutex_unlock(&b->write_lock);
|
||||
}
|
||||
/*
|
||||
* 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) {
|
||||
mutex_lock(&b->write_lock);
|
||||
if (btree_node_dirty(b))
|
||||
__bch_btree_node_write(b, NULL);
|
||||
mutex_unlock(&b->write_lock);
|
||||
}
|
||||
|
||||
for_each_cache(ca, c, i)
|
||||
if (ca->alloc_thread)
|
||||
|
|
Loading…
Reference in New Issue