bcache: avoid flushing btree node in cache_set_flush() if io disabled
authorColy Li <colyli@suse.de>
Fri, 28 Jun 2019 11:59:28 +0000 (19:59 +0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 28 Jun 2019 13:39:14 +0000 (07:39 -0600)
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>
drivers/md/bcache/super.c

index ba2ad093bc8084c47df009aceface6c97023f141..dc6702c2c4b64371b4f0bc2d87ff0b50e01a380d 100644 (file)
@@ -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)