btrfs-progs support for root block accounting
authorJosef Bacik <jbacik@redhat.com>
Wed, 29 Aug 2007 19:56:44 +0000 (15:56 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Wed, 29 Aug 2007 19:56:44 +0000 (15:56 -0400)
This adds support for keeping track of the number of blocks used by
root_item's.  This makes it so that mkfs lays down the "default" subvol with
the correct block accounting in place.  Thank you,

ctree.h
extent-tree.c
mkfs.c

diff --git a/ctree.h b/ctree.h
index fc84de3..7be96c4 100644 (file)
--- a/ctree.h
+++ b/ctree.h
@@ -784,6 +784,17 @@ static inline void btrfs_set_root_flags(struct btrfs_root_item *item, u32 val)
        item->flags = cpu_to_le32(val);
 }
 
+static inline void btrfs_set_root_blocks_used(struct btrfs_root_item *item,
+                                             u64 val)
+{
+       item->blocks_used = cpu_to_le64(val);
+}
+
+static inline u64 btrfs_root_blocks_used(struct btrfs_root_item *item)
+{
+       return le64_to_cpu(item->blocks_used);
+}
+
 static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s)
 {
        return le64_to_cpu(s->blocknr);
index 466ed20..8b91df5 100644 (file)
@@ -252,7 +252,7 @@ static int finish_current_insert(struct btrfs_trans_handle *trans, struct
        struct btrfs_extent_item extent_item;
        int i;
        int ret;
-       u64 super_blocks_used;
+       u64 super_blocks_used, root_blocks_used;
        struct btrfs_fs_info *info = extent_root->fs_info;
 
        btrfs_set_extent_refs(&extent_item, 1);
@@ -267,6 +267,9 @@ static int finish_current_insert(struct btrfs_trans_handle *trans, struct
                super_blocks_used = btrfs_super_blocks_used(info->disk_super);
                btrfs_set_super_blocks_used(info->disk_super,
                                            super_blocks_used + 1);
+               root_blocks_used = btrfs_root_blocks_used(&extent_root->root_item);
+               btrfs_set_root_blocks_used(&extent_root->root_item,
+                                          root_blocks_used + 1);
                ret = btrfs_insert_item(trans, extent_root, &ins, &extent_item,
                                        sizeof(extent_item));
                if (ret) {
@@ -314,7 +317,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
        refs = btrfs_extent_refs(ei) - 1;
        btrfs_set_extent_refs(ei, refs);
        if (refs == 0) {
-               u64 super_blocks_used;
+               u64 super_blocks_used, root_blocks_used;
                if (pin) {
                        int err;
                        unsigned long bl = blocknr;
@@ -327,6 +330,10 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
                super_blocks_used = btrfs_super_blocks_used(info->disk_super);
                btrfs_set_super_blocks_used(info->disk_super,
                                            super_blocks_used - num_blocks);
+               root_blocks_used = btrfs_root_blocks_used(&root->root_item);
+               btrfs_set_root_blocks_used(&root->root_item,
+                                          root_blocks_used - num_blocks);
+
                ret = btrfs_del_item(trans, extent_root, &path);
                if (!pin && extent_root->fs_info->last_insert.objectid >
                    blocknr)
@@ -527,7 +534,7 @@ static int alloc_extent(struct btrfs_trans_handle *trans, struct btrfs_root
 {
        int ret;
        int pending_ret;
-       u64 super_blocks_used;
+       u64 super_blocks_used, root_blocks_used;
        struct btrfs_fs_info *info = root->fs_info;
        struct btrfs_root *extent_root = info->extent_root;
        struct btrfs_extent_item extent_item;
@@ -553,6 +560,10 @@ static int alloc_extent(struct btrfs_trans_handle *trans, struct btrfs_root
        super_blocks_used = btrfs_super_blocks_used(info->disk_super);
        btrfs_set_super_blocks_used(info->disk_super, super_blocks_used +
                                    num_blocks);
+       root_blocks_used = btrfs_root_blocks_used(&root->root_item);
+       btrfs_set_root_blocks_used(&root->root_item, root_blocks_used +
+                                  num_blocks);
+
        ret = btrfs_insert_item(trans, extent_root, ins, &extent_item,
                                sizeof(extent_item));
 
diff --git a/mkfs.c b/mkfs.c
index bd66467..c7de6df 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -166,7 +166,7 @@ static int make_root_dir(int fd) {
        memcpy(&location, &root->fs_info->fs_root->root_key, sizeof(location));
        location.offset = (u64)-1;
        ret = btrfs_insert_dir_item(trans, root->fs_info->tree_root,
-                       "default", strlen("default"),
+                       "default", 7,
                        btrfs_super_root_dir(root->fs_info->disk_super),
                        &location, BTRFS_FT_DIR);
        if (ret)
@@ -242,6 +242,7 @@ int mkfs(int fd, char *pathname, u64 num_blocks, u32 blocksize)
                &root_item, sizeof(root_item));
 
        btrfs_set_root_blocknr(&root_item, start_block + 3);
+       btrfs_set_root_blocks_used(&root_item, 1);
        itemoff = itemoff - sizeof(root_item);
        btrfs_set_item_offset(&item, itemoff);
        btrfs_set_disk_key_objectid(&item.key, BTRFS_FS_TREE_OBJECTID);