summaryrefslogtreecommitdiff
path: root/mkfs.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-03-20 14:38:32 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2007-03-20 14:38:32 -0400
commit099f1ae6e49f844be2acb6316357d1466defb723 (patch)
treef699a0a3d758e211bc546488714ce9a4b749c773 /mkfs.c
parent80fd690aa6ee4e9a321d20df09b4bf018b0e18b2 (diff)
Add inode map, and the start of file extent items
Diffstat (limited to 'mkfs.c')
-rw-r--r--mkfs.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/mkfs.c b/mkfs.c
index 9aa90081..1cac5ab1 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -42,7 +42,7 @@ int mkfs(int fd, u64 num_blocks, u32 blocksize)
btrfs_set_header_parentid(&empty_leaf->header,
BTRFS_ROOT_TREE_OBJECTID);
btrfs_set_header_blocknr(&empty_leaf->header, start_block + 1);
- btrfs_set_header_nritems(&empty_leaf->header, 2);
+ btrfs_set_header_nritems(&empty_leaf->header, 3);
/* create the items for the root tree */
btrfs_set_root_blocknr(&root_item, start_block + 2);
@@ -61,17 +61,25 @@ int mkfs(int fd, u64 num_blocks, u32 blocksize)
btrfs_set_root_blocknr(&root_item, start_block + 3);
itemoff = itemoff - sizeof(root_item);
btrfs_set_item_offset(&item, itemoff);
- btrfs_set_disk_key_objectid(&item.key, BTRFS_FS_TREE_OBJECTID);
+ btrfs_set_disk_key_objectid(&item.key, BTRFS_INODE_MAP_OBJECTID);
memcpy(empty_leaf->items + 1, &item, sizeof(item));
memcpy(btrfs_leaf_data(empty_leaf) + itemoff,
&root_item, sizeof(root_item));
+
+ btrfs_set_root_blocknr(&root_item, start_block + 4);
+ itemoff = itemoff - sizeof(root_item);
+ btrfs_set_item_offset(&item, itemoff);
+ btrfs_set_disk_key_objectid(&item.key, BTRFS_FS_TREE_OBJECTID);
+ memcpy(empty_leaf->items + 2, &item, sizeof(item));
+ memcpy(btrfs_leaf_data(empty_leaf) + itemoff,
+ &root_item, sizeof(root_item));
ret = pwrite(fd, empty_leaf, blocksize, (start_block + 1) * blocksize);
/* create the items for the extent tree */
btrfs_set_header_parentid(&empty_leaf->header,
BTRFS_EXTENT_TREE_OBJECTID);
btrfs_set_header_blocknr(&empty_leaf->header, start_block + 2);
- btrfs_set_header_nritems(&empty_leaf->header, 4);
+ btrfs_set_header_nritems(&empty_leaf->header, 5);
/* item1, reserve blocks 0-16 */
btrfs_set_disk_key_objectid(&item.key, 0);
@@ -108,12 +116,12 @@ int mkfs(int fd, u64 num_blocks, u32 blocksize)
memcpy(btrfs_leaf_data(empty_leaf) + btrfs_item_offset(&item),
&extent_item, btrfs_item_size(&item));
- /* item4, give block 19 to the FS root */
+ /* item4, give block 19 to the inode map */
btrfs_set_disk_key_objectid(&item.key, start_block + 3);
btrfs_set_disk_key_offset(&item.key, 1);
itemoff = itemoff - sizeof(struct btrfs_extent_item);
btrfs_set_item_offset(&item, itemoff);
- btrfs_set_extent_owner(&extent_item, BTRFS_FS_TREE_OBJECTID);
+ btrfs_set_extent_owner(&extent_item, BTRFS_INODE_MAP_OBJECTID);
memcpy(empty_leaf->items + 3, &item, sizeof(item));
memcpy(btrfs_leaf_data(empty_leaf) + btrfs_item_offset(&item),
&extent_item, btrfs_item_size(&item));
@@ -121,12 +129,34 @@ int mkfs(int fd, u64 num_blocks, u32 blocksize)
if (ret != blocksize)
return -1;
- /* finally create the FS root */
- btrfs_set_header_parentid(&empty_leaf->header, BTRFS_FS_TREE_OBJECTID);
+ /* item5, give block 20 to the FS root */
+ btrfs_set_disk_key_objectid(&item.key, start_block + 4);
+ btrfs_set_disk_key_offset(&item.key, 1);
+ itemoff = itemoff - sizeof(struct btrfs_extent_item);
+ btrfs_set_item_offset(&item, itemoff);
+ btrfs_set_extent_owner(&extent_item, BTRFS_FS_TREE_OBJECTID);
+ memcpy(empty_leaf->items + 4, &item, sizeof(item));
+ memcpy(btrfs_leaf_data(empty_leaf) + btrfs_item_offset(&item),
+ &extent_item, btrfs_item_size(&item));
+ ret = pwrite(fd, empty_leaf, blocksize, (start_block + 2) * blocksize);
+ if (ret != blocksize)
+ return -1;
+
+ /* create the inode map */
+ btrfs_set_header_parentid(&empty_leaf->header,
+ BTRFS_INODE_MAP_OBJECTID);
btrfs_set_header_blocknr(&empty_leaf->header, start_block + 3);
btrfs_set_header_nritems(&empty_leaf->header, 0);
ret = pwrite(fd, empty_leaf, blocksize, (start_block + 3) * blocksize);
if (ret != blocksize)
return -1;
+
+ /* finally create the FS root */
+ btrfs_set_header_parentid(&empty_leaf->header, BTRFS_FS_TREE_OBJECTID);
+ btrfs_set_header_blocknr(&empty_leaf->header, start_block + 4);
+ btrfs_set_header_nritems(&empty_leaf->header, 0);
+ ret = pwrite(fd, empty_leaf, blocksize, (start_block + 4) * blocksize);
+ if (ret != blocksize)
+ return -1;
return 0;
}