bcache: check CACHE_SET_IO_DISABLE bit in bch_journal()
authorColy Li <colyli@suse.de>
Fri, 28 Jun 2019 11:59:36 +0000 (19:59 +0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 28 Jun 2019 13:39:15 +0000 (07:39 -0600)
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>
drivers/md/bcache/journal.c

index 4e5fc05720fc8349b51f18645961fcbeeb7ab480..54f8886b6177d64637d58c7116bbf94d0d7a5f8c 100644 (file)
@@ -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;