瀏覽代碼

Push BKL down beyond VFS-only parts of do_mount()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 16 年之前
父節點
當前提交
7f78d4cd4c
共有 1 個文件被更改,包括 6 次插入3 次删除
  1. 6 3
      fs/namespace.c

+ 6 - 3
fs/namespace.c

@@ -1515,8 +1515,11 @@ static int do_remount(struct path *path, int flags, int mnt_flags,
 	down_write(&sb->s_umount);
 	down_write(&sb->s_umount);
 	if (flags & MS_BIND)
 	if (flags & MS_BIND)
 		err = change_mount_flags(path->mnt, flags);
 		err = change_mount_flags(path->mnt, flags);
-	else
+	else {
+		lock_kernel();
 		err = do_remount_sb(sb, flags, data, 0);
 		err = do_remount_sb(sb, flags, data, 0);
+		unlock_kernel();
+	}
 	if (!err)
 	if (!err)
 		path->mnt->mnt_flags = mnt_flags;
 		path->mnt->mnt_flags = mnt_flags;
 	up_write(&sb->s_umount);
 	up_write(&sb->s_umount);
@@ -1630,7 +1633,9 @@ static int do_new_mount(struct path *path, char *type, int flags,
 	if (!capable(CAP_SYS_ADMIN))
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
 		return -EPERM;
 
 
+	lock_kernel();
 	mnt = do_kern_mount(type, flags, name, data);
 	mnt = do_kern_mount(type, flags, name, data);
+	unlock_kernel();
 	if (IS_ERR(mnt))
 	if (IS_ERR(mnt))
 		return PTR_ERR(mnt);
 		return PTR_ERR(mnt);
 
 
@@ -1921,7 +1926,6 @@ long do_mount(char *dev_name, char *dir_name, char *type_page,
 	if (retval)
 	if (retval)
 		goto dput_out;
 		goto dput_out;
 
 
-	lock_kernel();
 	if (flags & MS_REMOUNT)
 	if (flags & MS_REMOUNT)
 		retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,
 		retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,
 				    data_page);
 				    data_page);
@@ -1934,7 +1938,6 @@ long do_mount(char *dev_name, char *dir_name, char *type_page,
 	else
 	else
 		retval = do_new_mount(&path, type_page, flags, mnt_flags,
 		retval = do_new_mount(&path, type_page, flags, mnt_flags,
 				      dev_name, data_page);
 				      dev_name, data_page);
-	unlock_kernel();
 dput_out:
 dput_out:
 	path_put(&path);
 	path_put(&path);
 	return retval;
 	return retval;