From: Greg Kroah-Hartman Date: Thu, 25 Jul 2013 23:02:52 +0000 (-0700) Subject: 3.0-stable patches X-Git-Tag: v3.0.88~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=af1bddb4c8ea04af805d87876e72c4f20263c7b6;p=thirdparty%2Fkernel%2Fstable-queue.git 3.0-stable patches added patches: writeback-fix-periodic-writeback-after-fs-mount.patch --- diff --git a/queue-3.0/series b/queue-3.0/series index 4aeb4c1919c..d0c5b09a5fc 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -25,3 +25,4 @@ ifb-fix-rcu_sched-self-detected-stalls.patch dummy-fix-oops-when-loading-the-dummy-failed.patch ifb-fix-oops-when-loading-the-ifb-failed.patch vlan-fix-a-race-in-egress-prio-management.patch +writeback-fix-periodic-writeback-after-fs-mount.patch diff --git a/queue-3.0/writeback-fix-periodic-writeback-after-fs-mount.patch b/queue-3.0/writeback-fix-periodic-writeback-after-fs-mount.patch new file mode 100644 index 00000000000..4afe52aa024 --- /dev/null +++ b/queue-3.0/writeback-fix-periodic-writeback-after-fs-mount.patch @@ -0,0 +1,56 @@ +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 | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -55,13 +55,21 @@ EXPORT_SYMBOL(I_BDEV); + static void bdev_inode_switch_bdi(struct inode *inode, + struct backing_dev_info *dst) + { ++ bool wakeup_bdi = false; ++ + spin_lock(&inode_wb_list_lock); + 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(&inode_wb_list_lock); ++ ++ if (wakeup_bdi) ++ bdi_wakeup_thread_delayed(dst); + } + + sector_t blkdev_max_block(struct block_device *bdev)