diff -urNp x/fs/inode.c 2.4.20rc2aa1/fs/inode.c --- x/fs/inode.c Wed Nov 20 11:48:44 2002 +++ 2.4.20rc2aa1/fs/inode.c Wed Nov 20 11:38:55 2002 @@ -336,6 +336,7 @@ static inline int try_to_sync_unused_lis struct list_head *tmp = head; struct inode *inode; + spin_lock(&inode_lock); while (nr_inodes && (tmp = tmp->prev) != head) { inode = list_entry(tmp, struct inode, i_list); @@ -356,6 +357,7 @@ static inline int try_to_sync_unused_lis } } } + spin_unlock(&inode_lock); return nr_inodes; } @@ -458,18 +460,23 @@ static void try_to_sync_unused_inodes(vo struct super_block * sb; int nr_inodes = inodes_stat.nr_unused; - spin_lock(&inode_lock); + restart: spin_lock(&sb_lock); sb = sb_entry(super_blocks.next); - for (; nr_inodes && sb != sb_entry(&super_blocks); sb = sb_entry(sb->s_list.next)) { - if (list_empty(&sb->s_dirty)) + while (nr_inodes && sb != sb_entry(&super_blocks)) { + if (list_empty(&sb->s_dirty)) { + sb = sb_entry(sb->s_list.next); continue; + } + sb->s_count++; spin_unlock(&sb_lock); - nr_inodes = try_to_sync_unused_list(&sb->s_dirty, nr_inodes); - spin_lock(&sb_lock); + down_read(&sb->s_umount); + if (sb->s_root) + nr_inodes = try_to_sync_unused_list(&sb->s_dirty, nr_inodes); + drop_super(sb); + goto restart; } spin_unlock(&sb_lock); - spin_unlock(&inode_lock); } static struct tq_struct unused_inodes_flush_task;