Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bae45de0 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse
Browse files

Btrfs: add dir inode index

parent b1a4d965
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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;

fs/btrfs/sysfs.c

0 → 100644
+4 −0
Original line number Diff line number Diff line
#include <linux/module.h>
#include "ctree.h"
#include "disk-io.h"
#include "transaction.h"