From 3cd741fddfdef4f5f0067551bf86a5d0a3fdec58 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Tue, 16 Oct 2007 23:30:32 -0700 Subject: [PATCH] --- yaml --- r: 70723 b: refs/heads/master c: 6610a0bc8dcc120daa1d93807d470d5cbf777c39 h: refs/heads/master i: 70721: af1fe5cc0fd2ccab0f6def89bd944e5e0b6b7889 70719: b8bfced711ca008cc5f1d194e652aeb1fe3f6e69 v: v3 --- [refs] | 2 +- trunk/fs/fs-writeback.c | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index d44be67ffd33..455da7734167 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2b0172e1c6e6aea0a4efcfaaab38d4a02046f45a +refs/heads/master: 6610a0bc8dcc120daa1d93807d470d5cbf777c39 diff --git a/trunk/fs/fs-writeback.c b/trunk/fs/fs-writeback.c index 8d23b0b38717..08b9f83b645e 100644 --- a/trunk/fs/fs-writeback.c +++ b/trunk/fs/fs-writeback.c @@ -140,6 +140,30 @@ static int write_inode(struct inode *inode, int sync) return 0; } +/* + * Redirty an inode: set its when-it-was dirtied timestamp and move it to the + * furthest end of its superblock's dirty-inode list. + * + * Before stamping the inode's ->dirtied_when, we check to see whether it is + * already the most-recently-dirtied inode on the s_dirty list. If that is + * the case then the inode must have been redirtied while it was being written + * out and we don't reset its dirtied_when. + */ +static void redirty_tail(struct inode *inode) +{ + struct super_block *sb = inode->i_sb; + + if (!list_empty(&sb->s_dirty)) { + struct inode *tail_inode; + + tail_inode = list_entry(sb->s_dirty.next, struct inode, i_list); + if (!time_after_eq(inode->dirtied_when, + tail_inode->dirtied_when)) + inode->dirtied_when = jiffies; + } + list_move(&inode->i_list, &sb->s_dirty); +} + /* * Write a single inode's dirty pages and inode data out to disk. * If `wait' is set, wait on the writeout. @@ -219,7 +243,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc) * Someone redirtied the inode while were writing back * the pages. */ - list_move(&inode->i_list, &sb->s_dirty); + redirty_tail(inode); } else if (atomic_read(&inode->i_count)) { /* * The inode is clean, inuse