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 <yingyil@google.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Yingyi Luo 2017-09-15 11:17:31 -07:00 committed by David Sterba
parent 8a820b5765
commit fe667f6e7d
3 changed files with 20 additions and 12 deletions

View File

@ -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;

View File

@ -19,6 +19,8 @@
#ifndef __BTRFS_CTREE_H__
#define __BTRFS_CTREE_H__
#include <stdbool.h>
#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,

26
inode.c
View File

@ -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;