|
@@ -334,13 +334,28 @@ static void move_expired_inodes(struct list_head *delaying_queue,
|
|
|
struct list_head *dispatch_queue,
|
|
|
unsigned long *older_than_this)
|
|
|
{
|
|
|
+ LIST_HEAD(tmp);
|
|
|
+ struct list_head *pos, *node;
|
|
|
+ struct super_block *sb;
|
|
|
+ struct inode *inode;
|
|
|
+
|
|
|
while (!list_empty(delaying_queue)) {
|
|
|
- struct inode *inode = list_entry(delaying_queue->prev,
|
|
|
- struct inode, i_list);
|
|
|
+ inode = list_entry(delaying_queue->prev, struct inode, i_list);
|
|
|
if (older_than_this &&
|
|
|
inode_dirtied_after(inode, *older_than_this))
|
|
|
break;
|
|
|
- list_move(&inode->i_list, dispatch_queue);
|
|
|
+ list_move(&inode->i_list, &tmp);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Move inodes from one superblock together */
|
|
|
+ while (!list_empty(&tmp)) {
|
|
|
+ inode = list_entry(tmp.prev, struct inode, i_list);
|
|
|
+ sb = inode->i_sb;
|
|
|
+ list_for_each_prev_safe(pos, node, &tmp) {
|
|
|
+ inode = list_entry(pos, struct inode, i_list);
|
|
|
+ if (inode->i_sb == sb)
|
|
|
+ list_move(&inode->i_list, dispatch_queue);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|