Push BKL down into do_remount_sb()
Al Viro [Fri, 8 May 2009 17:36:58 +0000 (13:36 -0400)]
[folded fix from Jiri Slaby]

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

fs/namespace.c
fs/super.c

index b94325f..2dd333b 100644 (file)
@@ -1060,11 +1060,8 @@ static int do_umount(struct vfsmount *mnt, int flags)
                 * we just try to remount it readonly.
                 */
                down_write(&sb->s_umount);
-               if (!(sb->s_flags & MS_RDONLY)) {
-                       lock_kernel();
+               if (!(sb->s_flags & MS_RDONLY))
                        retval = do_remount_sb(sb, MS_RDONLY, NULL, 0);
-                       unlock_kernel();
-               }
                up_write(&sb->s_umount);
                return retval;
        }
@@ -1515,11 +1512,8 @@ static int do_remount(struct path *path, int flags, int mnt_flags,
        down_write(&sb->s_umount);
        if (flags & MS_BIND)
                err = change_mount_flags(path->mnt, flags);
-       else {
-               lock_kernel();
+       else
                err = do_remount_sb(sb, flags, data, 0);
-               unlock_kernel();
-       }
        if (!err)
                path->mnt->mnt_flags = mnt_flags;
        up_write(&sb->s_umount);
index 2a49fed..a64f362 100644 (file)
@@ -542,25 +542,33 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
        shrink_dcache_sb(sb);
        sync_filesystem(sb);
 
+       lock_kernel();
        /* If we are remounting RDONLY and current sb is read/write,
           make sure there are no rw files opened */
        if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) {
                if (force)
                        mark_files_ro(sb);
-               else if (!fs_may_remount_ro(sb))
+               else if (!fs_may_remount_ro(sb)) {
+                       unlock_kernel();
                        return -EBUSY;
+               }
                retval = vfs_dq_off(sb, 1);
-               if (retval < 0 && retval != -ENOSYS)
+               if (retval < 0 && retval != -ENOSYS) {
+                       unlock_kernel();
                        return -EBUSY;
+               }
        }
        remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY);
 
        if (sb->s_op->remount_fs) {
                retval = sb->s_op->remount_fs(sb, &flags, data);
-               if (retval)
+               if (retval) {
+                       unlock_kernel();
                        return retval;
+               }
        }
        sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
+       unlock_kernel();
        if (remount_rw)
                vfs_dq_quota_on_remount(sb);
        return 0;
@@ -581,9 +589,7 @@ static void do_emergency_remount(struct work_struct *work)
                         *
                         * What lock protects sb->s_flags??
                         */
-                       lock_kernel();
                        do_remount_sb(sb, MS_RDONLY, NULL, 1);
-                       unlock_kernel();
                }
                up_write(&sb->s_umount);
                put_super(sb);