bcache: return error immediately in bch_journal_replay()
authorColy Li <colyli@suse.de>
Wed, 24 Apr 2019 16:48:36 +0000 (00:48 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 24 Apr 2019 16:56:28 +0000 (10:56 -0600)
When failure happens inside bch_journal_replay(), calling
cache_set_err_on() and handling the failure in async way is not a good
idea. Because after bch_journal_replay() returns, registering code will
continue to execute following steps, and unregistering code triggered
by cache_set_err_on() is running in same time. First it is unnecessary
to handle failure and unregister cache set in an async way, second there
might be potential race condition to run register and unregister code
for same cache set.

So in this patch, if failure happens in bch_journal_replay(), we don't
call cache_set_err_on(), and just print out the same error message to
kernel message buffer, then return -EIO immediately caller. Then caller
can detect such failure and handle it in synchrnozied way.

Signed-off-by: Coly Li <colyli@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/journal.c

index 5180bed911ef6edb3174468f32e205acc73dabf7..828ab474696ad291474b31f8b0b28addc160c8c8 100644 (file)
@@ -331,9 +331,12 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list)
        list_for_each_entry(i, list, list) {
                BUG_ON(i->pin && atomic_read(i->pin) != 1);
 
-               cache_set_err_on(n != i->j.seq, s,
-"bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)",
-                                n, i->j.seq - 1, start, end);
+               if (n != i->j.seq) {
+                       pr_err("bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)",
+                       n, i->j.seq - 1, start, end);
+                       ret = -EIO;
+                       goto err;
+               }
 
                for (k = i->j.start;
                     k < bset_bkey_last(&i->j);