File 2007-btrfs-convert-factor-out-adding-dirent-into-convert.patch of Package btrfsprogs.356

From: Jeff Mahoney <jeffm@suse.com>
Subject: btrfs-convert: factor out adding dirent into convert_insert_dirent

Adding a dirent consists of multiple steps that will need to be taken
by any converter.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
 btrfs-convert.c |   61 +++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 24 deletions(-)

--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -296,6 +296,34 @@ static struct btrfs_extent_ops extent_op
 	.free_extent = custom_free_extent,
 };
 
+static int convert_insert_dirent(struct btrfs_trans_handle *trans,
+				 struct btrfs_root *root,
+				 const char *name, size_t name_len,
+				 u64 dir, u64 objectid,
+				 u8 file_type, u64 index_cnt,
+				 struct btrfs_inode_item *inode)
+{
+	int ret;
+	u64 inode_size;
+	struct btrfs_key location = {
+		.objectid = objectid,
+		.offset = 0,
+		.type = BTRFS_INODE_ITEM_KEY,
+	};
+
+	ret = btrfs_insert_dir_item(trans, root, name, name_len,
+				    dir, &location, file_type, index_cnt);
+	if (ret)
+		return ret;
+	ret = btrfs_insert_inode_ref(trans, root, name, name_len,
+				     objectid, dir, index_cnt);
+	if (ret)
+		return ret;
+	inode_size = btrfs_stack_inode_size(inode) + name_len * 2;
+	btrfs_set_stack_inode_size(inode, inode_size);
+	return 0;
+}
+
 struct dir_iterate_data {
 	struct btrfs_trans_handle *trans;
 	struct btrfs_root *root;
@@ -325,9 +353,7 @@ static int dir_iterate_proc(ext2_ino_t d
 	int ret;
 	int file_type;
 	u64 objectid;
-        u64 inode_size;
 	char dotdot[] = "..";
-	struct btrfs_key location;
 	struct dir_iterate_data *idata = (struct dir_iterate_data *)priv_data;
 	int name_len;
 
@@ -344,33 +370,20 @@ static int dir_iterate_proc(ext2_ino_t d
 	if (dirent->inode < EXT2_GOOD_OLD_FIRST_INO)
 		return 0;
 
-	location.objectid = objectid;
-	location.offset = 0;
-	btrfs_set_key_type(&location, BTRFS_INODE_ITEM_KEY);
-
 	file_type = dirent->name_len >> 8;
 	BUG_ON(file_type > EXT2_FT_SYMLINK);
-	ret = btrfs_insert_dir_item(idata->trans, idata->root,
-				    dirent->name, name_len,
-				    idata->objectid, &location,
+
+	ret = convert_insert_dirent(idata->trans, idata->root, dirent->name,
+				    name_len, idata->objectid, objectid,
 				    filetype_conversion_table[file_type],
-				    idata->index_cnt);
-	if (ret)
-		goto fail;
-	ret = btrfs_insert_inode_ref(idata->trans, idata->root,
-				     dirent->name, name_len,
-				     objectid, idata->objectid,
-				     idata->index_cnt);
-	if (ret)
-		goto fail;
+				    idata->index_cnt, idata->inode);
+	if (ret < 0) {
+		idata->errcode = ret;
+		return BLOCK_ABORT;
+	}
+
 	idata->index_cnt++;
-	inode_size = btrfs_stack_inode_size(idata->inode) +
-		     name_len * 2;
-	btrfs_set_stack_inode_size(idata->inode, inode_size);
 	return 0;
-fail:
-	idata->errcode = ret;
-	return BLOCK_ABORT;
 }
 
 static int create_dir_entries(struct btrfs_trans_handle *trans,
openSUSE Build Service is sponsored by