Messages in this thread Patch in this message | | | From | Tejun Heo <> | Subject | [PATCH 05/10] writeback: move lingering dirty IO lists transfer from bdi_destroy() to wb_exit() | Date | Tue, 18 Nov 2014 03:37:23 -0500 |
| |
If a bdi still has dirty IOs on destruction, bdi_destroy() transfers them to the default bdi; however, dirty IO lists belong to wb (bdi_writeback) not bdi (backing_dev_info) and after the recent changes we now have wb_exit() which handles destruction of a wb. Move the transfer logic to wb_exit().
This patch is pure reorganization.
Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Jan Kara <jack@suse.cz> Cc: Wu Fengguang <fengguang.wu@intel.com> --- mm/backing-dev.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 4904456..18a4c32 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -456,6 +456,30 @@ static void wb_exit(struct bdi_writeback *wb) WARN_ON(delayed_work_pending(&wb->dwork)); + /* + * Splice our entries to the default_backing_dev_info. This + * condition shouldn't happen. @wb must be empty at this point and + * dirty inodes on it might cause other issues. This workaround is + * added by ce5f8e779519 ("writeback: splice dirty inode entries to + * default bdi on bdi_destroy()") without root-causing the issue. + * + * http://lkml.kernel.org/g/1253038617-30204-11-git-send-email-jens.axboe@oracle.com + * http://thread.gmane.org/gmane.linux.file-systems/35341/focus=35350 + * + * We should probably add WARN_ON() to find out whether it still + * happens and track it down if so. + */ + if (wb_has_dirty_io(wb)) { + struct bdi_writeback *dst = &default_backing_dev_info.wb; + + bdi_lock_two(wb, dst); + list_splice(&wb->b_dirty, &dst->b_dirty); + list_splice(&wb->b_io, &dst->b_io); + list_splice(&wb->b_more_io, &dst->b_more_io); + spin_unlock(&wb->list_lock); + spin_unlock(&dst->list_lock); + } + for (i = 0; i < NR_WB_STAT_ITEMS; i++) percpu_counter_destroy(&wb->stat[i]); @@ -483,30 +507,6 @@ EXPORT_SYMBOL(bdi_init); void bdi_destroy(struct backing_dev_info *bdi) { - /* - * Splice our entries to the default_backing_dev_info. This - * condition shouldn't happen. @wb must be empty at this point and - * dirty inodes on it might cause other issues. This workaround is - * added by ce5f8e779519 ("writeback: splice dirty inode entries to - * default bdi on bdi_destroy()") without root-causing the issue. - * - * http://lkml.kernel.org/g/1253038617-30204-11-git-send-email-jens.axboe@oracle.com - * http://thread.gmane.org/gmane.linux.file-systems/35341/focus=35350 - * - * We should probably add WARN_ON() to find out whether it still - * happens and track it down if so. - */ - if (bdi_has_dirty_io(bdi)) { - struct bdi_writeback *dst = &default_backing_dev_info.wb; - - bdi_lock_two(&bdi->wb, dst); - list_splice(&bdi->wb.b_dirty, &dst->b_dirty); - list_splice(&bdi->wb.b_io, &dst->b_io); - list_splice(&bdi->wb.b_more_io, &dst->b_more_io); - spin_unlock(&bdi->wb.list_lock); - spin_unlock(&dst->list_lock); - } - bdi_unregister(bdi); wb_exit(&bdi->wb); } -- 1.9.3
| |