#include <linux/fs.h>
#include <linux/buffer_head.h>
+#include <linux/kobject.h>
#include "bit-radix.h"
struct btrfs_trans_handle;
#define BTRFS_MAGIC "_BtRfS_M"
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
-#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
-#define BTRFS_INODE_MAP_OBJECTID 3ULL
+#define BTRFS_DEV_TREE_OBJECTID 2ULL
+#define BTRFS_EXTENT_TREE_OBJECTID 3ULL
#define BTRFS_FS_TREE_OBJECTID 4ULL
-#define BTRFS_FIRST_FREE_OBJECTID 5ULL
+#define BTRFS_ROOT_TREE_DIR_OBJECTID 5ULL
+#define BTRFS_FIRST_FREE_OBJECTID 6ULL
/*
* we can actually store much bigger names, but lets not confuse the rest
*/
struct btrfs_disk_key {
__le64 objectid;
- __le64 offset;
__le32 flags;
+ __le64 offset;
} __attribute__ ((__packed__));
struct btrfs_key {
u64 objectid;
- u64 offset;
u32 flags;
+ u64 offset;
} __attribute__ ((__packed__));
/*
u8 fsid[16]; /* FS specific uuid */
__le64 blocknr; /* which block this node is supposed to live in */
__le64 generation;
- __le64 parentid; /* objectid of the tree root */
- __le32 ham;
__le16 nritems;
__le16 flags;
u8 level;
__le64 total_blocks;
__le64 blocks_used;
__le64 root_dir_objectid;
+ __le64 last_device_id;
+ /* fields below here vary with the underlying disk */
+ __le64 device_block_start;
+ __le64 device_num_blocks;
+ __le64 device_root;
+ __le64 device_id;
} __attribute__ ((__packed__));
/*
*/
struct btrfs_extent_item {
__le32 refs;
- __le64 owner;
} __attribute__ ((__packed__));
struct btrfs_inode_timespec {
} __attribute__ ((__packed__));
struct btrfs_dir_item {
- __le64 objectid;
+ struct btrfs_disk_key location;
__le16 flags;
__le16 name_len;
u8 type;
} __attribute__ ((__packed__));
struct btrfs_root_item {
+ struct btrfs_inode_item inode;
+ __le64 root_dirid;
__le64 blocknr;
__le32 flags;
__le64 block_limit;
u8 csum[BTRFS_CSUM_SIZE];
} __attribute__ ((__packed__));
-struct btrfs_inode_map_item {
- struct btrfs_disk_key key;
+struct btrfs_device_item {
+ __le16 pathlen;
+ __le64 device_id;
} __attribute__ ((__packed__));
struct crypto_hash;
struct btrfs_fs_info {
- struct btrfs_root *fs_root;
struct btrfs_root *extent_root;
struct btrfs_root *tree_root;
- struct btrfs_root *inode_root;
+ struct btrfs_root *dev_root;
struct btrfs_key current_insert;
struct btrfs_key last_insert;
+ struct radix_tree_root fs_roots_radix;
struct radix_tree_root pending_del_radix;
struct radix_tree_root pinned_radix;
- u64 last_inode_alloc;
+ struct radix_tree_root dev_radix;
u64 generation;
struct btrfs_transaction *running_transaction;
struct btrfs_super_block *disk_super;
struct mutex fs_mutex;
struct crypto_hash *hash_tfm;
spinlock_t hash_lock;
+ struct kobject kobj;
};
/*
struct btrfs_root_item root_item;
struct btrfs_key root_key;
struct btrfs_fs_info *fs_info;
+ struct inode *inode;
+ u64 objectid;
+ u64 last_trans;
u32 blocksize;
int ref_cows;
u32 type;
+ u64 highest_inode;
+ u64 last_inode_alloc;
};
/* the lower bits in the key flags defines the item type */
#define BTRFS_KEY_TYPE_MAX 256
-#define BTRFS_KEY_TYPE_MASK (BTRFS_KEY_TYPE_MAX - 1)
+#define BTRFS_KEY_TYPE_SHIFT 24
+#define BTRFS_KEY_TYPE_MASK (((u32)BTRFS_KEY_TYPE_MAX - 1) << \
+ BTRFS_KEY_TYPE_SHIFT)
+
+#define BTRFS_KEY_OVERFLOW_MAX 128
+#define BTRFS_KEY_OVERFLOW_MASK ((u32)BTRFS_KEY_OVERFLOW_MAX - 1)
/*
* inode items have the data typically returned from stat and store other
#define BTRFS_EXTENT_ITEM_KEY 8
/*
- * the inode map records which inode numbers are in use and where
- * they actually live on disk
+ * dev items list the devices that make up the FS
*/
-#define BTRFS_INODE_MAP_ITEM_KEY 9
+#define BTRFS_DEV_ITEM_KEY 9
+
/*
* string items are for debugging. They just store a short string of
* data in the FS
ts->nsec = cpu_to_le32(val);
}
-static inline u64 btrfs_extent_owner(struct btrfs_extent_item *ei)
-{
- return le64_to_cpu(ei->owner);
-}
-
-static inline void btrfs_set_extent_owner(struct btrfs_extent_item *ei, u64 val)
-{
- ei->owner = cpu_to_le64(val);
-}
-
static inline u32 btrfs_extent_refs(struct btrfs_extent_item *ei)
{
return le32_to_cpu(ei->refs);
item->size = cpu_to_le16(val);
}
-static inline u64 btrfs_dir_objectid(struct btrfs_dir_item *d)
-{
- return le64_to_cpu(d->objectid);
-}
-
-static inline void btrfs_set_dir_objectid(struct btrfs_dir_item *d, u64 val)
-{
- d->objectid = cpu_to_le64(val);
-}
-
static inline u16 btrfs_dir_flags(struct btrfs_dir_item *d)
{
return le16_to_cpu(d->flags);
disk->flags = cpu_to_le32(val);
}
+static inline u32 btrfs_disk_key_type(struct btrfs_disk_key *key)
+{
+ return le32_to_cpu(key->flags) >> BTRFS_KEY_TYPE_SHIFT;
+}
+
+static inline void btrfs_set_disk_key_type(struct btrfs_disk_key *key,
+ u32 val)
+{
+ u32 flags = btrfs_disk_key_flags(key);
+ BUG_ON(val >= BTRFS_KEY_TYPE_MAX);
+ val = val << BTRFS_KEY_TYPE_SHIFT;
+ flags = (flags & ~BTRFS_KEY_TYPE_MASK) | val;
+ btrfs_set_disk_key_flags(key, flags);
+}
+
static inline u32 btrfs_key_type(struct btrfs_key *key)
{
- return key->flags & BTRFS_KEY_TYPE_MASK;
+ return key->flags >> BTRFS_KEY_TYPE_SHIFT;
}
-static inline u32 btrfs_disk_key_type(struct btrfs_disk_key *key)
+static inline void btrfs_set_key_type(struct btrfs_key *key, u32 val)
{
- return le32_to_cpu(key->flags) & BTRFS_KEY_TYPE_MASK;
+ BUG_ON(val >= BTRFS_KEY_TYPE_MAX);
+ val = val << BTRFS_KEY_TYPE_SHIFT;
+ key->flags = (key->flags & ~(BTRFS_KEY_TYPE_MASK)) | val;
}
-static inline void btrfs_set_key_type(struct btrfs_key *key, u32 type)
+static inline u32 btrfs_key_overflow(struct btrfs_key *key)
{
- BUG_ON(type >= BTRFS_KEY_TYPE_MAX);
- key->flags = (key->flags & ~((u64)BTRFS_KEY_TYPE_MASK)) | type;
+ return key->flags & BTRFS_KEY_OVERFLOW_MASK;
}
-static inline void btrfs_set_disk_key_type(struct btrfs_disk_key *key, u32 type)
+static inline void btrfs_set_key_overflow(struct btrfs_key *key, u32 over)
+{
+ BUG_ON(over >= BTRFS_KEY_OVERFLOW_MAX);
+ key->flags = (key->flags & ~BTRFS_KEY_OVERFLOW_MASK) | over;
+}
+
+static inline u32 btrfs_disk_key_overflow(struct btrfs_disk_key *key)
+{
+ return le32_to_cpu(key->flags) & BTRFS_KEY_OVERFLOW_MASK;
+}
+
+static inline void btrfs_set_disk_key_overflow(struct btrfs_disk_key *key,
+ u32 over)
{
u32 flags = btrfs_disk_key_flags(key);
- BUG_ON(type >= BTRFS_KEY_TYPE_MAX);
- flags = (flags & ~((u64)BTRFS_KEY_TYPE_MASK)) | type;
+ BUG_ON(over >= BTRFS_KEY_OVERFLOW_MAX);
+ flags = (flags & ~BTRFS_KEY_OVERFLOW_MASK) | over;
btrfs_set_disk_key_flags(key, flags);
}
h->generation = cpu_to_le64(val);
}
-static inline u64 btrfs_header_parentid(struct btrfs_header *h)
-{
- return le64_to_cpu(h->parentid);
-}
-
-static inline void btrfs_set_header_parentid(struct btrfs_header *h,
- u64 parentid)
-{
- h->parentid = cpu_to_le64(parentid);
-}
-
static inline u16 btrfs_header_nritems(struct btrfs_header *h)
{
return le16_to_cpu(h->nritems);
item->blocknr = cpu_to_le64(val);
}
+static inline u64 btrfs_root_dirid(struct btrfs_root_item *item)
+{
+ return le64_to_cpu(item->root_dirid);
+}
+
+static inline void btrfs_set_root_dirid(struct btrfs_root_item *item, u64 val)
+{
+ item->root_dirid = cpu_to_le64(val);
+}
+
static inline u32 btrfs_root_refs(struct btrfs_root_item *item)
{
return le32_to_cpu(item->refs);
s->blocknr = cpu_to_le64(val);
}
+static inline u64 btrfs_super_generation(struct btrfs_super_block *s)
+{
+ return le64_to_cpu(s->generation);
+}
+
+static inline void btrfs_set_super_generation(struct btrfs_super_block *s,
+ u64 val)
+{
+ s->generation = cpu_to_le64(val);
+}
+
static inline u64 btrfs_super_root(struct btrfs_super_block *s)
{
return le64_to_cpu(s->root);
s->root_dir_objectid = cpu_to_le64(val);
}
+static inline u64 btrfs_super_last_device_id(struct btrfs_super_block *s)
+{
+ return le64_to_cpu(s->last_device_id);
+}
+
+static inline void btrfs_set_super_last_device_id(struct btrfs_super_block *s,
+ u64 val)
+{
+ s->last_device_id = cpu_to_le64(val);
+}
+
+static inline u64 btrfs_super_device_id(struct btrfs_super_block *s)
+{
+ return le64_to_cpu(s->device_id);
+}
+
+static inline void btrfs_set_super_device_id(struct btrfs_super_block *s,
+ u64 val)
+{
+ s->device_id = cpu_to_le64(val);
+}
+
+static inline u64 btrfs_super_device_block_start(struct btrfs_super_block *s)
+{
+ return le64_to_cpu(s->device_block_start);
+}
+
+static inline void btrfs_set_super_device_block_start(struct btrfs_super_block
+ *s, u64 val)
+{
+ s->device_block_start = cpu_to_le64(val);
+}
+
+static inline u64 btrfs_super_device_num_blocks(struct btrfs_super_block *s)
+{
+ return le64_to_cpu(s->device_num_blocks);
+}
+
+static inline void btrfs_set_super_device_num_blocks(struct btrfs_super_block
+ *s, u64 val)
+{
+ s->device_num_blocks = cpu_to_le64(val);
+}
+
+static inline u64 btrfs_super_device_root(struct btrfs_super_block *s)
+{
+ return le64_to_cpu(s->device_root);
+}
+
+static inline void btrfs_set_super_device_root(struct btrfs_super_block
+ *s, u64 val)
+{
+ s->device_root = cpu_to_le64(val);
+}
+
+
static inline u8 *btrfs_leaf_data(struct btrfs_leaf *l)
{
return (u8 *)l->items;
e->num_blocks = cpu_to_le64(val);
}
+static inline u16 btrfs_device_pathlen(struct btrfs_device_item *d)
+{
+ return le16_to_cpu(d->pathlen);
+}
+
+static inline void btrfs_set_device_pathlen(struct btrfs_device_item *d,
+ u16 val)
+{
+ d->pathlen = cpu_to_le16(val);
+}
+
+static inline u64 btrfs_device_id(struct btrfs_device_item *d)
+{
+ return le64_to_cpu(d->device_id);
+}
+
+static inline void btrfs_set_device_id(struct btrfs_device_item *d,
+ u64 val)
+{
+ d->device_id = cpu_to_le64(val);
+}
+
static inline struct btrfs_root *btrfs_sb(struct super_block *sb)
{
return sb->s_fs_info;
((type *)(btrfs_leaf_data(leaf) + \
btrfs_item_offset((leaf)->items + (slot))))
-/* extent-item.c */
+/* extent-tree.c */
+int btrfs_inc_root_ref(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root);
struct buffer_head *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
struct btrfs_root *root);
int btrfs_alloc_extent(struct btrfs_trans_handle *trans, struct btrfs_root
*root, u64 num_blocks, u64 search_start, u64
- search_end, u64 owner, struct btrfs_key *ins);
+ search_end, struct btrfs_key *ins);
int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
struct buffer_head *buf);
int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
*root, u64 blocknr, u64 num_blocks, int pin);
int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
btrfs_root *root);
+int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+ u64 blocknr, u64 num_blocks);
/* ctree.c */
+int btrfs_extend_item(struct btrfs_trans_handle *trans, struct btrfs_root
+ *root, struct btrfs_path *path, u32 data_size);
+int btrfs_truncate_item(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+ struct btrfs_path *path,
+ u32 new_size);
int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
*root, struct btrfs_key *key, struct btrfs_path *p, int
ins_len, int cow);
btrfs_root_item *item, struct btrfs_key *key);
/* dir-item.c */
int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
- *root, const char *name, int name_len, u64 dir, u64
- objectid, u8 type);
+ *root, const char *name, int name_len, u64 dir,
+ struct btrfs_key *location, u8 type);
int btrfs_lookup_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
*root, struct btrfs_path *path, u64 dir,
const char *name, int name_len, int mod);
+int btrfs_lookup_dir_index_item(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+ struct btrfs_path *path, u64 dir,
+ u64 objectid, int mod);
int btrfs_match_dir_item_name(struct btrfs_root *root, struct btrfs_path *path,
const char *name, int name_len);
/* inode-map.c */
int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
struct btrfs_root *fs_root,
u64 dirid, u64 *objectid);
-int btrfs_insert_inode_map(struct btrfs_trans_handle *trans,
- struct btrfs_root *root,
- u64 objectid, struct btrfs_key *location);
-int btrfs_lookup_inode_map(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, struct btrfs_path *path,
- u64 objectid, int mod);
+int btrfs_find_highest_inode(struct btrfs_root *fs_root, u64 *objectid);
+
/* inode-item.c */
int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root
*root, u64 objectid, struct btrfs_inode_item
*inode_item);
int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root
- *root, struct btrfs_path *path, u64 objectid, int mod);
+ *root, struct btrfs_path *path,
+ struct btrfs_key *location, int mod);
/* file-item.c */
-int btrfs_alloc_file_extent(struct btrfs_trans_handle *trans,
+int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
struct btrfs_root *root,
- u64 objectid, u64 offset,
- u64 num_blocks, u64 hint_block,
- u64 *result);
+ u64 objectid, u64 pos, u64 offset,
+ u64 num_blocks);
int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
struct btrfs_root *root,
struct btrfs_path *path, u64 objectid,
int btrfs_csum_verify_file_block(struct btrfs_root *root,
u64 objectid, u64 offset,
char *data, size_t len);
+struct btrfs_csum_item *btrfs_lookup_csum(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+ struct btrfs_path *path,
+ u64 objectid, u64 offset,
+ int cow);
+/* super.c */
+extern struct subsystem btrfs_subsys;
+
#endif