summaryrefslogtreecommitdiff
path: root/mkfs/common.c
diff options
context:
space:
mode:
authorDimitri John Ledkov <xnox@ubuntu.com>2017-10-18 13:15:59 +0100
committerDimitri John Ledkov <xnox@ubuntu.com>2017-10-18 13:15:59 +0100
commit74d288e05c2d0cb97186f51049813b3e5b5bb0cd (patch)
tree4fc213398dc89e053d53ff7d42102942470e9cb5 /mkfs/common.c
parent569a646293cd782de7665b6158514f3b48d229d3 (diff)
New upstream release.
Diffstat (limited to 'mkfs/common.c')
-rw-r--r--mkfs/common.c174
1 files changed, 83 insertions, 91 deletions
diff --git a/mkfs/common.c b/mkfs/common.c
index e4785c58..c9ce10d4 100644
--- a/mkfs/common.c
+++ b/mkfs/common.c
@@ -34,6 +34,67 @@ static u64 reference_root_table[] = {
[6] = BTRFS_CSUM_TREE_OBJECTID,
};
+static int btrfs_create_tree_root(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;
+ int ret = 0;
+ int blk;
+
+ 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 -= 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 +105,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;
@@ -93,18 +152,18 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
uuid_generate(super.dev_item.uuid);
uuid_generate(chunk_tree_uuid);
- cfg->blocks[0] = BTRFS_SUPER_INFO_OFFSET;
- for (i = 1; i < 7; i++) {
- cfg->blocks[i] = BTRFS_SUPER_INFO_OFFSET + 1024 * 1024 +
+ cfg->blocks[MKFS_SUPER_BLOCK] = BTRFS_SUPER_INFO_OFFSET;
+ for (i = 1; i < MKFS_BLOCK_COUNT; i++) {
+ cfg->blocks[i] = BTRFS_SUPER_INFO_OFFSET + SZ_1M +
cfg->nodesize * i;
}
- btrfs_set_super_bytenr(&super, cfg->blocks[0]);
+ btrfs_set_super_bytenr(&super, cfg->blocks[MKFS_SUPER_BLOCK]);
btrfs_set_super_num_devices(&super, 1);
btrfs_set_super_magic(&super, BTRFS_MAGIC_PARTIAL);
btrfs_set_super_generation(&super, 1);
- btrfs_set_super_root(&super, cfg->blocks[1]);
- btrfs_set_super_chunk_root(&super, cfg->blocks[3]);
+ btrfs_set_super_root(&super, cfg->blocks[MKFS_ROOT_TREE]);
+ btrfs_set_super_chunk_root(&super, cfg->blocks[MKFS_CHUNK_TREE]);
btrfs_set_super_total_bytes(&super, num_bytes);
btrfs_set_super_bytes_used(&super, 6 * cfg->nodesize);
btrfs_set_super_sectorsize(&super, cfg->sectorsize);
@@ -121,7 +180,7 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
/* create the tree of root objects */
memset(buf->data, 0, cfg->nodesize);
buf->len = cfg->nodesize;
- btrfs_set_header_bytenr(buf, cfg->blocks[1]);
+ btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_ROOT_TREE]);
btrfs_set_header_nritems(buf, 4);
btrfs_set_header_generation(buf, 1);
btrfs_set_header_backref_rev(buf, BTRFS_MIXED_BACKREF_REV);
@@ -133,84 +192,16 @@ 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[2]);
- 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[4]);
- 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[5]);
- 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[6]);
- 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[1]);
- if (ret != cfg->nodesize) {
- ret = (ret < 0 ? -errno : -EIO);
+ ret = btrfs_create_tree_root(fd, cfg, buf);
+ if (ret < 0)
goto out;
- }
/* create the items for the extent tree */
memset(buf->data + sizeof(struct btrfs_header), 0,
cfg->nodesize - sizeof(struct btrfs_header));
nritems = 0;
itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize);
- for (i = 1; i < 7; i++) {
+ for (i = 1; i < MKFS_BLOCK_COUNT; i++) {
item_size = sizeof(struct btrfs_extent_item);
if (!skinny_metadata)
item_size += sizeof(struct btrfs_tree_block_info);
@@ -267,11 +258,11 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
btrfs_set_item_size(buf, btrfs_item_nr(nritems), 0);
nritems++;
}
- btrfs_set_header_bytenr(buf, cfg->blocks[2]);
+ btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_EXTENT_TREE]);
btrfs_set_header_owner(buf, BTRFS_EXTENT_TREE_OBJECTID);
btrfs_set_header_nritems(buf, nritems);
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
- ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[2]);
+ ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_EXTENT_TREE]);
if (ret != cfg->nodesize) {
ret = (ret < 0 ? -errno : -EIO);
goto out;
@@ -354,11 +345,11 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
ptr += item_size;
btrfs_set_super_sys_array_size(&super, array_size);
- btrfs_set_header_bytenr(buf, cfg->blocks[3]);
+ btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_CHUNK_TREE]);
btrfs_set_header_owner(buf, BTRFS_CHUNK_TREE_OBJECTID);
btrfs_set_header_nritems(buf, nritems);
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
- ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[3]);
+ ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_CHUNK_TREE]);
if (ret != cfg->nodesize) {
ret = (ret < 0 ? -errno : -EIO);
goto out;
@@ -393,11 +384,11 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
BTRFS_MKFS_SYSTEM_GROUP_SIZE);
nritems++;
- btrfs_set_header_bytenr(buf, cfg->blocks[4]);
+ btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_DEV_TREE]);
btrfs_set_header_owner(buf, BTRFS_DEV_TREE_OBJECTID);
btrfs_set_header_nritems(buf, nritems);
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
- ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[4]);
+ ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_DEV_TREE]);
if (ret != cfg->nodesize) {
ret = (ret < 0 ? -errno : -EIO);
goto out;
@@ -406,11 +397,11 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
/* create the FS root */
memset(buf->data + sizeof(struct btrfs_header), 0,
cfg->nodesize - sizeof(struct btrfs_header));
- btrfs_set_header_bytenr(buf, cfg->blocks[5]);
+ btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_FS_TREE]);
btrfs_set_header_owner(buf, BTRFS_FS_TREE_OBJECTID);
btrfs_set_header_nritems(buf, 0);
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
- ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[5]);
+ ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_FS_TREE]);
if (ret != cfg->nodesize) {
ret = (ret < 0 ? -errno : -EIO);
goto out;
@@ -418,11 +409,11 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
/* finally create the csum root */
memset(buf->data + sizeof(struct btrfs_header), 0,
cfg->nodesize - sizeof(struct btrfs_header));
- btrfs_set_header_bytenr(buf, cfg->blocks[6]);
+ btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_CSUM_TREE]);
btrfs_set_header_owner(buf, BTRFS_CSUM_TREE_OBJECTID);
btrfs_set_header_nritems(buf, 0);
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
- ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[6]);
+ ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_CSUM_TREE]);
if (ret != cfg->nodesize) {
ret = (ret < 0 ? -errno : -EIO);
goto out;
@@ -433,7 +424,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
memcpy(buf->data, &super, sizeof(super));
buf->len = BTRFS_SUPER_INFO_SIZE;
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
- ret = pwrite(fd, buf->data, BTRFS_SUPER_INFO_SIZE, cfg->blocks[0]);
+ ret = pwrite(fd, buf->data, BTRFS_SUPER_INFO_SIZE,
+ cfg->blocks[MKFS_SUPER_BLOCK]);
if (ret != BTRFS_SUPER_INFO_SIZE) {
ret = (ret < 0 ? -errno : -EIO);
goto out;