forked from Minki/linux
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: Shenghui Wang <shhuiw@foxmail.com> Signed-off-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
79b791466e
commit
f383ae300c
@ -384,8 +384,25 @@ STORE(bch_cached_dev)
|
||||
mutex_lock(&bch_register_lock);
|
||||
size = __cached_dev_store(kobj, attr, buf, size);
|
||||
|
||||
if (attr == &sysfs_writeback_running)
|
||||
bch_writeback_queue(dc);
|
||||
if (attr == &sysfs_writeback_running) {
|
||||
/* 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 (!test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags))
|
||||
|
Loading…
Reference in New Issue
Block a user