linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] btrfs-progs: Make the process of create root tree to a function
@ 2017-08-25  7:23 Gu Jinxiang
  2017-09-04 16:47 ` David Sterba
  0 siblings, 1 reply; 2+ messages in thread
From: Gu Jinxiang @ 2017-08-25  7:23 UTC (permalink / raw)
  To: linux-btrfs

make_btrfs is too long to understand, make creatation of root tree
in a function.

Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
---
 mkfs/common.c | 136 +++++++++++++++++++++++++++-------------------------------
 1 file changed, 64 insertions(+), 72 deletions(-)

diff --git a/mkfs/common.c b/mkfs/common.c
index 7d482c2..78297fa 100644
--- a/mkfs/common.c
+++ b/mkfs/common.c
@@ -34,6 +34,68 @@ static u64 reference_root_table[] = {
 	[6] =	BTRFS_CSUM_TREE_OBJECTID,
 };
 
+static int btrfs_create_root_tree(int fd, struct btrfs_mkfs_config *cfg,
+			struct extent_buffer *buf)
+{
+	struct btrfs_root_item root_item;
+	struct btrfs_inode_item *inode_item;
+	struct btrfs_disk_key disk_key;
+	u32 nritems = 0;
+	u32 itemoff = 0;
+	int ret = 0;
+	int blk = 0;
+
+	memset(buf->data + sizeof(struct btrfs_header), 0,
+		cfg->nodesize - sizeof(struct btrfs_header));
+	memset(&root_item, 0, sizeof(root_item));
+	memset(&disk_key, 0, sizeof(disk_key));
+
+	/* create the items for the root tree */
+	inode_item = &root_item.inode;
+	btrfs_set_stack_inode_generation(inode_item, 1);
+	btrfs_set_stack_inode_size(inode_item, 3);
+	btrfs_set_stack_inode_nlink(inode_item, 1);
+	btrfs_set_stack_inode_nbytes(inode_item, cfg->nodesize);
+	btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755);
+	btrfs_set_root_refs(&root_item, 1);
+	btrfs_set_root_used(&root_item, cfg->nodesize);
+	btrfs_set_root_generation(&root_item, 1);
+
+	btrfs_set_disk_key_type(&disk_key, BTRFS_ROOT_ITEM_KEY);
+	btrfs_set_disk_key_offset(&disk_key, 0);
+	itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) - sizeof(root_item);
+
+	for (blk = 0; blk < MKFS_BLOCK_COUNT; blk++) {
+		if (blk == MKFS_SUPER_BLOCK
+			|| blk == MKFS_ROOT_TREE
+			|| blk == MKFS_CHUNK_TREE)
+			continue;
+
+		btrfs_set_root_bytenr(&root_item, cfg->blocks[blk]);
+		btrfs_set_disk_key_objectid(&disk_key,
+			reference_root_table[blk]);
+		btrfs_set_item_key(buf, &disk_key, nritems);
+		btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
+		btrfs_set_item_size(buf, btrfs_item_nr(nritems),
+				sizeof(root_item));
+		write_extent_buffer(buf, &root_item,
+			btrfs_item_ptr_offset(buf, nritems),
+			sizeof(root_item));
+		nritems++;
+		itemoff = itemoff - sizeof(root_item);
+	}
+
+	/* generate checksum */
+	csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
+
+	/* write back root tree */
+	ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_ROOT_TREE]);
+	if (ret != cfg->nodesize)
+		return (ret < 0 ? -errno : -EIO);
+
+	return ret;
+}
+
 /*
  * @fs_uuid - if NULL, generates a UUID, returns back the new filesystem UUID
  *
@@ -44,10 +106,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
 {
 	struct btrfs_super_block super;
 	struct extent_buffer *buf;
-	struct btrfs_root_item root_item;
 	struct btrfs_disk_key disk_key;
 	struct btrfs_extent_item *extent_item;
-	struct btrfs_inode_item *inode_item;
 	struct btrfs_chunk *chunk;
 	struct btrfs_dev_item *dev_item;
 	struct btrfs_dev_extent *dev_extent;
@@ -133,77 +193,9 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
 			    btrfs_header_chunk_tree_uuid(buf),
 			    BTRFS_UUID_SIZE);
 
-	/* create the items for the root tree */
-	memset(&root_item, 0, sizeof(root_item));
-	inode_item = &root_item.inode;
-	btrfs_set_stack_inode_generation(inode_item, 1);
-	btrfs_set_stack_inode_size(inode_item, 3);
-	btrfs_set_stack_inode_nlink(inode_item, 1);
-	btrfs_set_stack_inode_nbytes(inode_item, cfg->nodesize);
-	btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755);
-	btrfs_set_root_refs(&root_item, 1);
-	btrfs_set_root_used(&root_item, cfg->nodesize);
-	btrfs_set_root_generation(&root_item, 1);
-
-	memset(&disk_key, 0, sizeof(disk_key));
-	btrfs_set_disk_key_type(&disk_key, BTRFS_ROOT_ITEM_KEY);
-	btrfs_set_disk_key_offset(&disk_key, 0);
-	nritems = 0;
-
-	itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) - sizeof(root_item);
-	btrfs_set_root_bytenr(&root_item, cfg->blocks[MKFS_EXTENT_TREE]);
-	btrfs_set_disk_key_objectid(&disk_key, BTRFS_EXTENT_TREE_OBJECTID);
-	btrfs_set_item_key(buf, &disk_key, nritems);
-	btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
-	btrfs_set_item_size(buf, btrfs_item_nr(nritems),
-			    sizeof(root_item));
-	write_extent_buffer(buf, &root_item, btrfs_item_ptr_offset(buf,
-			    nritems), sizeof(root_item));
-	nritems++;
-
-	itemoff = itemoff - sizeof(root_item);
-	btrfs_set_root_bytenr(&root_item, cfg->blocks[MKFS_DEV_TREE]);
-	btrfs_set_disk_key_objectid(&disk_key, BTRFS_DEV_TREE_OBJECTID);
-	btrfs_set_item_key(buf, &disk_key, nritems);
-	btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
-	btrfs_set_item_size(buf, btrfs_item_nr(nritems),
-			    sizeof(root_item));
-	write_extent_buffer(buf, &root_item,
-			    btrfs_item_ptr_offset(buf, nritems),
-			    sizeof(root_item));
-	nritems++;
-
-	itemoff = itemoff - sizeof(root_item);
-	btrfs_set_root_bytenr(&root_item, cfg->blocks[MKFS_FS_TREE]);
-	btrfs_set_disk_key_objectid(&disk_key, BTRFS_FS_TREE_OBJECTID);
-	btrfs_set_item_key(buf, &disk_key, nritems);
-	btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
-	btrfs_set_item_size(buf, btrfs_item_nr(nritems),
-			    sizeof(root_item));
-	write_extent_buffer(buf, &root_item,
-			    btrfs_item_ptr_offset(buf, nritems),
-			    sizeof(root_item));
-	nritems++;
-
-	itemoff = itemoff - sizeof(root_item);
-	btrfs_set_root_bytenr(&root_item, cfg->blocks[MKFS_CSUM_TREE]);
-	btrfs_set_disk_key_objectid(&disk_key, BTRFS_CSUM_TREE_OBJECTID);
-	btrfs_set_item_key(buf, &disk_key, nritems);
-	btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
-	btrfs_set_item_size(buf, btrfs_item_nr(nritems),
-			    sizeof(root_item));
-	write_extent_buffer(buf, &root_item,
-			    btrfs_item_ptr_offset(buf, nritems),
-			    sizeof(root_item));
-	nritems++;
-
-
-	csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
-	ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_ROOT_TREE]);
-	if (ret != cfg->nodesize) {
-		ret = (ret < 0 ? -errno : -EIO);
+	ret = btrfs_create_root_tree(fd, cfg, buf);
+	if (ret < 0)
 		goto out;
-	}
 
 	/* create the items for the extent tree */
 	memset(buf->data + sizeof(struct btrfs_header), 0,
-- 
1.9.1




^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-09-04 16:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-08-25  7:23 [PATCH] btrfs-progs: Make the process of create root tree to a function Gu Jinxiang
2017-09-04 16:47 ` David Sterba

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).