diff options
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r-- | fs/fs-writeback.c | 21 |
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 | ||