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 41cc013..87c5622 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 baceb1d..2a87e23 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);
Simple merge
Simple merge