aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fs-writeback.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r--fs/fs-writeback.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 15944f754e15..b27406d51bc7 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -334,13 +334,28 @@ static void move_expired_inodes(struct list_head *delaying_queue,
334 struct list_head *dispatch_queue, 334 struct list_head *dispatch_queue,
335 unsigned long *older_than_this) 335 unsigned long *older_than_this)
336{ 336{
337 LIST_HEAD(tmp);
338 struct list_head *pos, *node;
339 struct super_block *sb;
340 struct inode *inode;
341
337 while (!list_empty(delaying_queue)) { 342 while (!list_empty(delaying_queue)) {
338 struct inode *inode = list_entry(delaying_queue->prev, 343 inode = list_entry(delaying_queue->prev, struct inode, i_list);
339 struct inode, i_list);
340 if (older_than_this && 344 if (older_than_this &&
341 inode_dirtied_after(inode, *older_than_this)) 345 inode_dirtied_after(inode, *older_than_this))
342 break; 346 break;
343 list_move(&inode->i_list, dispatch_queue); 347 list_move(&inode->i_list, &tmp);
348 }
349
350 /* Move inodes from one superblock together */
351 while (!list_empty(&tmp)) {
352 inode = list_entry(tmp.prev, struct inode, i_list);
353 sb = inode->i_sb;
354 list_for_each_prev_safe(pos, node, &tmp) {
355 inode = list_entry(pos, struct inode, i_list);
356 if (inode->i_sb == sb)
357 list_move(&inode->i_list, dispatch_queue);
358 }
344 } 359 }
345} 360}
346 361