A very long time ago ext3_fill_super() was beng called under the VFS's lock_super(), and it had to drop that lock for deadlock avoidance reasons. But the VFS was later changed to not take lock_super() across ->fill_super(), so we're upping a non-downed semaphore. Just take it all out... ext3/super.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff -puN fs/ext3/super.c~ext3_fill_super-no-unlock_super fs/ext3/super.c --- 25/fs/ext3/super.c~ext3_fill_super-no-unlock_super 2003-02-09 11:46:53.000000000 -0800 +++ 25-akpm/fs/ext3/super.c 2003-02-09 12:24:46.000000000 -0800 @@ -1343,9 +1343,10 @@ static int ext3_fill_super (struct super * superblock lock. */ EXT3_SB(sb)->s_mount_state |= EXT3_ORPHAN_FS; - unlock_super(sb); /* akpm: sigh */ + if (down_trylock(&sb->s_lock)) /* It should not be held */ + BUG(); + up(&sb->s_lock); ext3_orphan_cleanup(sb, es); - lock_super(sb); EXT3_SB(sb)->s_mount_state &= ~EXT3_ORPHAN_FS; if (needs_recovery) printk (KERN_INFO "EXT3-fs: recovery complete.\n"); _