From fe667f6e7d0a3215bf671bfd70b0eb18d6e9c1a6 Mon Sep 17 00:00:00 2001 From: Yingyi Luo Date: Fri, 15 Sep 2017 11:17:31 -0700 Subject: btrfs-progs: add a parameter to btrfs_mksubvol A convert parameter is added as a flag to indicate if btrfs_mksubvol() is used for btrfs-convert. The change cascades down to the callchain. Signed-off-by: Yingyi Luo Signed-off-by: David Sterba --- convert/main.c | 2 +- ctree.h | 4 +++- inode.c | 26 ++++++++++++++++---------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/convert/main.c b/convert/main.c index 0babf0e8..882daf7c 100644 --- a/convert/main.c +++ b/convert/main.c @@ -1197,7 +1197,7 @@ static int do_convert(const char *devname, u32 convert_flags, u32 nodesize, } image_root = btrfs_mksubvol(root, subvol_name, - CONV_IMAGE_SUBVOL_OBJECTID); + CONV_IMAGE_SUBVOL_OBJECTID, true); if (!image_root) { error("unable to link subvolume %s", subvol_name); goto fail; diff --git a/ctree.h b/ctree.h index c8bea34e..22806599 100644 --- a/ctree.h +++ b/ctree.h @@ -19,6 +19,8 @@ #ifndef __BTRFS_CTREE_H__ #define __BTRFS_CTREE_H__ +#include + #if BTRFS_FLAT_INCLUDES #include "list.h" #include "kerncompat.h" @@ -2746,7 +2748,7 @@ int btrfs_add_orphan_item(struct btrfs_trans_handle *trans, int btrfs_mkdir(struct btrfs_trans_handle *trans, struct btrfs_root *root, char *name, int namelen, u64 parent_ino, u64 *ino, int mode); struct btrfs_root *btrfs_mksubvol(struct btrfs_root *root, const char *base, - u64 root_objectid); + u64 root_objectid, bool convert); /* file.c */ int btrfs_get_extent(struct btrfs_trans_handle *trans, diff --git a/inode.c b/inode.c index 5dd816bf..ea812ce8 100644 --- a/inode.c +++ b/inode.c @@ -573,7 +573,8 @@ out: } struct btrfs_root *btrfs_mksubvol(struct btrfs_root *root, - const char *base, u64 root_objectid) + const char *base, u64 root_objectid, + bool convert) { struct btrfs_trans_handle *trans; struct btrfs_fs_info *fs_info = root->fs_info; @@ -639,16 +640,21 @@ struct btrfs_root *btrfs_mksubvol(struct btrfs_root *root, key.type = BTRFS_ROOT_ITEM_KEY; memcpy(buf, base, len); - for (i = 0; i < 1024; i++) { - ret = btrfs_insert_dir_item(trans, root, buf, len, - dirid, &key, BTRFS_FT_DIR, index); - if (ret != -EEXIST) - break; - len = snprintf(buf, ARRAY_SIZE(buf), "%s%d", base, i); - if (len < 1 || len > BTRFS_NAME_LEN) { - ret = -EINVAL; - break; + if (convert) { + for (i = 0; i < 1024; i++) { + ret = btrfs_insert_dir_item(trans, root, buf, len, + dirid, &key, BTRFS_FT_DIR, index); + if (ret != -EEXIST) + break; + len = snprintf(buf, ARRAY_SIZE(buf), "%s%d", base, i); + if (len < 1 || len > BTRFS_NAME_LEN) { + ret = -EINVAL; + break; + } } + } else { + ret = btrfs_insert_dir_item(trans, root, buf, len, dirid, &key, + BTRFS_FT_DIR, index); } if (ret) goto fail; -- cgit v1.2.3