| From 5caa52afc5abd1396e4af720469abb5843a71eb8 Mon Sep 17 00:00:00 2001 |
| From: Kent Overstreet <kmo@daterainc.com> |
| Date: Wed, 10 Jul 2013 21:03:25 -0700 |
| Subject: bcache: Shutdown fix |
| |
| From: Kent Overstreet <kmo@daterainc.com> |
| |
| commit 5caa52afc5abd1396e4af720469abb5843a71eb8 upstream. |
| |
| Stopping a cache set is supposed to make it stop attached backing |
| devices, but somewhere along the way that code got lost. Fixing this |
| mainly has the effect of fixing our reboot notifier. |
| |
| Signed-off-by: Kent Overstreet <kmo@daterainc.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/bcache/super.c | 18 +++++++++++------- |
| 1 file changed, 11 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/md/bcache/super.c |
| +++ b/drivers/md/bcache/super.c |
| @@ -1305,18 +1305,22 @@ static void cache_set_flush(struct closu |
| static void __cache_set_unregister(struct closure *cl) |
| { |
| struct cache_set *c = container_of(cl, struct cache_set, caching); |
| - struct cached_dev *dc, *t; |
| + struct cached_dev *dc; |
| size_t i; |
| |
| mutex_lock(&bch_register_lock); |
| |
| - if (test_bit(CACHE_SET_UNREGISTERING, &c->flags)) |
| - list_for_each_entry_safe(dc, t, &c->cached_devs, list) |
| - bch_cached_dev_detach(dc); |
| - |
| for (i = 0; i < c->nr_uuids; i++) |
| - if (c->devices[i] && UUID_FLASH_ONLY(&c->uuids[i])) |
| - bcache_device_stop(c->devices[i]); |
| + if (c->devices[i]) { |
| + if (!UUID_FLASH_ONLY(&c->uuids[i]) && |
| + test_bit(CACHE_SET_UNREGISTERING, &c->flags)) { |
| + dc = container_of(c->devices[i], |
| + struct cached_dev, disk); |
| + bch_cached_dev_detach(dc); |
| + } else { |
| + bcache_device_stop(c->devices[i]); |
| + } |
| + } |
| |
| mutex_unlock(&bch_register_lock); |
| |