summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorColy Li <colyli@suse.de>2019-06-28 19:59:36 +0800
committerJens Axboe <axboe@kernel.dk>2019-06-28 07:39:15 -0600
commit383ff2183ad16a8842d1fbd9dd3e1cbd66813e64 (patch)
treef344136d16b98123ef876d058aa7082b7226f8b6 /drivers
parente775339e1ae1205b47d94881db124c11385e597c (diff)
downloadlinux-stable-383ff2183ad16a8842d1fbd9dd3e1cbd66813e64.tar.gz
linux-stable-383ff2183ad16a8842d1fbd9dd3e1cbd66813e64.tar.bz2
linux-stable-383ff2183ad16a8842d1fbd9dd3e1cbd66813e64.zip
bcache: check CACHE_SET_IO_DISABLE bit in bch_journal()
When too many I/O errors happen on cache set and CACHE_SET_IO_DISABLE bit is set, bch_journal() may continue to work because the journaling bkey might be still in write set yet. The caller of bch_journal() may believe the journal still work but the truth is in-memory journal write set won't be written into cache device any more. This behavior may introduce potential inconsistent metadata status. This patch checks CACHE_SET_IO_DISABLE bit at the head of bch_journal(), if the bit is set, bch_journal() returns NULL immediately to notice caller to know journal does not work. Signed-off-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/bcache/journal.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c
index 4e5fc05720fc..54f8886b6177 100644
--- a/drivers/md/bcache/journal.c
+++ b/drivers/md/bcache/journal.c
@@ -811,6 +811,10 @@ atomic_t *bch_journal(struct cache_set *c,
struct journal_write *w;
atomic_t *ret;
+ /* No journaling if CACHE_SET_IO_DISABLE set already */
+ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &c->flags)))
+ return NULL;
+
if (!CACHE_SYNC(&c->sb))
return NULL;