diff options
| author | 2014-09-08 08:03:59 +0900 | |
|---|---|---|
| committer | 2014-09-08 10:00:39 -0600 | |
| commit | c0ea1c22bce63a27b47da90ad1ac49ce48e1a8aa (patch) | |
| tree | 5a5fe4a6b86c4208afb3b812426dfb34f54ae75a | |
| parent | bdi: remove bdi->wb_lock locking around bdi->dev clearing in bdi_unregister() (diff) | |
| download | wireguard-linux-c0ea1c22bce63a27b47da90ad1ac49ce48e1a8aa.tar.xz wireguard-linux-c0ea1c22bce63a27b47da90ad1ac49ce48e1a8aa.zip  | |
bdi: make backing_dev_info->wb.dwork canceling stricter
Canceling of bdi->wb.dwork is currently a bit mushy.
bdi_wb_shutdown() performs cancel_delayed_work_sync() at the end after
shutting down and flushing the delayed_work and bdi_destroy() tries
yet again after bdi_unregister().
bdi->wb.dwork is queued only after checking BDI_registered while
holding bdi->wb_lock and bdi_wb_shutdown() clears the flag while
holding the same lock and then flushes the delayed_work.  There's no
way the delayed_work can be queued again after that.
Replace the two unnecessary cancel_delayed_work_sync() invocations
with WARNs on pending.  This simplifies and clarifies the code a bit
and will help future changes in further isolating bdi_writeback
handling.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to '')
| -rw-r--r-- | mm/backing-dev.c | 15 | 
1 files changed, 2 insertions, 13 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 4afeefe9e365..cb7c5e323814 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -376,13 +376,7 @@ static void bdi_wb_shutdown(struct backing_dev_info *bdi)  	mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);  	flush_delayed_work(&bdi->wb.dwork);  	WARN_ON(!list_empty(&bdi->work_list)); - -	/* -	 * This shouldn't be necessary unless @bdi for some reason has -	 * unflushed dirty IO after work_list is drained.  Do it anyway -	 * just in case. -	 */ -	cancel_delayed_work_sync(&bdi->wb.dwork); +	WARN_ON(delayed_work_pending(&bdi->wb.dwork));  }  /* @@ -497,12 +491,7 @@ void bdi_destroy(struct backing_dev_info *bdi)  	bdi_unregister(bdi); -	/* -	 * If bdi_unregister() had already been called earlier, the dwork -	 * could still be pending because bdi_prune_sb() can race with the -	 * bdi_wakeup_thread_delayed() calls from __mark_inode_dirty(). -	 */ -	cancel_delayed_work_sync(&bdi->wb.dwork); +	WARN_ON(delayed_work_pending(&bdi->wb.dwork));  	for (i = 0; i < NR_BDI_STAT_ITEMS; i++)  		percpu_counter_destroy(&bdi->bdi_stat[i]);  | 
