Commit f383ae30 authored by Shenghui Wang's avatar Shenghui Wang Committed by Jens Axboe

bcache: cannot set writeback_running via sysfs if no writeback kthread created

"echo 1 > writeback_running" marks writeback_running even if no
writeback kthread created as "d_strtoul(writeback_running)" will simply
set dc-> writeback_running without checking the existence of
dc->writeback_thread.

Add check for setting writeback_running via sysfs: if no writeback
kthread available, reject setting to 1.

v2 -> v3:
  * Make message on wrong assignment more clear.
  * Print name of bcache device instead of name of backing device.
Signed-off-by: default avatarShenghui Wang <shhuiw@foxmail.com>
Signed-off-by: default avatarColy Li <colyli@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 79b79146
...@@ -384,8 +384,25 @@ STORE(bch_cached_dev) ...@@ -384,8 +384,25 @@ STORE(bch_cached_dev)
mutex_lock(&bch_register_lock); mutex_lock(&bch_register_lock);
size = __cached_dev_store(kobj, attr, buf, size); size = __cached_dev_store(kobj, attr, buf, size);
if (attr == &sysfs_writeback_running) if (attr == &sysfs_writeback_running) {
bch_writeback_queue(dc); /* dc->writeback_running changed in __cached_dev_store() */
if (IS_ERR_OR_NULL(dc->writeback_thread)) {
/*
* reject setting it to 1 via sysfs if writeback
* kthread is not created yet.
*/
if (dc->writeback_running) {
dc->writeback_running = false;
pr_err("%s: failed to run non-existent writeback thread",
dc->disk.disk->disk_name);
}
} else
/*
* writeback kthread will check if dc->writeback_running
* is true or false.
*/
bch_writeback_queue(dc);
}
if (attr == &sysfs_writeback_percent) if (attr == &sysfs_writeback_percent)
if (!test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)) if (!test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment