--- x/fs/super.c +++ y/fs/super.c @@ -1624,9 +1624,9 @@ struct dentry *mount_bdev(struct file_sy */ super_unlock_excl(s); error = setup_bdev_super(s, flags, NULL); - __super_lock_excl(s); if (!error) error = fill_super(s, data, flags & SB_SILENT ? 1 : 0); + __super_lock_excl(s); if (error) { deactivate_locked_super(s); return ERR_PTR(error); --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -609,6 +609,7 @@ static void reiserfs_put_super(struct su } } + up_write(&s->s_umount); /* * note, journal_release checks for readonly mount, and can * decide not to do a journal_end @@ -632,6 +633,7 @@ static void reiserfs_put_super(struct su kfree(REISERFS_SB(s)->s_jdev); kfree(s->s_fs_info); s->s_fs_info = NULL; + down_write(&s->s_umount); } static struct kmem_cache *reiserfs_inode_cachep;