summaryrefslogtreecommitdiff
path: root/convert
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2017-01-30 17:52:15 +0100
committerDavid Sterba <dsterba@suse.com>2017-03-08 13:00:46 +0100
commit0c362b9031e5c0441f40ef3535572505d52006f2 (patch)
treec16d28c42ed5fcbc296bc754c7c318d1bf010518 /convert
parentc45a060f3e2d7a46935f92397bf561cd56d3127f (diff)
btrfs-progs: convert: use bit field for convert flags
Use one flag field instead of several variables. The change cascades down to the callchain and modifies several functions. Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'convert')
-rw-r--r--convert/main.c65
-rw-r--r--convert/source-ext2.c27
-rw-r--r--convert/source-fs.h10
3 files changed, 58 insertions, 44 deletions
diff --git a/convert/main.c b/convert/main.c
index b2b24ae4..f5c560c4 100644
--- a/convert/main.c
+++ b/convert/main.c
@@ -74,11 +74,10 @@ static int after_copied_inodes(void *p)
}
static inline int copy_inodes(struct btrfs_convert_context *cctx,
- struct btrfs_root *root, int datacsum,
- int packing, int noxattr, struct task_ctx *p)
+ struct btrfs_root *root, u32 convert_flags,
+ struct task_ctx *p)
{
- return cctx->convert_ops->copy_inodes(cctx, root, datacsum, packing,
- noxattr, p);
+ return cctx->convert_ops->copy_inodes(cctx, root, convert_flags, p);
}
static inline void convert_close_fs(struct btrfs_convert_context *cctx)
@@ -125,7 +124,7 @@ static int create_image_file_range(struct btrfs_trans_handle *trans,
struct cache_tree *used,
struct btrfs_inode_item *inode,
u64 ino, u64 bytenr, u64 *ret_len,
- int datacsum)
+ u32 convert_flags)
{
struct cache_extent *cache;
struct btrfs_block_group_cache *bg_cache;
@@ -133,6 +132,7 @@ static int create_image_file_range(struct btrfs_trans_handle *trans,
u64 disk_bytenr;
int i;
int ret;
+ u32 datacsum = convert_flags & CONVERT_FLAG_DATACSUM;
if (bytenr != round_down(bytenr, root->sectorsize)) {
error("bytenr not sectorsize aligned: %llu",
@@ -259,7 +259,8 @@ static int migrate_one_reserved_range(struct btrfs_trans_handle *trans,
struct btrfs_root *root,
struct cache_tree *used,
struct btrfs_inode_item *inode, int fd,
- u64 ino, u64 start, u64 len, int datacsum)
+ u64 ino, u64 start, u64 len,
+ u32 convert_flags)
{
u64 cur_off = start;
u64 cur_len = len;
@@ -312,7 +313,7 @@ static int migrate_one_reserved_range(struct btrfs_trans_handle *trans,
if (ret < 0)
break;
/* Finally, insert csum items */
- if (datacsum)
+ if (convert_flags & CONVERT_FLAG_DATACSUM)
ret = csum_disk_extent(trans, root, key.objectid,
key.offset);
@@ -346,7 +347,7 @@ static int migrate_reserved_ranges(struct btrfs_trans_handle *trans,
struct btrfs_root *root,
struct cache_tree *used,
struct btrfs_inode_item *inode, int fd,
- u64 ino, u64 total_bytes, int datacsum)
+ u64 ino, u64 total_bytes, u32 convert_flags)
{
u64 cur_off;
u64 cur_len;
@@ -356,7 +357,7 @@ static int migrate_reserved_ranges(struct btrfs_trans_handle *trans,
cur_off = 0;
cur_len = 1024 * 1024;
ret = migrate_one_reserved_range(trans, root, used, inode, fd, ino,
- cur_off, cur_len, datacsum);
+ cur_off, cur_len, convert_flags);
if (ret < 0)
return ret;
@@ -366,7 +367,7 @@ static int migrate_reserved_ranges(struct btrfs_trans_handle *trans,
if (cur_off > total_bytes)
return ret;
ret = migrate_one_reserved_range(trans, root, used, inode, fd, ino,
- cur_off, cur_len, datacsum);
+ cur_off, cur_len, convert_flags);
if (ret < 0)
return ret;
@@ -376,7 +377,7 @@ static int migrate_reserved_ranges(struct btrfs_trans_handle *trans,
if (cur_off > total_bytes)
return ret;
ret = migrate_one_reserved_range(trans, root, used, inode, fd, ino,
- cur_off, cur_len, datacsum);
+ cur_off, cur_len, convert_flags);
return ret;
}
@@ -670,7 +671,7 @@ static int convert_read_used_space(struct btrfs_convert_context *cctx)
static int create_image(struct btrfs_root *root,
struct btrfs_mkfs_config *cfg,
struct btrfs_convert_context *cctx, int fd,
- u64 size, char *name, int datacsum)
+ u64 size, char *name, u32 convert_flags)
{
struct btrfs_inode_item buf;
struct btrfs_trans_handle *trans;
@@ -683,7 +684,7 @@ static int create_image(struct btrfs_root *root,
u64 flags = BTRFS_INODE_READONLY;
int ret;
- if (!datacsum)
+ if (!(convert_flags & CONVERT_FLAG_DATACSUM))
flags |= BTRFS_INODE_NODATASUM;
trans = btrfs_start_transaction(root, 1);
@@ -745,15 +746,15 @@ static int create_image(struct btrfs_root *root,
u64 len = size - cur;
ret = create_image_file_range(trans, root, &used_tmp,
- &buf, ino, cur, &len, datacsum);
+ &buf, ino, cur, &len,
+ convert_flags);
if (ret < 0)
goto out;
cur += len;
}
/* Handle the reserved ranges */
ret = migrate_reserved_ranges(trans, root, &cctx->used, &buf, fd, ino,
- cfg->num_bytes, datacsum);
-
+ cfg->num_bytes, convert_flags);
key.objectid = ino;
key.type = BTRFS_INODE_ITEM_KEY;
@@ -997,8 +998,7 @@ static int make_convert_data_block_groups(struct btrfs_trans_handle *trans,
* But the convert image subvolume is *NOT* linked to fs tree yet.
*/
static int init_btrfs(struct btrfs_mkfs_config *cfg, struct btrfs_root *root,
- struct btrfs_convert_context *cctx, int datacsum,
- int packing, int noxattr)
+ struct btrfs_convert_context *cctx, u32 convert_flags)
{
struct btrfs_key location;
struct btrfs_trans_handle *trans;
@@ -1166,9 +1166,8 @@ static int convert_open_fs(const char *devname,
return -1;
}
-static int do_convert(const char *devname, int datacsum, int packing,
- int noxattr, u32 nodesize, int copylabel, const char *fslabel,
- int progress, u64 features)
+static int do_convert(const char *devname, u32 convert_flags, u32 nodesize,
+ const char *fslabel, int progress, u64 features)
{
int ret;
int fd = -1;
@@ -1239,7 +1238,7 @@ static int do_convert(const char *devname, int datacsum, int packing,
error("unable to open ctree");
goto fail;
}
- ret = init_btrfs(&mkfs_cfg, root, &cctx, datacsum, packing, noxattr);
+ ret = init_btrfs(&mkfs_cfg, root, &cctx, convert_flags);
if (ret) {
error("unable to setup the root tree: %d", ret);
goto fail;
@@ -1257,7 +1256,8 @@ static int do_convert(const char *devname, int datacsum, int packing,
goto fail;
}
ret = create_image(image_root, &mkfs_cfg, &cctx, fd,
- mkfs_cfg.num_bytes, "image", datacsum);
+ mkfs_cfg.num_bytes, "image",
+ convert_flags);
if (ret) {
error("failed to create %s/image: %d", subvol_name, ret);
goto fail;
@@ -1272,7 +1272,7 @@ static int do_convert(const char *devname, int datacsum, int packing,
&ctx);
task_start(ctx.info);
}
- ret = copy_inodes(&cctx, root, datacsum, packing, noxattr, &ctx);
+ ret = copy_inodes(&cctx, root, convert_flags, &ctx);
if (ret) {
error("error during copy_inodes %d", ret);
goto fail;
@@ -1289,11 +1289,11 @@ static int do_convert(const char *devname, int datacsum, int packing,
}
memset(root->fs_info->super_copy->label, 0, BTRFS_LABEL_SIZE);
- if (copylabel == 1) {
+ if (convert_flags & CONVERT_FLAG_COPY_LABEL) {
__strncpy_null(root->fs_info->super_copy->label,
cctx.volume_name, BTRFS_LABEL_SIZE - 1);
printf("copy label '%s'\n", root->fs_info->super_copy->label);
- } else if (copylabel == -1) {
+ } else if (convert_flags & CONVERT_FLAG_SET_LABEL) {
strcpy(root->fs_info->super_copy->label, fslabel);
printf("set label to '%s'\n", fslabel);
}
@@ -1886,7 +1886,7 @@ int main(int argc, char *argv[])
rollback = 1;
break;
case 'l':
- copylabel = -1;
+ copylabel = CONVERT_FLAG_SET_LABEL;
if (strlen(optarg) >= BTRFS_LABEL_SIZE) {
warning(
"label too long, trimmed to %d bytes",
@@ -1895,7 +1895,7 @@ int main(int argc, char *argv[])
__strncpy_null(fslabel, optarg, BTRFS_LABEL_SIZE - 1);
break;
case 'L':
- copylabel = 1;
+ copylabel = CONVERT_FLAG_COPY_LABEL;
break;
case 'p':
progress = 1;
@@ -1968,8 +1968,13 @@ int main(int argc, char *argv[])
if (rollback) {
ret = do_rollback(file);
} else {
- ret = do_convert(file, datacsum, packing, noxattr, nodesize,
- copylabel, fslabel, progress, features);
+ u32 cf = 0;
+
+ cf |= datacsum ? CONVERT_FLAG_DATACSUM : 0;
+ cf |= packing ? CONVERT_FLAG_INLINE_DATA : 0;
+ cf |= noxattr ? 0 : CONVERT_FLAG_XATTR;
+ cf |= copylabel;
+ ret = do_convert(file, cf, nodesize, fslabel, progress, features);
}
if (ret)
return 1;
diff --git a/convert/source-ext2.c b/convert/source-ext2.c
index fb93fc77..cfafb3bf 100644
--- a/convert/source-ext2.c
+++ b/convert/source-ext2.c
@@ -282,7 +282,7 @@ static int ext2_create_file_extents(struct btrfs_trans_handle *trans,
struct btrfs_root *root, u64 objectid,
struct btrfs_inode_item *btrfs_inode,
ext2_filsys ext2_fs, ext2_ino_t ext2_ino,
- int datacsum, int packing)
+ u32 convert_flags)
{
int ret;
char *buffer = NULL;
@@ -293,7 +293,7 @@ static int ext2_create_file_extents(struct btrfs_trans_handle *trans,
struct blk_iterate_data data;
init_blk_iterate_data(&data, trans, root, btrfs_inode, objectid,
- datacsum);
+ convert_flags & CONVERT_FLAG_DATACSUM);
err = ext2fs_block_iterate2(ext2_fs, ext2_ino, BLOCK_FLAG_DATA_ONLY,
NULL, ext2_block_iterate_proc, &data);
@@ -302,8 +302,9 @@ static int ext2_create_file_extents(struct btrfs_trans_handle *trans,
ret = data.errcode;
if (ret)
goto fail;
- if (packing && data.first_block == 0 && data.num_blocks > 0 &&
- inode_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
+ if ((convert_flags & CONVERT_FLAG_INLINE_DATA) && data.first_block == 0
+ && data.num_blocks > 0
+ && inode_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
u64 num_bytes = data.num_blocks * sectorsize;
u64 disk_bytenr = data.disk_block * sectorsize;
u64 nbytes;
@@ -354,7 +355,9 @@ static int ext2_create_symbol_link(struct btrfs_trans_handle *trans,
if (ext2fs_inode_data_blocks(ext2_fs, ext2_inode)) {
btrfs_set_stack_inode_size(btrfs_inode, inode_size + 1);
ret = ext2_create_file_extents(trans, root, objectid,
- btrfs_inode, ext2_fs, ext2_ino, 1, 1);
+ btrfs_inode, ext2_fs, ext2_ino,
+ CONVERT_FLAG_DATACSUM |
+ CONVERT_FLAG_INLINE_DATA);
btrfs_set_stack_inode_size(btrfs_inode, inode_size);
return ret;
}
@@ -757,7 +760,7 @@ static int ext2_copy_single_inode(struct btrfs_trans_handle *trans,
struct btrfs_root *root, u64 objectid,
ext2_filsys ext2_fs, ext2_ino_t ext2_ino,
struct ext2_inode *ext2_inode,
- int datacsum, int packing, int noxattr)
+ u32 convert_flags)
{
int ret;
struct btrfs_inode_item btrfs_inode;
@@ -766,7 +769,8 @@ static int ext2_copy_single_inode(struct btrfs_trans_handle *trans,
return 0;
ext2_copy_inode_item(&btrfs_inode, ext2_inode, ext2_fs->blocksize);
- if (!datacsum && S_ISREG(ext2_inode->i_mode)) {
+ if (!(convert_flags & CONVERT_FLAG_DATACSUM)
+ && S_ISREG(ext2_inode->i_mode)) {
u32 flags = btrfs_stack_inode_flags(&btrfs_inode) |
BTRFS_INODE_NODATASUM;
btrfs_set_stack_inode_flags(&btrfs_inode, flags);
@@ -776,7 +780,7 @@ static int ext2_copy_single_inode(struct btrfs_trans_handle *trans,
switch (ext2_inode->i_mode & S_IFMT) {
case S_IFREG:
ret = ext2_create_file_extents(trans, root, objectid,
- &btrfs_inode, ext2_fs, ext2_ino, datacsum, packing);
+ &btrfs_inode, ext2_fs, ext2_ino, convert_flags);
break;
case S_IFDIR:
ret = ext2_create_dir_entries(trans, root, objectid,
@@ -793,7 +797,7 @@ static int ext2_copy_single_inode(struct btrfs_trans_handle *trans,
if (ret)
return ret;
- if (!noxattr) {
+ if (convert_flags & CONVERT_FLAG_XATTR) {
ret = ext2_copy_extended_attrs(trans, root, objectid,
&btrfs_inode, ext2_fs, ext2_ino);
if (ret)
@@ -814,7 +818,7 @@ static int ext2_is_special_inode(ext2_ino_t ino)
*/
static int ext2_copy_inodes(struct btrfs_convert_context *cctx,
struct btrfs_root *root,
- int datacsum, int packing, int noxattr, struct task_ctx *p)
+ u32 convert_flags, struct task_ctx *p)
{
ext2_filsys ext2_fs = cctx->fs_data;
int ret;
@@ -843,8 +847,7 @@ static int ext2_copy_inodes(struct btrfs_convert_context *cctx,
objectid = ext2_ino + INO_OFFSET;
ret = ext2_copy_single_inode(trans, root,
objectid, ext2_fs, ext2_ino,
- &ext2_inode, datacsum, packing,
- noxattr);
+ &ext2_inode, convert_flags);
p->cur_copy_inodes++;
if (ret)
return ret;
diff --git a/convert/source-fs.h b/convert/source-fs.h
index 3ee429af..f3f96d07 100644
--- a/convert/source-fs.h
+++ b/convert/source-fs.h
@@ -33,13 +33,19 @@ struct btrfs_convert_context;
#define SOURCE_FS_NAME_LEN (16)
+#define CONVERT_FLAG_DATACSUM (1U << 0)
+#define CONVERT_FLAG_INLINE_DATA (1U << 1)
+#define CONVERT_FLAG_XATTR (1U << 2)
+#define CONVERT_FLAG_COPY_LABEL (1U << 3)
+#define CONVERT_FLAG_SET_LABEL (1U << 4)
+
struct btrfs_convert_operations {
const char name[SOURCE_FS_NAME_LEN];
int (*open_fs)(struct btrfs_convert_context *cctx, const char *devname);
int (*read_used_space)(struct btrfs_convert_context *cctx);
int (*copy_inodes)(struct btrfs_convert_context *cctx,
- struct btrfs_root *root, int datacsum,
- int packing, int noxattr, struct task_ctx *p);
+ struct btrfs_root *root, u32 covert_flags,
+ struct task_ctx *p);
void (*close_fs)(struct btrfs_convert_context *cctx);
int (*check_state)(struct btrfs_convert_context *cctx);
};