From ea49175536d737c929043ace99df665d1bee5e35 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 25 Jul 2013 15:40:43 -0700 Subject: [PATCH] 3.10-stable patches added patches: writeback-fix-periodic-writeback-after-fs-mount.patch --- queue-3.10/series | 1 + ...ix-periodic-writeback-after-fs-mount.patch | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 queue-3.10/series create mode 100644 queue-3.10/writeback-fix-periodic-writeback-after-fs-mount.patch diff --git a/queue-3.10/series b/queue-3.10/series new file mode 100644 index 00000000000..77a1c0ff15b --- /dev/null +++ b/queue-3.10/series @@ -0,0 +1 @@ +writeback-fix-periodic-writeback-after-fs-mount.patch diff --git a/queue-3.10/writeback-fix-periodic-writeback-after-fs-mount.patch b/queue-3.10/writeback-fix-periodic-writeback-after-fs-mount.patch new file mode 100644 index 00000000000..27934c756c0 --- /dev/null +++ b/queue-3.10/writeback-fix-periodic-writeback-after-fs-mount.patch @@ -0,0 +1,58 @@ +From a5faeaf9109578e65e1a32e2a3e76c8b47e7dcb6 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Fri, 28 Jun 2013 16:04:02 +0200 +Subject: writeback: Fix periodic writeback after fs mount + +From: Jan Kara + +commit a5faeaf9109578e65e1a32e2a3e76c8b47e7dcb6 upstream. + +Code in blkdev.c moves a device inode to default_backing_dev_info when +the last reference to the device is put and moves the device inode back +to its bdi when the first reference is acquired. This includes moving to +wb.b_dirty list if the device inode is dirty. The code however doesn't +setup timer to wake corresponding flusher thread and while wb.b_dirty +list is non-empty __mark_inode_dirty() will not set it up either. Thus +periodic writeback is effectively disabled until a sync(2) call which can +lead to unexpected data loss in case of crash or power failure. + +Fix the problem by setting up a timer for periodic writeback in case we +add the first dirty inode to wb.b_dirty list in bdev_inode_switch_bdi(). + +Reported-by: Bert De Jonghe +Signed-off-by: Jan Kara +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + fs/block_dev.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -58,17 +58,24 @@ static void bdev_inode_switch_bdi(struct + struct backing_dev_info *dst) + { + struct backing_dev_info *old = inode->i_data.backing_dev_info; ++ bool wakeup_bdi = false; + + if (unlikely(dst == old)) /* deadlock avoidance */ + return; + bdi_lock_two(&old->wb, &dst->wb); + spin_lock(&inode->i_lock); + inode->i_data.backing_dev_info = dst; +- if (inode->i_state & I_DIRTY) ++ if (inode->i_state & I_DIRTY) { ++ if (bdi_cap_writeback_dirty(dst) && !wb_has_dirty_io(&dst->wb)) ++ wakeup_bdi = true; + list_move(&inode->i_wb_list, &dst->wb.b_dirty); ++ } + spin_unlock(&inode->i_lock); + spin_unlock(&old->wb.list_lock); + spin_unlock(&dst->wb.list_lock); ++ ++ if (wakeup_bdi) ++ bdi_wakeup_thread_delayed(dst); + } + + /* Kill _all_ buffers and pagecache , dirty or not.. */ -- 2.47.3