Skip to content

Commit

Permalink
bcache: improve bcache_reboot()
Browse files Browse the repository at this point in the history
This patch tries to release mutex bch_register_lock early, to give
chance to stop cache set and bcache device early.

This patch also expends time out of stopping all bcache device from
2 seconds to 10 seconds, because stopping writeback rate update worker
may delay for 5 seconds, 2 seconds is not enough.

After this patch applied, stopping bcache devices during system reboot
or shutdown is very hard to be observed any more.

Signed-off-by: Coly Li <colyli@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Coly Li authored and Jens Axboe committed Apr 24, 2019
1 parent 63d63b5 commit eb8cbb6
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/md/bcache/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -2397,10 +2397,19 @@ static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x)
list_for_each_entry_safe(dc, tdc, &uncached_devices, list)
bcache_device_stop(&dc->disk);

mutex_unlock(&bch_register_lock);

/*
* Give an early chance for other kthreads and
* kworkers to stop themselves
*/
schedule();

/* What's a condition variable? */
while (1) {
long timeout = start + 2 * HZ - jiffies;
long timeout = start + 10 * HZ - jiffies;

mutex_lock(&bch_register_lock);
stopped = list_empty(&bch_cache_sets) &&
list_empty(&uncached_devices);

Expand All @@ -2412,7 +2421,6 @@ static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x)

mutex_unlock(&bch_register_lock);
schedule_timeout(timeout);
mutex_lock(&bch_register_lock);
}

finish_wait(&unregister_wait, &wait);
Expand Down

0 comments on commit eb8cbb6

Please sign in to comment.