From d0913aa85c14cccabc6d1005d19f2d5817b9ce39 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 24 Sep 2009 15:12:57 +0200 Subject: [PATCH] --- yaml --- r: 166339 b: refs/heads/master c: cf137307cd9827495b65e7d74ea2b610daa9898b h: refs/heads/master i: 166337: fc42e19e1ce5323e62720c4cb0a88f211dab6e11 166335: 4323e55f6fc4ea1e49fb0a8905a0b2f5fee99875 v: v3 --- [refs] | 2 +- trunk/fs/fs-writeback.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index e06ee0059ab0..17d2529c0c6f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5c03449d34debca0deab58046377e1175c1bcd7e +refs/heads/master: cf137307cd9827495b65e7d74ea2b610daa9898b diff --git a/trunk/fs/fs-writeback.c b/trunk/fs/fs-writeback.c index b27406d51bc7..225c7316344e 100644 --- a/trunk/fs/fs-writeback.c +++ b/trunk/fs/fs-writeback.c @@ -336,17 +336,27 @@ static void move_expired_inodes(struct list_head *delaying_queue, { LIST_HEAD(tmp); struct list_head *pos, *node; - struct super_block *sb; + struct super_block *sb = NULL; struct inode *inode; + int do_sb_sort = 0; while (!list_empty(delaying_queue)) { inode = list_entry(delaying_queue->prev, struct inode, i_list); if (older_than_this && inode_dirtied_after(inode, *older_than_this)) break; + if (sb && sb != inode->i_sb) + do_sb_sort = 1; + sb = inode->i_sb; list_move(&inode->i_list, &tmp); } + /* just one sb in list, splice to dispatch_queue and we're done */ + if (!do_sb_sort) { + list_splice(&tmp, dispatch_queue); + return; + } + /* Move inodes from one superblock together */ while (!list_empty(&tmp)) { inode = list_entry(tmp.prev, struct inode, i_list);