btrfs-progs new dir index support
authorJosef Bacik <jbacik@redhat.com>
Thu, 24 Jul 2008 16:13:32 +0000 (12:13 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Thu, 24 Jul 2008 16:13:32 +0000 (12:13 -0400)
ctree.h
inode-item.c
mkfs.c
print-tree.c
utils.c

diff --git a/ctree.h b/ctree.h
index a5a284c..d6467f6 100644 (file)
--- a/ctree.h
+++ b/ctree.h
@@ -349,6 +349,7 @@ struct btrfs_dev_extent {
 } __attribute__ ((__packed__));
 
 struct btrfs_inode_ref {
+       __le64 index;
        __le16 name_len;
        /* name goes here */
 } __attribute__ ((__packed__));
@@ -795,6 +796,7 @@ BTRFS_SETGET_STACK_FUNCS(block_group_flags,
 
 /* struct btrfs_inode_ref */
 BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
+BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64);
 
 /* struct btrfs_inode_item */
 BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
@@ -1461,7 +1463,7 @@ int btrfs_find_highest_inode(struct btrfs_root *fs_root, u64 *objectid);
 int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
                           struct btrfs_root *root,
                           const char *name, int name_len,
-                          u64 inode_objectid, u64 ref_objectid);
+                          u64 inode_objectid, u64 ref_objectid, u64 index);
 int btrfs_del_inode_ref(struct btrfs_trans_handle *trans,
                           struct btrfs_root *root,
                           const char *name, int name_len,
index 706cfce..28865f7 100644 (file)
@@ -106,7 +106,7 @@ out:
 int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
                           struct btrfs_root *root,
                           const char *name, int name_len,
-                          u64 inode_objectid, u64 ref_objectid)
+                          u64 inode_objectid, u64 ref_objectid, u64 index)
 {
        struct btrfs_path *path;
        struct btrfs_key key;
@@ -138,6 +138,7 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
                                     struct btrfs_inode_ref);
                ref = (struct btrfs_inode_ref *)((unsigned long)ref + old_size);
                btrfs_set_inode_ref_name_len(path->nodes[0], ref, name_len);
+               btrfs_set_inode_ref_index(path->nodes[0], ref, index);
                ptr = (unsigned long)(ref + 1);
                ret = 0;
        } else if (ret < 0) {
@@ -146,6 +147,7 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
                ref = btrfs_item_ptr(path->nodes[0], path->slots[0],
                                     struct btrfs_inode_ref);
                btrfs_set_inode_ref_name_len(path->nodes[0], ref, name_len);
+               btrfs_set_inode_ref_index(path->nodes[0], ref, index);
                ptr = (unsigned long)(ref + 1);
        }
        write_extent_buffer(path->nodes[0], name, ptr, name_len);
diff --git a/mkfs.c b/mkfs.c
index 6edc4c6..8d7071e 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -138,7 +138,7 @@ static int make_root_dir(int fd, const char *device_name) {
 
        ret = btrfs_insert_inode_ref(trans, root->fs_info->tree_root,
                             "default", 7, location.objectid,
-                            BTRFS_ROOT_TREE_DIR_OBJECTID);
+                            BTRFS_ROOT_TREE_DIR_OBJECTID, 0);
        if (ret)
                goto err;
 
index dd4fcf1..5914a6a 100644 (file)
@@ -61,14 +61,16 @@ static int print_inode_ref_item(struct extent_buffer *eb, struct btrfs_item *ite
        u32 cur = 0;
        u32 len;
        u32 name_len;
+       u64 index;
        char namebuf[BTRFS_NAME_LEN];
        total = btrfs_item_size(eb, item);
        while(cur < total) {
                name_len = btrfs_inode_ref_name_len(eb, ref);
+               index = btrfs_inode_ref_index(eb, ref);
                len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
                read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
-               printf("\t\tinode ref namelen %u name: %.*s\n",
-                      name_len, len, namebuf);
+               printf("\t\tinode ref index %llu namelen %u name: %.*s\n",
+                      index, name_len, len, namebuf);
                len = sizeof(*ref) + name_len;
                ref = (struct btrfs_inode_ref *)((char *)ref + len);
                cur += len;
diff --git a/utils.c b/utils.c
index 335c9cb..24b885e 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -561,7 +561,7 @@ int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
        if (ret)
                goto error;
 
-       ret = btrfs_insert_inode_ref(trans, root, "..", 2, objectid, objectid);
+       ret = btrfs_insert_inode_ref(trans, root, "..", 2, objectid, objectid, 0);
        if (ret)
                goto error;