mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git
synced 2024-11-27 22:24:20 +08:00
btrfs-progs: subvolume: fix return value when the target exists
[BUG] When try to create a subvolume where the target path already exists, the "btrfs" command doesn't return error code correctly. # mkfs.btrfs -f $dev # mount $dev $mnt # touch $mnt/subv1 # btrfs subvolume create $mnt/subv1 ERROR: target path already exists: $mnt/subv1 # echo $? 0 [CAUSE] The check on whether target exists is done by path_is_dir(), if it returns 0 or 1, it means there is something in that path already. But unfortunately commit5aa959fb34
("btrfs-progs: subvolume create: accept multiple arguments") only changed the out label, which would directly return @ret, not updating the return value correctly. [FIX] Make sure all error out branch has their @ret manually updated. Fixes:5aa959fb34
("btrfs-progs: subvolume create: accept multiple arguments") Issue: #730 Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
faa75347f6
commit
3f988c9176
@ -160,12 +160,14 @@ static int create_one_subvolume(const char *dst, struct btrfs_qgroup_inherit *in
|
||||
}
|
||||
if (ret >= 0) {
|
||||
error("target path already exists: %s", dst);
|
||||
ret = -EEXIST;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dupname = strdup(dst);
|
||||
if (!dupname) {
|
||||
error_msg(ERROR_MSG_MEMORY, "duplicating %s", dst);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
newname = basename(dupname);
|
||||
@ -173,18 +175,21 @@ static int create_one_subvolume(const char *dst, struct btrfs_qgroup_inherit *in
|
||||
dupdir = strdup(dst);
|
||||
if (!dupdir) {
|
||||
error_msg(ERROR_MSG_MEMORY, "duplicating %s", dst);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
dstdir = dirname(dupdir);
|
||||
|
||||
if (!test_issubvolname(newname)) {
|
||||
error("invalid subvolume name: %s", newname);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
len = strlen(newname);
|
||||
if (len > BTRFS_VOL_NAME_MAX) {
|
||||
error("subvolume name too long: %s", newname);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -208,6 +213,8 @@ static int create_one_subvolume(const char *dst, struct btrfs_qgroup_inherit *in
|
||||
goto out;
|
||||
}
|
||||
} else if (ret <= 0) {
|
||||
if (ret == 0)
|
||||
ret = -EEXIST;
|
||||
errno = ret ;
|
||||
error("failed to check directory %s before creation: %m", p);
|
||||
goto out;
|
||||
@ -218,8 +225,10 @@ static int create_one_subvolume(const char *dst, struct btrfs_qgroup_inherit *in
|
||||
}
|
||||
|
||||
fddst = btrfs_open_dir(dstdir, &dirstream, 1);
|
||||
if (fddst < 0)
|
||||
if (fddst < 0) {
|
||||
ret = fddst;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pr_verbose(LOG_DEFAULT, "Create subvolume '%s/%s'\n", dstdir, newname);
|
||||
if (inherit) {
|
||||
|
Loading…
Reference in New Issue
Block a user