| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Tang Junhui <tang.junhui@zte.com.cn> |
| Date: Mon, 8 Jan 2018 12:21:19 -0800 |
| Subject: bcache: stop writeback thread after detaching |
| |
| From: Tang Junhui <tang.junhui@zte.com.cn> |
| |
| |
| [ Upstream commit 8d29c4426b9f8afaccf28de414fde8a722b35fdf ] |
| |
| Currently, when a cached device detaching from cache, writeback thread is |
| not stopped, and writeback_rate_update work is not canceled. For example, |
| after the following command: |
| echo 1 >/sys/block/sdb/bcache/detach |
| you can still see the writeback thread. Then you attach the device to the |
| cache again, bcache will create another writeback thread, for example, |
| after below command: |
| echo ba0fb5cd-658a-4533-9806-6ce166d883b9 > /sys/block/sdb/bcache/attach |
| then you will see 2 writeback threads. |
| This patch stops writeback thread and cancels writeback_rate_update work |
| when cached device detaching from cache. |
| |
| Compare with patch v1, this v2 patch moves code down into the register |
| lock for safety in case of any future changes as Coly and Mike suggested. |
| |
| [edit by mlyle: commit log spelling/formatting] |
| |
| Signed-off-by: Tang Junhui <tang.junhui@zte.com.cn> |
| Reviewed-by: Michael Lyle <mlyle@lyle.org> |
| Signed-off-by: Michael Lyle <mlyle@lyle.org> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/md/bcache/super.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/md/bcache/super.c |
| +++ b/drivers/md/bcache/super.c |
| @@ -892,6 +892,12 @@ static void cached_dev_detach_finish(str |
| |
| mutex_lock(&bch_register_lock); |
| |
| + cancel_delayed_work_sync(&dc->writeback_rate_update); |
| + if (!IS_ERR_OR_NULL(dc->writeback_thread)) { |
| + kthread_stop(dc->writeback_thread); |
| + dc->writeback_thread = NULL; |
| + } |
| + |
| memset(&dc->sb.set_uuid, 0, 16); |
| SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE); |
| |