Btrfs: Add inode map, and the start of file extent items
[safe/jmp/linux-2.6] / fs / btrfs / mkfs.c
index 9aa9008..1cac5ab 100644 (file)
@@ -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;
 }