A fresh backing device is not attached to any cache_set, and has no writeback kthread created until first attached to some cache_set. But bch_cached_dev_writeback_init run " dc->writeback_running = true; WARN_ON(test_and_clear_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)); " for any newly formatted backing devices. For a fresh standalone backing device, we can get something like following even if no writeback kthread created: ------------------------ /sys/block/bcache0/bcache$ cat writeback_rate_debug rate: 512.0k/sec dirty: 0.0k target: 0.0k proportional: 0.0k integral: 0.0k change: 0.0k/sec next io: -15427384ms /sys/block/bcache0/bcache$ cat writeback_running 1 Besides that, "echo 1 > writeback_running" will mark writeback_running when no writeback kthread created as "d_strtoul(writeback_running)" will simply set dc->writeback_running without checking the existence of dc->writeback_thread. This patch fixes above 2 issues: for a fresh standalone backing device, * dc->writeback_running is set to false, until attached to cache_set. * "echo 1 > writeback_running" will not mark writeback_running. Signed-off-by: Shenghui Wang <shhuiw@xxxxxxxxxxx> --- drivers/md/bcache/writeback.c | 2 +- drivers/md/bcache/writeback.h | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 08c3a9f9676c..2443621d07d6 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -777,7 +777,7 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc) bch_keybuf_init(&dc->writeback_keys); dc->writeback_metadata = true; - dc->writeback_running = true; + dc->writeback_running = false; dc->writeback_percent = 10; dc->writeback_delay = 30; atomic_long_set(&dc->writeback_rate.rate, 1024); diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h index d2b9fdbc8994..0601fe1b40f4 100644 --- a/drivers/md/bcache/writeback.h +++ b/drivers/md/bcache/writeback.h @@ -78,8 +78,11 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio, static inline void bch_writeback_queue(struct cached_dev *dc) { - if (!IS_ERR_OR_NULL(dc->writeback_thread)) + if (!IS_ERR_OR_NULL(dc->writeback_thread)) { wake_up_process(dc->writeback_thread); + dc->writeback_running = true; + } else + dc->writeback_running = false; } static inline void bch_writeback_add(struct cached_dev *dc) -- 2.18.0