bcache: stop writeback kthread and kworker when bch_cached_dev_run() failed
In bch_cached_dev_attach() after bch_cached_dev_writeback_start() called, the wrireback kthread and writeback rate update kworker of the cached device are created, if the following bch_cached_dev_run() failed, bch_cached_dev_attach() will return with -ENOMEM without stopping the writeback related kthread and kworker. This patch stops writeback kthread and writeback rate update kworker before returning -ENOMEM if bch_cached_dev_run() returns error. Signed-off-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
f54d801dda
commit
5c2a634cbf
|
@ -1189,6 +1189,14 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
|
||||||
ret = bch_cached_dev_run(dc);
|
ret = bch_cached_dev_run(dc);
|
||||||
if (ret && (ret != -EBUSY)) {
|
if (ret && (ret != -EBUSY)) {
|
||||||
up_write(&dc->writeback_lock);
|
up_write(&dc->writeback_lock);
|
||||||
|
/*
|
||||||
|
* bch_register_lock is held, bcache_device_stop() is not
|
||||||
|
* able to be directly called. The kthread and kworker
|
||||||
|
* created previously in bch_cached_dev_writeback_start()
|
||||||
|
* have to be stopped manually here.
|
||||||
|
*/
|
||||||
|
kthread_stop(dc->writeback_thread);
|
||||||
|
cancel_writeback_rate_update_dwork(dc);
|
||||||
pr_err("Couldn't run cached device %s",
|
pr_err("Couldn't run cached device %s",
|
||||||
dc->backing_dev_name);
|
dc->backing_dev_name);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue