1 Star 0 Fork 18

liuh/btrfs-progs

forked from src-openEuler/btrfs-progs 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0002-subvolume-fix-return-value-when-the-target-exists.patch 2.80 KB
一键复制 编辑 原始数据 按行查看 历史
From 3f988c91763682afc1242de844a901837ab4863a Mon Sep 17 00:00:00 2001
From: Qu Wenruo <wqu@suse.com>
Date: Wed, 10 Jan 2024 13:23:31 +1030
Subject: [PATCH] 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 commit 5aa959fb3440 ("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: 5aa959fb3440 ("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>
---
cmds/subvolume.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/cmds/subvolume.c b/cmds/subvolume.c
index 57be9ea..b01d5c8 100644
--- a/cmds/subvolume.c
+++ b/cmds/subvolume.c
@@ -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) {
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liuh0329/btrfs-progs.git
git@gitee.com:liuh0329/btrfs-progs.git
liuh0329
btrfs-progs
btrfs-progs
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385