| From 595f90f5a6e855b7863f88ee2a21679934faab8b Mon Sep 17 00:00:00 2001 |
| From: Coly Li <colyli@suse.de> |
| Date: Thu, 25 Apr 2019 00:48:36 +0800 |
| Subject: bcache: return error immediately in bch_journal_replay() |
| |
| [ Upstream commit 68d10e6979a3b59e3cd2e90bfcafed79c4cf180a ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/md/bcache/journal.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c |
| index d3725c17ce3a6..9e557164209c1 100644 |
| --- a/drivers/md/bcache/journal.c |
| +++ b/drivers/md/bcache/journal.c |
| @@ -330,9 +330,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); |
| -- |
| 2.20.1 |
| |