]> Pileus Git - ~andy/linux/commitdiff
Btrfs: add dir inode index
authorChris Mason <chris.mason@oracle.com>
Thu, 5 Apr 2007 01:22:22 +0000 (21:22 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Thu, 5 Apr 2007 01:22:22 +0000 (21:22 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/dir-item.c
fs/btrfs/super.c
fs/btrfs/sysfs.c [new file with mode: 0644]

index 41cc013ef08de6c1e971d7883a34efb08ea71591..87c56222a620b3e10656093844b7aac4d1400015 100644 (file)
@@ -282,41 +282,42 @@ struct btrfs_root {
  * for every name in a directory.
  */
 #define BTRFS_DIR_ITEM_KEY     2
+#define BTRFS_DIR_INDEX_KEY    3
 /*
  * inline data is file data that fits in the btree.
  */
-#define BTRFS_INLINE_DATA_KEY  3
+#define BTRFS_INLINE_DATA_KEY  4
 /*
  * extent data is for data that can't fit in the btree.  It points to
  * a (hopefully) huge chunk of disk
  */
-#define BTRFS_EXTENT_DATA_KEY  4
+#define BTRFS_EXTENT_DATA_KEY  5
 /*
  * csum items have the checksums for data in the extents
  */
-#define BTRFS_CSUM_ITEM_KEY    5
+#define BTRFS_CSUM_ITEM_KEY    6
 
 /*
  * root items point to tree roots.  There are typically in the root
  * tree used by the super block to find all the other trees
  */
-#define BTRFS_ROOT_ITEM_KEY    6
+#define BTRFS_ROOT_ITEM_KEY    7
 /*
  * extent items are in the extent map tree.  These record which blocks
  * are used, and how many references there are to each block
  */
-#define BTRFS_EXTENT_ITEM_KEY  7
+#define BTRFS_EXTENT_ITEM_KEY  8
 
 /*
  * the inode map records which inode numbers are in use and where
  * they actually live on disk
  */
-#define BTRFS_INODE_MAP_ITEM_KEY 8
+#define BTRFS_INODE_MAP_ITEM_KEY 9
 /*
  * string items are for debugging.  They just store a short string of
  * data in the FS
  */
-#define BTRFS_STRING_ITEM_KEY  9
+#define BTRFS_STRING_ITEM_KEY  10
 
 static inline u64 btrfs_inode_generation(struct btrfs_inode_item *i)
 {
index baceb1da609f8d6d3d71cc881b9736ca80d3de81..2a87e23ac9c90a3668ab3095d27138a7594dd0cf 100644 (file)
@@ -37,6 +37,25 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
        name_ptr = (char *)(dir_item + 1);
        btrfs_memcpy(root, path->nodes[0]->b_data, name_ptr, name, name_len);
        btrfs_mark_buffer_dirty(path->nodes[0]);
+       btrfs_release_path(root, path);
+
+       btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY);
+       key.offset = objectid;
+       ret = btrfs_insert_empty_item(trans, root, path, &key, data_size);
+       // FIXME clear the dirindex bit
+       if (ret)
+               goto out;
+
+       dir_item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]),
+                                 path->slots[0],
+                                 struct btrfs_dir_item);
+       btrfs_set_dir_objectid(dir_item, objectid);
+       btrfs_set_dir_type(dir_item, type);
+       btrfs_set_dir_flags(dir_item, 0);
+       btrfs_set_dir_name_len(dir_item, name_len);
+       name_ptr = (char *)(dir_item + 1);
+       btrfs_memcpy(root, path->nodes[0]->b_data, name_ptr, name, name_len);
+       btrfs_mark_buffer_dirty(path->nodes[0]);
 out:
        btrfs_release_path(root, path);
        btrfs_free_path(path);
index 822243650ae9d41f713b48b009eb63dc6a37e9a9..4b042460e87522d1e6d0ec5c89aee9af97169e98 100644 (file)
@@ -447,7 +447,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
        mutex_lock(&root->fs_info->fs_mutex);
        key.objectid = inode->i_ino;
        key.flags = 0;
-       btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
+       btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY);
        key.offset = filp->f_pos;
        path = btrfs_alloc_path();
        btrfs_init_path(path);
@@ -477,7 +477,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                item = leaf->items + slot;
                if (btrfs_disk_key_objectid(&item->key) != key.objectid)
                        break;
-               if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_ITEM_KEY)
+               if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_INDEX_KEY)
                        continue;
                if (btrfs_disk_key_offset(&item->key) < filp->f_pos)
                        continue;
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
new file mode 100644 (file)
index 0000000..ed8b7e2
--- /dev/null
@@ -0,0 +1,4 @@
+#include <linux/module.h>
+#include "ctree.h"
+#include "disk-io.h"
+#include "transaction.h"