| From e5b879a8c9c431f7dfce7ebf1edd7f277a5463c0 Mon Sep 17 00:00:00 2001 |
| From: Coly Li <colyli@suse.de> |
| Date: Wed, 22 May 2019 21:55:09 +0800 |
| Subject: [PATCH 13/32] bcache: check CACHE_SET_IO_DISABLE in allocator code |
| |
| If CACHE_SET_IO_DISABLE of a cache set flag is set by too many I/O |
| errors, currently allocator routines can still continue allocate |
| space which may introduce inconsistent metadata state. |
| |
| This patch checkes CACHE_SET_IO_DISABLE bit in following allocator |
| routines, |
| - bch_bucket_alloc() |
| - __bch_bucket_alloc_set() |
| Once CACHE_SET_IO_DISABLE is set on cache set, the allocator routines |
| may reject allocation request earlier to avoid potential inconsistent |
| metadata. |
| |
| Signed-off-by: Coly Li <colyli@suse.de> |
| --- |
| drivers/md/bcache/alloc.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c |
| index f8986effcb50..34ae5bb6724a 100644 |
| --- a/drivers/md/bcache/alloc.c |
| +++ b/drivers/md/bcache/alloc.c |
| @@ -393,6 +393,11 @@ long bch_bucket_alloc(struct cache *ca, unsigned int reserve, bool wait) |
| struct bucket *b; |
| long r; |
| |
| + |
| + /* No allocation if CACHE_SET_IO_DISABLE set */ |
| + if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &ca->set->flags))) |
| + return -1; |
| + |
| /* fastpath */ |
| if (fifo_pop(&ca->free[RESERVE_NONE], r) || |
| fifo_pop(&ca->free[reserve], r)) |
| @@ -484,6 +489,10 @@ int __bch_bucket_alloc_set(struct cache_set *c, unsigned int reserve, |
| { |
| int i; |
| |
| + /* No allocation if CACHE_SET_IO_DISABLE set */ |
| + if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &c->flags))) |
| + return -1; |
| + |
| lockdep_assert_held(&c->bucket_lock); |
| BUG_ON(!n || n > c->caches_loaded || n > MAX_CACHES_PER_SET); |
| |
| -- |
| 2.16.4 |
| |