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;