Browse Source

Btrfs: add dir inode index

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason 18 years ago
parent
commit
bae45de03c
4 changed files with 33 additions and 9 deletions
  1. 8 7
      fs/btrfs/ctree.h
  2. 19 0
      fs/btrfs/dir-item.c
  3. 2 2
      fs/btrfs/super.c
  4. 4 0
      fs/btrfs/sysfs.c

+ 8 - 7
fs/btrfs/ctree.h

@@ -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)
 {

+ 19 - 0
fs/btrfs/dir-item.c

@@ -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);

+ 2 - 2
fs/btrfs/super.c

@@ -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;

+ 4 - 0
fs/btrfs/sysfs.c

@@ -0,0 +1,4 @@
+#include <linux/module.h>
+#include "ctree.h"
+#include "disk-io.h"
+#include "transaction.h"