aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/fs-writeback.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 8d23b0b38717..08b9f83b645e 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -141,6 +141,30 @@ static int write_inode(struct inode *inode, int sync)
141} 141}
142 142
143/* 143/*
144 * Redirty an inode: set its when-it-was dirtied timestamp and move it to the
145 * furthest end of its superblock's dirty-inode list.
146 *
147 * Before stamping the inode's ->dirtied_when, we check to see whether it is
148 * already the most-recently-dirtied inode on the s_dirty list. If that is
149 * the case then the inode must have been redirtied while it was being written
150 * out and we don't reset its dirtied_when.
151 */
152static void redirty_tail(struct inode *inode)
153{
154 struct super_block *sb = inode->i_sb;
155
156 if (!list_empty(&sb->s_dirty)) {
157 struct inode *tail_inode;
158
159 tail_inode = list_entry(sb->s_dirty.next, struct inode, i_list);
160 if (!time_after_eq(inode->dirtied_when,
161 tail_inode->dirtied_when))
162 inode->dirtied_when = jiffies;
163 }
164 list_move(&inode->i_list, &sb->s_dirty);
165}
166
167/*
144 * Write a single inode's dirty pages and inode data out to disk. 168 * Write a single inode's dirty pages and inode data out to disk.
145 * If `wait' is set, wait on the writeout. 169 * If `wait' is set, wait on the writeout.
146 * 170 *
@@ -219,7 +243,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc)
219 * Someone redirtied the inode while were writing back 243 * Someone redirtied the inode while were writing back
220 * the pages. 244 * the pages.
221 */ 245 */
222 list_move(&inode->i_list, &sb->s_dirty); 246 redirty_tail(inode);
223 } else if (atomic_read(&inode->i_count)) { 247 } else if (atomic_read(&inode->i_count)) {
224 /* 248 /*
225 * The inode is clean, inuse 249 * The inode is clean, inuse