2007-03-13 17:46:10 +03:00
# ifndef __BTRFS__
# define __BTRFS__
2007-02-02 17:18:22 +03:00
2007-03-22 19:13:20 +03:00
# include <linux/fs.h>
2007-03-30 22:27:56 +04:00
# include <linux/buffer_head.h>
2007-04-06 23:37:36 +04:00
# include <linux/kobject.h>
2007-03-26 18:15:30 +04:00
# include "bit-radix.h"
2007-03-22 19:13:20 +03:00
2007-03-16 23:20:31 +03:00
struct btrfs_trans_handle ;
2007-03-22 22:59:16 +03:00
struct btrfs_transaction ;
2007-04-02 18:50:19 +04:00
extern struct kmem_cache * btrfs_path_cachep ;
2007-03-16 23:20:31 +03:00
2007-03-13 23:47:54 +03:00
# define BTRFS_MAGIC "_BtRfS_M"
2007-02-02 17:18:22 +03:00
2007-03-27 14:33:00 +04:00
# define BTRFS_ROOT_TREE_OBJECTID 1ULL
2007-04-11 21:57:44 +04:00
# define BTRFS_DEV_TREE_OBJECTID 2ULL
# define BTRFS_EXTENT_TREE_OBJECTID 3ULL
# define BTRFS_FS_TREE_OBJECTID 4ULL
# define BTRFS_ROOT_TREE_DIR_OBJECTID 5ULL
# define BTRFS_FIRST_FREE_OBJECTID 6ULL
2007-03-13 23:47:54 +03:00
2007-03-22 19:13:20 +03:00
/*
* we can actually store much bigger names , but lets not confuse the rest
* of linux
*/
# define BTRFS_NAME_LEN 255
2007-03-29 23:15:27 +04:00
/* 32 bytes in various csum fields */
# define BTRFS_CSUM_SIZE 32
2007-02-26 18:40:21 +03:00
/*
* the key defines the order in the tree , and so it also defines ( optimal )
* block layout . objectid corresonds to the inode number . The flags
* tells us things about the object , and is a kind of stream selector .
* so for a given inode , keys with flags of 1 might refer to the inode
* data , flags of 2 may point to file data in the btree and flags = = 3
* may point to extents .
*
* offset is the starting byte offset for this key in the stream .
2007-03-12 23:22:34 +03:00
*
* btrfs_disk_key is in disk byte order . struct btrfs_key is always
* in cpu native order . Otherwise they are identical and their sizes
* should be the same ( ie both packed )
2007-02-26 18:40:21 +03:00
*/
2007-03-12 23:22:34 +03:00
struct btrfs_disk_key {
__le64 objectid ;
2007-03-16 15:46:49 +03:00
__le64 offset ;
2007-03-29 23:15:27 +04:00
__le32 flags ;
2007-03-12 23:22:34 +03:00
} __attribute__ ( ( __packed__ ) ) ;
struct btrfs_key {
2007-02-02 17:18:22 +03:00
u64 objectid ;
2007-03-16 15:46:49 +03:00
u64 offset ;
2007-03-29 23:15:27 +04:00
u32 flags ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-02-26 18:40:21 +03:00
/*
* every tree block ( leaf or node ) starts with this header .
*/
2007-03-12 19:29:44 +03:00
struct btrfs_header {
2007-03-29 23:15:27 +04:00
u8 csum [ BTRFS_CSUM_SIZE ] ;
2007-03-13 23:47:54 +03:00
u8 fsid [ 16 ] ; /* FS specific uuid */
2007-03-12 19:29:44 +03:00
__le64 blocknr ; /* which block this node is supposed to live in */
2007-03-23 22:56:19 +03:00
__le64 generation ;
2007-03-12 19:29:44 +03:00
__le16 nritems ;
__le16 flags ;
2007-03-27 17:06:38 +04:00
u8 level ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-03-13 17:46:10 +03:00
# define BTRFS_MAX_LEVEL 8
2007-03-14 21:14:43 +03:00
# define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->blocksize - \
sizeof ( struct btrfs_header ) ) / \
( sizeof ( struct btrfs_disk_key ) + sizeof ( u64 ) ) )
# define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
# define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->blocksize))
2007-02-02 17:18:22 +03:00
2007-03-22 19:13:20 +03:00
struct buffer_head ;
2007-02-26 18:40:21 +03:00
/*
* the super block basically lists the main trees of the FS
* it currently lacks any block count etc etc
*/
2007-03-13 17:46:10 +03:00
struct btrfs_super_block {
2007-03-29 23:15:27 +04:00
u8 csum [ BTRFS_CSUM_SIZE ] ;
2007-03-29 03:44:27 +04:00
/* the first 3 fields must match struct btrfs_header */
2007-03-13 23:47:54 +03:00
u8 fsid [ 16 ] ; /* FS specific uuid */
__le64 blocknr ; /* this block number */
__le64 magic ;
2007-03-14 21:14:43 +03:00
__le32 blocksize ;
2007-03-13 23:47:54 +03:00
__le64 generation ;
__le64 root ;
__le64 total_blocks ;
__le64 blocks_used ;
2007-03-21 18:12:56 +03:00
__le64 root_dir_objectid ;
2007-04-11 21:57:44 +04:00
/* fields below here vary with the underlying disk */
__le64 device_block_start ;
__le64 device_num_blocks ;
__le64 device_root ;
2007-02-22 01:04:57 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-02-26 18:40:21 +03:00
/*
2007-03-15 19:56:47 +03:00
* A leaf is full of items . offset and size tell us where to find
2007-02-26 18:40:21 +03:00
* the item in the leaf ( relative to the start of the data area )
*/
2007-03-13 03:12:07 +03:00
struct btrfs_item {
2007-03-12 23:22:34 +03:00
struct btrfs_disk_key key ;
2007-03-14 21:14:43 +03:00
__le32 offset ;
2007-03-13 03:12:07 +03:00
__le16 size ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-02-26 18:40:21 +03:00
/*
* leaves have an item area and a data area :
* [ item0 , item1 . . . . itemN ] [ free space ] [ dataN . . . data1 , data0 ]
*
* The data is separate from the items to get the keys closer together
* during searches .
*/
2007-03-13 17:46:10 +03:00
struct btrfs_leaf {
2007-03-12 19:29:44 +03:00
struct btrfs_header header ;
2007-03-14 21:14:43 +03:00
struct btrfs_item items [ ] ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-02-26 18:40:21 +03:00
/*
* all non - leaf blocks are nodes , they hold only keys and pointers to
* other blocks
*/
2007-03-14 21:14:43 +03:00
struct btrfs_key_ptr {
struct btrfs_disk_key key ;
__le64 blockptr ;
} __attribute__ ( ( __packed__ ) ) ;
2007-03-13 17:46:10 +03:00
struct btrfs_node {
2007-03-12 19:29:44 +03:00
struct btrfs_header header ;
2007-03-14 21:14:43 +03:00
struct btrfs_key_ptr ptrs [ ] ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-02-26 18:40:21 +03:00
/*
2007-03-13 17:46:10 +03:00
* btrfs_paths remember the path taken from the root down to the leaf .
* level 0 is always the leaf , and nodes [ 1. . . BTRFS_MAX_LEVEL ] will point
2007-02-26 18:40:21 +03:00
* to any other levels that are present .
*
* The slots array records the index of the item or block pointer
* used while walking the tree .
*/
2007-03-13 17:46:10 +03:00
struct btrfs_path {
2007-03-22 19:13:20 +03:00
struct buffer_head * nodes [ BTRFS_MAX_LEVEL ] ;
2007-03-13 17:46:10 +03:00
int slots [ BTRFS_MAX_LEVEL ] ;
2007-02-02 17:18:22 +03:00
} ;
2007-02-24 14:24:44 +03:00
2007-03-15 19:56:47 +03:00
/*
* items in the extent btree are used to record the objectid of the
* owner of the block and the number of references
*/
struct btrfs_extent_item {
__le32 refs ;
} __attribute__ ( ( __packed__ ) ) ;
2007-03-16 02:03:33 +03:00
struct btrfs_inode_timespec {
2007-03-29 23:15:27 +04:00
__le64 sec ;
2007-03-16 02:03:33 +03:00
__le32 nsec ;
} __attribute__ ( ( __packed__ ) ) ;
/*
* there is no padding here on purpose . If you want to extent the inode ,
* make a new item type
*/
struct btrfs_inode_item {
__le64 generation ;
__le64 size ;
__le64 nblocks ;
__le32 nlink ;
__le32 uid ;
__le32 gid ;
__le32 mode ;
__le32 rdev ;
__le16 flags ;
__le16 compat_flags ;
struct btrfs_inode_timespec atime ;
struct btrfs_inode_timespec ctime ;
struct btrfs_inode_timespec mtime ;
struct btrfs_inode_timespec otime ;
} __attribute__ ( ( __packed__ ) ) ;
/* inline data is just a blob of bytes */
struct btrfs_inline_data_item {
u8 data ;
} __attribute__ ( ( __packed__ ) ) ;
2007-03-15 19:56:47 +03:00
struct btrfs_dir_item {
2007-04-06 23:37:36 +04:00
struct btrfs_disk_key location ;
2007-03-15 19:56:47 +03:00
__le16 flags ;
2007-03-16 15:46:49 +03:00
__le16 name_len ;
2007-03-15 19:56:47 +03:00
u8 type ;
} __attribute__ ( ( __packed__ ) ) ;
struct btrfs_root_item {
2007-04-06 23:37:36 +04:00
struct btrfs_inode_item inode ;
__le64 root_dirid ;
2007-03-15 19:56:47 +03:00
__le64 blocknr ;
__le32 flags ;
__le64 block_limit ;
__le64 blocks_used ;
__le32 refs ;
2007-03-20 21:38:32 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-03-15 19:56:47 +03:00
2007-03-20 21:38:32 +03:00
struct btrfs_file_extent_item {
2007-03-27 17:16:29 +04:00
__le64 generation ;
2007-03-20 21:38:32 +03:00
/*
* disk space consumed by the extent , checksum blocks are included
* in these numbers
*/
__le64 disk_blocknr ;
__le64 disk_num_blocks ;
/*
2007-03-27 00:00:06 +04:00
* the logical offset in file blocks ( no csums )
2007-03-20 21:38:32 +03:00
* this extent record is for . This allows a file extent to point
* into the middle of an existing extent on disk , sharing it
* between two snapshots ( useful if some bytes in the middle of the
* extent have changed
*/
__le64 offset ;
/*
* the logical number of file blocks ( no csums included )
*/
__le64 num_blocks ;
} __attribute__ ( ( __packed__ ) ) ;
2007-03-29 23:15:27 +04:00
struct btrfs_csum_item {
u8 csum [ BTRFS_CSUM_SIZE ] ;
} __attribute__ ( ( __packed__ ) ) ;
2007-04-11 21:57:44 +04:00
struct btrfs_device_item {
__le16 pathlen ;
} __attribute__ ( ( __packed__ ) ) ;
2007-03-29 03:44:27 +04:00
struct crypto_hash ;
2007-03-20 21:38:32 +03:00
struct btrfs_fs_info {
2007-03-15 19:56:47 +03:00
struct btrfs_root * extent_root ;
struct btrfs_root * tree_root ;
2007-04-11 21:57:44 +04:00
struct btrfs_root * dev_root ;
2007-03-15 19:56:47 +03:00
struct btrfs_key current_insert ;
struct btrfs_key last_insert ;
2007-04-09 18:42:37 +04:00
struct radix_tree_root fs_roots_radix ;
2007-03-26 18:15:30 +04:00
struct radix_tree_root pending_del_radix ;
2007-03-15 19:56:47 +03:00
struct radix_tree_root pinned_radix ;
2007-04-11 23:53:25 +04:00
struct radix_tree_root dev_radix ;
2007-03-20 22:57:25 +03:00
u64 generation ;
2007-03-22 22:59:16 +03:00
struct btrfs_transaction * running_transaction ;
2007-03-21 03:35:03 +03:00
struct btrfs_super_block * disk_super ;
2007-03-22 19:13:20 +03:00
struct buffer_head * sb_buffer ;
struct super_block * sb ;
2007-03-28 21:57:48 +04:00
struct inode * btree_inode ;
2007-03-22 22:59:16 +03:00
struct mutex trans_mutex ;
2007-03-24 02:47:49 +03:00
struct mutex fs_mutex ;
2007-03-29 03:44:27 +04:00
struct crypto_hash * hash_tfm ;
spinlock_t hash_lock ;
2007-04-06 23:37:36 +04:00
struct kobject kobj ;
2007-03-20 21:38:32 +03:00
} ;
/*
* in ram representation of the tree . extent_root is used for all allocations
* and for the extent tree extent_root root . current_insert is used
* only for the extent tree .
*/
struct btrfs_root {
2007-03-22 19:13:20 +03:00
struct buffer_head * node ;
struct buffer_head * commit_root ;
2007-03-15 19:56:47 +03:00
struct btrfs_root_item root_item ;
struct btrfs_key root_key ;
2007-03-20 21:38:32 +03:00
struct btrfs_fs_info * fs_info ;
2007-04-09 18:42:37 +04:00
struct inode * inode ;
u64 objectid ;
u64 last_trans ;
2007-03-15 19:56:47 +03:00
u32 blocksize ;
2007-03-20 21:38:32 +03:00
int ref_cows ;
u32 type ;
2007-04-10 20:13:09 +04:00
u64 highest_inode ;
u64 last_inode_alloc ;
2007-03-15 19:56:47 +03:00
} ;
/* 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)
2007-03-16 02:03:33 +03:00
2007-04-05 20:13:21 +04:00
# define BTRFS_KEY_OVERFLOW_MAX 128
# define BTRFS_KEY_OVERFLOW_SHIFT 8
# define BTRFS_KEY_OVERFLOW_MASK (0x7FULL << BTRFS_KEY_OVERFLOW_SHIFT)
2007-03-16 02:03:33 +03:00
/*
* inode items have the data typically returned from stat and store other
* info about object characteristics . There is one for every file and dir in
* the FS
*/
2007-03-15 19:56:47 +03:00
# define BTRFS_INODE_ITEM_KEY 1
2007-03-16 02:03:33 +03:00
/*
* dir items are the name - > inode pointers in a directory . There is one
* for every name in a directory .
*/
2007-03-15 19:56:47 +03:00
# define BTRFS_DIR_ITEM_KEY 2
2007-04-05 05:22:22 +04:00
# define BTRFS_DIR_INDEX_KEY 3
2007-03-16 02:03:33 +03:00
/*
* inline data is file data that fits in the btree .
*/
2007-04-05 05:22:22 +04:00
# define BTRFS_INLINE_DATA_KEY 4
2007-03-16 02:03:33 +03:00
/*
* extent data is for data that can ' t fit in the btree . It points to
* a ( hopefully ) huge chunk of disk
*/
2007-04-05 05:22:22 +04:00
# define BTRFS_EXTENT_DATA_KEY 5
2007-03-29 23:15:27 +04:00
/*
* csum items have the checksums for data in the extents
*/
2007-04-05 05:22:22 +04:00
# define BTRFS_CSUM_ITEM_KEY 6
2007-03-29 23:15:27 +04:00
2007-03-16 02:03:33 +03:00
/*
* root items point to tree roots . There are typically in the root
* tree used by the super block to find all the other trees
*/
2007-04-05 05:22:22 +04:00
# define BTRFS_ROOT_ITEM_KEY 7
2007-03-16 02:03:33 +03:00
/*
* extent items are in the extent map tree . These record which blocks
* are used , and how many references there are to each block
*/
2007-04-05 05:22:22 +04:00
# define BTRFS_EXTENT_ITEM_KEY 8
2007-03-20 21:38:32 +03:00
2007-04-11 21:57:44 +04:00
/*
* dev items list the devices that make up the FS
*/
# define BTRFS_DEV_ITEM_KEY 9
2007-03-16 02:03:33 +03:00
/*
* string items are for debugging . They just store a short string of
* data in the FS
*/
2007-04-11 21:57:44 +04:00
# define BTRFS_STRING_ITEM_KEY 10
2007-03-16 02:03:33 +03:00
static inline u64 btrfs_inode_generation ( struct btrfs_inode_item * i )
{
return le64_to_cpu ( i - > generation ) ;
}
static inline void btrfs_set_inode_generation ( struct btrfs_inode_item * i ,
u64 val )
{
i - > generation = cpu_to_le64 ( val ) ;
}
static inline u64 btrfs_inode_size ( struct btrfs_inode_item * i )
{
return le64_to_cpu ( i - > size ) ;
}
static inline void btrfs_set_inode_size ( struct btrfs_inode_item * i , u64 val )
{
i - > size = cpu_to_le64 ( val ) ;
}
static inline u64 btrfs_inode_nblocks ( struct btrfs_inode_item * i )
{
return le64_to_cpu ( i - > nblocks ) ;
}
static inline void btrfs_set_inode_nblocks ( struct btrfs_inode_item * i , u64 val )
{
i - > nblocks = cpu_to_le64 ( val ) ;
}
static inline u32 btrfs_inode_nlink ( struct btrfs_inode_item * i )
{
return le32_to_cpu ( i - > nlink ) ;
}
static inline void btrfs_set_inode_nlink ( struct btrfs_inode_item * i , u32 val )
{
i - > nlink = cpu_to_le32 ( val ) ;
}
static inline u32 btrfs_inode_uid ( struct btrfs_inode_item * i )
{
return le32_to_cpu ( i - > uid ) ;
}
static inline void btrfs_set_inode_uid ( struct btrfs_inode_item * i , u32 val )
{
i - > uid = cpu_to_le32 ( val ) ;
}
static inline u32 btrfs_inode_gid ( struct btrfs_inode_item * i )
{
return le32_to_cpu ( i - > gid ) ;
}
static inline void btrfs_set_inode_gid ( struct btrfs_inode_item * i , u32 val )
{
i - > gid = cpu_to_le32 ( val ) ;
}
static inline u32 btrfs_inode_mode ( struct btrfs_inode_item * i )
{
return le32_to_cpu ( i - > mode ) ;
}
static inline void btrfs_set_inode_mode ( struct btrfs_inode_item * i , u32 val )
{
i - > mode = cpu_to_le32 ( val ) ;
}
static inline u32 btrfs_inode_rdev ( struct btrfs_inode_item * i )
{
return le32_to_cpu ( i - > rdev ) ;
}
static inline void btrfs_set_inode_rdev ( struct btrfs_inode_item * i , u32 val )
{
i - > rdev = cpu_to_le32 ( val ) ;
}
static inline u16 btrfs_inode_flags ( struct btrfs_inode_item * i )
{
return le16_to_cpu ( i - > flags ) ;
}
static inline void btrfs_set_inode_flags ( struct btrfs_inode_item * i , u16 val )
{
i - > flags = cpu_to_le16 ( val ) ;
}
static inline u16 btrfs_inode_compat_flags ( struct btrfs_inode_item * i )
{
return le16_to_cpu ( i - > compat_flags ) ;
}
static inline void btrfs_set_inode_compat_flags ( struct btrfs_inode_item * i ,
u16 val )
{
i - > compat_flags = cpu_to_le16 ( val ) ;
}
2007-03-29 23:15:27 +04:00
static inline u64 btrfs_timespec_sec ( struct btrfs_inode_timespec * ts )
2007-03-22 19:13:20 +03:00
{
2007-03-29 23:15:27 +04:00
return le64_to_cpu ( ts - > sec ) ;
2007-03-22 19:13:20 +03:00
}
static inline void btrfs_set_timespec_sec ( struct btrfs_inode_timespec * ts ,
2007-03-29 23:15:27 +04:00
u64 val )
2007-03-22 19:13:20 +03:00
{
2007-03-29 23:15:27 +04:00
ts - > sec = cpu_to_le64 ( val ) ;
2007-03-22 19:13:20 +03:00
}
static inline u32 btrfs_timespec_nsec ( struct btrfs_inode_timespec * ts )
{
return le32_to_cpu ( ts - > nsec ) ;
}
static inline void btrfs_set_timespec_nsec ( struct btrfs_inode_timespec * ts ,
u32 val )
{
ts - > nsec = cpu_to_le32 ( val ) ;
}
2007-03-13 17:46:10 +03:00
static inline u32 btrfs_extent_refs ( struct btrfs_extent_item * ei )
2007-03-13 16:49:06 +03:00
{
return le32_to_cpu ( ei - > refs ) ;
}
2007-03-13 17:46:10 +03:00
static inline void btrfs_set_extent_refs ( struct btrfs_extent_item * ei , u32 val )
2007-03-13 16:49:06 +03:00
{
ei - > refs = cpu_to_le32 ( val ) ;
}
2007-03-13 17:46:10 +03:00
static inline u64 btrfs_node_blockptr ( struct btrfs_node * n , int nr )
2007-03-13 16:28:32 +03:00
{
2007-03-14 21:14:43 +03:00
return le64_to_cpu ( n - > ptrs [ nr ] . blockptr ) ;
2007-03-13 16:28:32 +03:00
}
2007-03-13 17:46:10 +03:00
static inline void btrfs_set_node_blockptr ( struct btrfs_node * n , int nr ,
u64 val )
2007-03-13 16:28:32 +03:00
{
2007-03-14 21:14:43 +03:00
n - > ptrs [ nr ] . blockptr = cpu_to_le64 ( val ) ;
2007-03-13 16:28:32 +03:00
}
2007-03-14 21:14:43 +03:00
static inline u32 btrfs_item_offset ( struct btrfs_item * item )
2007-03-13 03:12:07 +03:00
{
2007-03-14 21:14:43 +03:00
return le32_to_cpu ( item - > offset ) ;
2007-03-13 03:12:07 +03:00
}
2007-03-14 21:14:43 +03:00
static inline void btrfs_set_item_offset ( struct btrfs_item * item , u32 val )
2007-03-13 03:12:07 +03:00
{
2007-03-14 21:14:43 +03:00
item - > offset = cpu_to_le32 ( val ) ;
2007-03-13 03:12:07 +03:00
}
2007-03-14 21:14:43 +03:00
static inline u32 btrfs_item_end ( struct btrfs_item * item )
2007-03-13 03:12:07 +03:00
{
2007-03-14 21:14:43 +03:00
return le32_to_cpu ( item - > offset ) + le16_to_cpu ( item - > size ) ;
2007-03-13 03:12:07 +03:00
}
static inline u16 btrfs_item_size ( struct btrfs_item * item )
{
return le16_to_cpu ( item - > size ) ;
}
static inline void btrfs_set_item_size ( struct btrfs_item * item , u16 val )
{
item - > size = cpu_to_le16 ( val ) ;
}
2007-03-15 22:18:43 +03:00
static inline u16 btrfs_dir_flags ( struct btrfs_dir_item * d )
{
return le16_to_cpu ( d - > flags ) ;
}
static inline void btrfs_set_dir_flags ( struct btrfs_dir_item * d , u16 val )
{
d - > flags = cpu_to_le16 ( val ) ;
}
static inline u8 btrfs_dir_type ( struct btrfs_dir_item * d )
{
return d - > type ;
}
static inline void btrfs_set_dir_type ( struct btrfs_dir_item * d , u8 val )
{
d - > type = val ;
}
2007-03-16 15:46:49 +03:00
static inline u16 btrfs_dir_name_len ( struct btrfs_dir_item * d )
{
return le16_to_cpu ( d - > name_len ) ;
}
static inline void btrfs_set_dir_name_len ( struct btrfs_dir_item * d , u16 val )
2007-03-15 22:18:43 +03:00
{
2007-03-16 15:46:49 +03:00
d - > name_len = cpu_to_le16 ( val ) ;
2007-03-15 22:18:43 +03:00
}
2007-03-12 23:22:34 +03:00
static inline void btrfs_disk_key_to_cpu ( struct btrfs_key * cpu ,
struct btrfs_disk_key * disk )
{
cpu - > offset = le64_to_cpu ( disk - > offset ) ;
cpu - > flags = le32_to_cpu ( disk - > flags ) ;
cpu - > objectid = le64_to_cpu ( disk - > objectid ) ;
}
static inline void btrfs_cpu_key_to_disk ( struct btrfs_disk_key * disk ,
struct btrfs_key * cpu )
{
disk - > offset = cpu_to_le64 ( cpu - > offset ) ;
disk - > flags = cpu_to_le32 ( cpu - > flags ) ;
disk - > objectid = cpu_to_le64 ( cpu - > objectid ) ;
}
2007-03-15 19:56:47 +03:00
static inline u64 btrfs_disk_key_objectid ( struct btrfs_disk_key * disk )
2007-03-12 23:22:34 +03:00
{
return le64_to_cpu ( disk - > objectid ) ;
}
2007-03-15 19:56:47 +03:00
static inline void btrfs_set_disk_key_objectid ( struct btrfs_disk_key * disk ,
u64 val )
2007-03-12 23:22:34 +03:00
{
disk - > objectid = cpu_to_le64 ( val ) ;
}
2007-03-15 19:56:47 +03:00
static inline u64 btrfs_disk_key_offset ( struct btrfs_disk_key * disk )
2007-03-12 23:22:34 +03:00
{
return le64_to_cpu ( disk - > offset ) ;
}
2007-03-15 19:56:47 +03:00
static inline void btrfs_set_disk_key_offset ( struct btrfs_disk_key * disk ,
u64 val )
2007-03-12 23:22:34 +03:00
{
disk - > offset = cpu_to_le64 ( val ) ;
}
2007-03-15 19:56:47 +03:00
static inline u32 btrfs_disk_key_flags ( struct btrfs_disk_key * disk )
2007-03-12 23:22:34 +03:00
{
return le32_to_cpu ( disk - > flags ) ;
}
2007-03-15 19:56:47 +03:00
static inline void btrfs_set_disk_key_flags ( struct btrfs_disk_key * disk ,
u32 val )
2007-03-12 23:22:34 +03:00
{
disk - > flags = cpu_to_le32 ( val ) ;
}
2007-04-05 20:13:21 +04:00
static inline u32 btrfs_key_overflow ( struct btrfs_key * key )
{
u32 over = key - > flags & BTRFS_KEY_OVERFLOW_MASK ;
return over > > BTRFS_KEY_OVERFLOW_SHIFT ;
}
static inline void btrfs_set_key_overflow ( struct btrfs_key * key , u32 over )
{
2007-04-09 18:42:37 +04:00
BUG_ON ( over > = BTRFS_KEY_OVERFLOW_MAX ) ;
2007-04-05 20:13:21 +04:00
over = over < < BTRFS_KEY_OVERFLOW_SHIFT ;
key - > flags = ( key - > flags & ~ ( ( u64 ) BTRFS_KEY_OVERFLOW_MASK ) ) | over ;
}
2007-03-15 19:56:47 +03:00
static inline u32 btrfs_key_type ( struct btrfs_key * key )
{
return key - > flags & BTRFS_KEY_TYPE_MASK ;
}
static inline u32 btrfs_disk_key_type ( struct btrfs_disk_key * key )
{
return le32_to_cpu ( key - > flags ) & BTRFS_KEY_TYPE_MASK ;
}
static inline void btrfs_set_key_type ( struct btrfs_key * key , u32 type )
{
BUG_ON ( type > = BTRFS_KEY_TYPE_MAX ) ;
key - > flags = ( key - > flags & ~ ( ( u64 ) BTRFS_KEY_TYPE_MASK ) ) | type ;
}
static inline void btrfs_set_disk_key_type ( struct btrfs_disk_key * key , u32 type )
{
u32 flags = btrfs_disk_key_flags ( key ) ;
BUG_ON ( type > = BTRFS_KEY_TYPE_MAX ) ;
flags = ( flags & ~ ( ( u64 ) BTRFS_KEY_TYPE_MASK ) ) | type ;
btrfs_set_disk_key_flags ( key , flags ) ;
2007-04-05 20:13:21 +04:00
}
static inline u32 btrfs_disk_key_overflow ( struct btrfs_disk_key * key )
{
u32 over = le32_to_cpu ( key - > flags ) & BTRFS_KEY_OVERFLOW_MASK ;
return over > > BTRFS_KEY_OVERFLOW_SHIFT ;
}
static inline void btrfs_set_disK_key_overflow ( struct btrfs_disk_key * key ,
u32 over )
{
u32 flags = btrfs_disk_key_flags ( key ) ;
2007-04-09 18:42:37 +04:00
BUG_ON ( over > = BTRFS_KEY_OVERFLOW_MAX ) ;
2007-04-05 20:13:21 +04:00
over = over < < BTRFS_KEY_OVERFLOW_SHIFT ;
flags = ( flags & ~ ( ( u64 ) BTRFS_KEY_OVERFLOW_MASK ) ) | over ;
btrfs_set_disk_key_flags ( key , flags ) ;
2007-03-15 19:56:47 +03:00
}
2007-03-12 19:29:44 +03:00
static inline u64 btrfs_header_blocknr ( struct btrfs_header * h )
2007-03-12 19:01:18 +03:00
{
2007-03-12 19:29:44 +03:00
return le64_to_cpu ( h - > blocknr ) ;
2007-03-12 19:01:18 +03:00
}
2007-03-12 19:29:44 +03:00
static inline void btrfs_set_header_blocknr ( struct btrfs_header * h , u64 blocknr )
2007-03-12 19:01:18 +03:00
{
2007-03-12 19:29:44 +03:00
h - > blocknr = cpu_to_le64 ( blocknr ) ;
2007-03-12 19:01:18 +03:00
}
2007-03-23 22:56:19 +03:00
static inline u64 btrfs_header_generation ( struct btrfs_header * h )
{
return le64_to_cpu ( h - > generation ) ;
}
static inline void btrfs_set_header_generation ( struct btrfs_header * h ,
u64 val )
{
h - > generation = cpu_to_le64 ( val ) ;
}
2007-03-12 19:29:44 +03:00
static inline u16 btrfs_header_nritems ( struct btrfs_header * h )
2007-03-12 19:01:18 +03:00
{
2007-03-12 19:29:44 +03:00
return le16_to_cpu ( h - > nritems ) ;
2007-03-12 19:01:18 +03:00
}
2007-03-12 19:29:44 +03:00
static inline void btrfs_set_header_nritems ( struct btrfs_header * h , u16 val )
2007-03-12 19:01:18 +03:00
{
2007-03-12 19:29:44 +03:00
h - > nritems = cpu_to_le16 ( val ) ;
2007-03-12 19:01:18 +03:00
}
2007-03-12 19:29:44 +03:00
static inline u16 btrfs_header_flags ( struct btrfs_header * h )
2007-03-12 19:01:18 +03:00
{
2007-03-12 19:29:44 +03:00
return le16_to_cpu ( h - > flags ) ;
2007-03-12 19:01:18 +03:00
}
2007-03-12 19:29:44 +03:00
static inline void btrfs_set_header_flags ( struct btrfs_header * h , u16 val )
2007-03-12 19:01:18 +03:00
{
2007-03-12 19:29:44 +03:00
h - > flags = cpu_to_le16 ( val ) ;
2007-03-12 19:01:18 +03:00
}
2007-03-12 19:29:44 +03:00
static inline int btrfs_header_level ( struct btrfs_header * h )
2007-03-12 19:01:18 +03:00
{
2007-03-27 17:06:38 +04:00
return h - > level ;
2007-03-12 19:01:18 +03:00
}
2007-03-12 19:29:44 +03:00
static inline void btrfs_set_header_level ( struct btrfs_header * h , int level )
2007-03-12 19:01:18 +03:00
{
2007-03-13 17:46:10 +03:00
BUG_ON ( level > BTRFS_MAX_LEVEL ) ;
2007-03-27 17:06:38 +04:00
h - > level = level ;
2007-03-12 19:01:18 +03:00
}
2007-03-13 17:46:10 +03:00
static inline int btrfs_is_leaf ( struct btrfs_node * n )
2007-03-12 19:01:18 +03:00
{
return ( btrfs_header_level ( & n - > header ) = = 0 ) ;
}
2007-03-13 23:47:54 +03:00
static inline u64 btrfs_root_blocknr ( struct btrfs_root_item * item )
{
return le64_to_cpu ( item - > blocknr ) ;
}
static inline void btrfs_set_root_blocknr ( struct btrfs_root_item * item , u64 val )
{
item - > blocknr = cpu_to_le64 ( val ) ;
}
2007-04-06 23:37:36 +04:00
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 ) ;
}
2007-03-13 23:47:54 +03:00
static inline u32 btrfs_root_refs ( struct btrfs_root_item * item )
{
return le32_to_cpu ( item - > refs ) ;
}
static inline void btrfs_set_root_refs ( struct btrfs_root_item * item , u32 val )
{
item - > refs = cpu_to_le32 ( val ) ;
}
static inline u64 btrfs_super_blocknr ( struct btrfs_super_block * s )
{
return le64_to_cpu ( s - > blocknr ) ;
}
static inline void btrfs_set_super_blocknr ( struct btrfs_super_block * s , u64 val )
{
s - > blocknr = cpu_to_le64 ( val ) ;
}
2007-04-09 18:42:37 +04:00
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 ) ;
}
2007-03-13 23:47:54 +03:00
static inline u64 btrfs_super_root ( struct btrfs_super_block * s )
{
return le64_to_cpu ( s - > root ) ;
}
static inline void btrfs_set_super_root ( struct btrfs_super_block * s , u64 val )
{
s - > root = cpu_to_le64 ( val ) ;
}
static inline u64 btrfs_super_total_blocks ( struct btrfs_super_block * s )
{
return le64_to_cpu ( s - > total_blocks ) ;
}
static inline void btrfs_set_super_total_blocks ( struct btrfs_super_block * s ,
u64 val )
{
s - > total_blocks = cpu_to_le64 ( val ) ;
}
static inline u64 btrfs_super_blocks_used ( struct btrfs_super_block * s )
{
return le64_to_cpu ( s - > blocks_used ) ;
}
static inline void btrfs_set_super_blocks_used ( struct btrfs_super_block * s ,
u64 val )
{
s - > blocks_used = cpu_to_le64 ( val ) ;
}
2007-03-14 21:14:43 +03:00
static inline u32 btrfs_super_blocksize ( struct btrfs_super_block * s )
2007-03-13 23:47:54 +03:00
{
2007-03-14 21:14:43 +03:00
return le32_to_cpu ( s - > blocksize ) ;
2007-03-13 23:47:54 +03:00
}
static inline void btrfs_set_super_blocksize ( struct btrfs_super_block * s ,
2007-03-14 21:14:43 +03:00
u32 val )
{
s - > blocksize = cpu_to_le32 ( val ) ;
}
2007-03-21 18:12:56 +03:00
static inline u64 btrfs_super_root_dir ( struct btrfs_super_block * s )
{
return le64_to_cpu ( s - > root_dir_objectid ) ;
}
static inline void btrfs_set_super_root_dir ( struct btrfs_super_block * s , u64
val )
{
s - > root_dir_objectid = cpu_to_le64 ( val ) ;
}
2007-04-11 21:57:44 +04:00
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 ) ;
}
2007-03-14 21:14:43 +03:00
static inline u8 * btrfs_leaf_data ( struct btrfs_leaf * l )
2007-03-13 23:47:54 +03:00
{
2007-03-14 21:14:43 +03:00
return ( u8 * ) l - > items ;
2007-03-13 23:47:54 +03:00
}
2007-03-20 21:38:32 +03:00
static inline u64 btrfs_file_extent_disk_blocknr ( struct btrfs_file_extent_item
* e )
{
return le64_to_cpu ( e - > disk_blocknr ) ;
}
static inline void btrfs_set_file_extent_disk_blocknr ( struct
btrfs_file_extent_item
* e , u64 val )
{
e - > disk_blocknr = cpu_to_le64 ( val ) ;
}
2007-03-27 17:16:29 +04:00
static inline u64 btrfs_file_extent_generation ( struct btrfs_file_extent_item * e )
{
return le64_to_cpu ( e - > generation ) ;
}
static inline void btrfs_set_file_extent_generation ( struct
btrfs_file_extent_item * e ,
u64 val )
{
e - > generation = cpu_to_le64 ( val ) ;
}
2007-03-20 21:38:32 +03:00
static inline u64 btrfs_file_extent_disk_num_blocks ( struct
btrfs_file_extent_item * e )
{
return le64_to_cpu ( e - > disk_num_blocks ) ;
}
static inline void btrfs_set_file_extent_disk_num_blocks ( struct
btrfs_file_extent_item
* e , u64 val )
{
e - > disk_num_blocks = cpu_to_le64 ( val ) ;
}
static inline u64 btrfs_file_extent_offset ( struct btrfs_file_extent_item * e )
{
return le64_to_cpu ( e - > offset ) ;
}
static inline void btrfs_set_file_extent_offset ( struct btrfs_file_extent_item
* e , u64 val )
{
e - > offset = cpu_to_le64 ( val ) ;
}
static inline u64 btrfs_file_extent_num_blocks ( struct btrfs_file_extent_item
* e )
{
return le64_to_cpu ( e - > num_blocks ) ;
}
static inline void btrfs_set_file_extent_num_blocks ( struct
btrfs_file_extent_item * e ,
u64 val )
{
e - > num_blocks = cpu_to_le64 ( val ) ;
}
2007-04-11 21:57:44 +04:00
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 ) ;
}
2007-03-22 19:13:20 +03:00
static inline struct btrfs_root * btrfs_sb ( struct super_block * sb )
{
return sb - > s_fs_info ;
}
2007-03-30 22:27:56 +04:00
static inline void btrfs_check_bounds ( void * vptr , size_t len ,
void * vcontainer , size_t container_len )
{
char * ptr = vptr ;
char * container = vcontainer ;
WARN_ON ( ptr < container ) ;
WARN_ON ( ptr + len > container + container_len ) ;
}
static inline void btrfs_memcpy ( struct btrfs_root * root ,
void * dst_block ,
void * dst , const void * src , size_t nr )
{
btrfs_check_bounds ( dst , nr , dst_block , root - > fs_info - > sb - > s_blocksize ) ;
memcpy ( dst , src , nr ) ;
}
static inline void btrfs_memmove ( struct btrfs_root * root ,
void * dst_block ,
void * dst , void * src , size_t nr )
{
btrfs_check_bounds ( dst , nr , dst_block , root - > fs_info - > sb - > s_blocksize ) ;
memmove ( dst , src , nr ) ;
}
static inline void btrfs_mark_buffer_dirty ( struct buffer_head * bh )
{
WARN_ON ( ! atomic_read ( & bh - > b_count ) ) ;
mark_buffer_dirty ( bh ) ;
}
2007-03-14 17:31:29 +03:00
/* helper function to cast into the data area of the leaf. */
# define btrfs_item_ptr(leaf, slot, type) \
2007-03-14 21:14:43 +03:00
( ( type * ) ( btrfs_leaf_data ( leaf ) + \
btrfs_item_offset ( ( leaf ) - > items + ( slot ) ) ) )
2007-03-14 17:31:29 +03:00
2007-03-27 00:00:06 +04:00
/* extent-item.c */
2007-04-10 17:27:04 +04:00
int btrfs_inc_root_ref ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ) ;
2007-03-22 19:13:20 +03:00
struct buffer_head * btrfs_alloc_free_block ( struct btrfs_trans_handle * trans ,
2007-03-16 23:20:31 +03:00
struct btrfs_root * root ) ;
2007-03-27 00:00:06 +04:00
int btrfs_alloc_extent ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , u64 num_blocks , u64 search_start , u64
2007-04-10 20:36:36 +04:00
search_end , struct btrfs_key * ins ) ;
2007-03-16 23:20:31 +03:00
int btrfs_inc_ref ( struct btrfs_trans_handle * trans , struct btrfs_root * root ,
2007-03-22 19:13:20 +03:00
struct buffer_head * buf ) ;
2007-03-16 23:20:31 +03:00
int btrfs_free_extent ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , u64 blocknr , u64 num_blocks , int pin ) ;
2007-03-27 00:00:06 +04:00
int btrfs_finish_extent_commit ( struct btrfs_trans_handle * trans , struct
btrfs_root * root ) ;
/* ctree.c */
2007-03-16 23:20:31 +03:00
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 ) ;
2007-03-13 17:46:10 +03:00
void btrfs_release_path ( struct btrfs_root * root , struct btrfs_path * p ) ;
2007-04-02 18:50:19 +04:00
struct btrfs_path * btrfs_alloc_path ( void ) ;
void btrfs_free_path ( struct btrfs_path * p ) ;
2007-03-13 17:46:10 +03:00
void btrfs_init_path ( struct btrfs_path * p ) ;
2007-03-16 23:20:31 +03:00
int btrfs_del_item ( struct btrfs_trans_handle * trans , struct btrfs_root * root ,
struct btrfs_path * path ) ;
int btrfs_insert_item ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , struct btrfs_key * key , void * data , u32 data_size ) ;
int btrfs_insert_empty_item ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , struct btrfs_path * path , struct btrfs_key
* cpu_key , u32 data_size ) ;
2007-03-13 17:46:10 +03:00
int btrfs_next_leaf ( struct btrfs_root * root , struct btrfs_path * path ) ;
2007-03-14 21:14:43 +03:00
int btrfs_leaf_free_space ( struct btrfs_root * root , struct btrfs_leaf * leaf ) ;
2007-03-16 23:20:31 +03:00
int btrfs_drop_snapshot ( struct btrfs_trans_handle * trans , struct btrfs_root
2007-03-22 19:13:20 +03:00
* root , struct buffer_head * snap ) ;
2007-03-27 00:00:06 +04:00
/* root-item.c */
2007-03-16 23:20:31 +03:00
int btrfs_del_root ( struct btrfs_trans_handle * trans , struct btrfs_root * root ,
struct btrfs_key * key ) ;
int btrfs_insert_root ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , struct btrfs_key * key , struct btrfs_root_item
* item ) ;
int btrfs_update_root ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , struct btrfs_key * key , struct btrfs_root_item
* item ) ;
int btrfs_find_last_root ( struct btrfs_root * root , u64 objectid , struct
btrfs_root_item * item , struct btrfs_key * key ) ;
2007-03-27 00:00:06 +04:00
/* dir-item.c */
2007-03-16 23:20:31 +03:00
int btrfs_insert_dir_item ( struct btrfs_trans_handle * trans , struct btrfs_root
2007-04-06 23:37:36 +04:00
* root , const char * name , int name_len , u64 dir ,
struct btrfs_key * location , u8 type ) ;
2007-03-16 23:20:31 +03:00
int btrfs_lookup_dir_item ( struct btrfs_trans_handle * trans , struct btrfs_root
2007-03-22 19:13:20 +03:00
* root , struct btrfs_path * path , u64 dir ,
const char * name , int name_len , int mod ) ;
2007-04-05 18:38:44 +04:00
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 ) ;
2007-03-15 22:18:43 +03:00
int btrfs_match_dir_item_name ( struct btrfs_root * root , struct btrfs_path * path ,
2007-03-23 22:56:19 +03:00
const char * name , int name_len ) ;
2007-03-27 00:00:06 +04:00
/* inode-map.c */
2007-03-20 21:38:32 +03:00
int btrfs_find_free_objectid ( struct btrfs_trans_handle * trans ,
struct btrfs_root * fs_root ,
u64 dirid , u64 * objectid ) ;
2007-04-05 21:35:25 +04:00
int btrfs_find_highest_inode ( struct btrfs_root * fs_root , u64 * objectid ) ;
2007-03-27 00:00:06 +04:00
/* inode-item.c */
2007-03-20 22:57:25 +03:00
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
2007-04-06 23:37:36 +04:00
* root , struct btrfs_path * path ,
struct btrfs_key * location , int mod ) ;
2007-03-27 00:00:06 +04:00
/* file-item.c */
int btrfs_alloc_file_extent ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
u64 objectid , u64 offset ,
u64 num_blocks , u64 hint_block ,
u64 * result ) ;
int btrfs_lookup_file_extent ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 objectid ,
2007-03-27 19:26:26 +04:00
u64 blocknr , int mod ) ;
2007-03-29 23:15:27 +04:00
int btrfs_csum_file_block ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
u64 objectid , u64 offset ,
char * data , size_t len ) ;
int btrfs_csum_verify_file_block ( struct btrfs_root * root ,
u64 objectid , u64 offset ,
char * data , size_t len ) ;
2007-04-06 23:37:36 +04:00
/* super.c */
extern struct subsystem btrfs_subsys ;
2007-02-02 17:18:22 +03:00
# endif