Skip to content

Commit

Permalink
Btrfs: check write access to mount earlier while creating snapshots
Browse files Browse the repository at this point in the history
Move check of write access to mount into upper functions so that we can
use mnt_want_write_file instead, which is faster than mnt_want_write.

Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
  • Loading branch information
Liu Bo authored and Chris Mason committed Jul 23, 2012
1 parent 287082b commit a874a63
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions fs/btrfs/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -652,13 +652,9 @@ static noinline int btrfs_mksubvol(struct path *parent,
if (dentry->d_inode)
goto out_dput;

error = mnt_want_write(parent->mnt);
if (error)
goto out_dput;

error = btrfs_may_create(dir, dentry);
if (error)
goto out_drop_write;
goto out_dput;

down_read(&BTRFS_I(dir)->root->fs_info->subvol_sem);

Expand All @@ -676,8 +672,6 @@ static noinline int btrfs_mksubvol(struct path *parent,
fsnotify_mkdir(dir, dentry);
out_up_read:
up_read(&BTRFS_I(dir)->root->fs_info->subvol_sem);
out_drop_write:
mnt_drop_write(parent->mnt);
out_dput:
dput(dentry);
out_unlock:
Expand Down Expand Up @@ -1395,16 +1389,20 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file,
if (root->fs_info->sb->s_flags & MS_RDONLY)
return -EROFS;

ret = mnt_want_write_file(file);
if (ret)
goto out;

namelen = strlen(name);
if (strchr(name, '/')) {
ret = -EINVAL;
goto out;
goto out_drop_write;
}

if (name[0] == '.' &&
(namelen == 1 || (name[1] == '.' && namelen == 2))) {
ret = -EEXIST;
goto out;
goto out_drop_write;
}

if (subvol) {
Expand All @@ -1415,7 +1413,7 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file,
src_file = fget(fd);
if (!src_file) {
ret = -EINVAL;
goto out;
goto out_drop_write;
}

src_inode = src_file->f_path.dentry->d_inode;
Expand All @@ -1424,13 +1422,15 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file,
"another FS\n");
ret = -EINVAL;
fput(src_file);
goto out;
goto out_drop_write;
}
ret = btrfs_mksubvol(&file->f_path, name, namelen,
BTRFS_I(src_inode)->root,
transid, readonly);
fput(src_file);
}
out_drop_write:
mnt_drop_write_file(file);
out:
return ret;
}
Expand Down

0 comments on commit a874a63

Please sign in to comment.