2007-06-12 17:07:21 +04:00
/*
* Copyright ( C ) 2007 Oracle . All rights reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public
* License v2 as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public
* License along with this program ; if not , write to the
* Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
* Boston , MA 021110 - 1307 , USA .
*/
2008-01-08 23:46:30 +03:00
# ifndef __BTRFS_CTREE__
# define __BTRFS_CTREE__
2007-02-02 17:18:22 +03:00
2007-12-19 00:15:09 +03:00
# include <linux/version.h>
2007-10-16 00:18:55 +04:00
# include <linux/mm.h>
# include <linux/highmem.h>
2007-03-22 19:13:20 +03:00
# include <linux/fs.h>
2007-06-08 23:33:54 +04:00
# include <linux/workqueue.h>
2007-08-29 23:47:34 +04:00
# include <linux/completion.h>
2008-03-26 17:28:07 +03:00
# include <linux/backing-dev.h>
2007-10-16 00:14:27 +04:00
# include <asm/kmap_types.h>
2007-03-26 18:15:30 +04:00
# include "bit-radix.h"
2008-01-25 00:13:08 +03:00
# include "extent_io.h"
2007-10-16 00:14:19 +04:00
# include "extent_map.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-05-02 23:53:43 +04:00
extern struct kmem_cache * btrfs_trans_handle_cachep ;
extern struct kmem_cache * btrfs_transaction_cachep ;
extern struct kmem_cache * btrfs_bit_radix_cachep ;
2007-04-02 18:50:19 +04:00
extern struct kmem_cache * btrfs_path_cachep ;
2007-03-16 23:20:31 +03:00
2008-03-24 22:02:07 +03:00
# define BTRFS_MAGIC "_B5RfS_M"
2007-02-02 17:18:22 +03:00
2007-12-13 19:13:32 +03:00
# define BTRFS_MAX_LEVEL 8
2008-03-24 22:01:56 +03:00
/* holds pointers to all of the tree roots */
2007-03-27 14:33:00 +04:00
# define BTRFS_ROOT_TREE_OBJECTID 1ULL
2008-03-24 22:01:56 +03:00
/* stores information about which extents are in use, and reference counts */
2007-06-09 17:22:25 +04:00
# define BTRFS_EXTENT_TREE_OBJECTID 2ULL
2008-03-24 22:01:56 +03:00
/*
* chunk tree stores translations from logical - > physical block numbering
* the super block points to the chunk tree
*/
2008-03-24 22:02:07 +03:00
# define BTRFS_CHUNK_TREE_OBJECTID 3ULL
2008-03-24 22:01:56 +03:00
/*
* stores information about which areas of a given device are in use .
* one per device . The tree of tree roots points to the device tree
*/
2008-03-24 22:02:07 +03:00
# define BTRFS_DEV_TREE_OBJECTID 4ULL
/* one per subvolume, storing files and directories */
# define BTRFS_FS_TREE_OBJECTID 5ULL
/* directory objectid inside the root tree */
# define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
2008-03-24 22:01:56 +03:00
/*
* All files have objectids higher than this .
*/
2007-12-13 19:13:32 +03:00
# define BTRFS_FIRST_FREE_OBJECTID 256ULL
2007-03-13 23:47:54 +03:00
2008-03-24 22:01:56 +03:00
/*
* the device items go into the chunk tree . The key is in the form
* [ 1 BTRFS_DEV_ITEM_KEY device_id ]
*/
# define BTRFS_DEV_ITEMS_OBJECTID 1ULL
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-05-10 20:36:17 +04:00
/* four bytes for CRC32 */
# define BTRFS_CRC32_SIZE 4
2007-12-12 22:38:19 +03:00
# define BTRFS_EMPTY_DIR_SIZE 0
2007-03-29 23:15:27 +04:00
2007-06-08 06:13:21 +04:00
# define BTRFS_FT_UNKNOWN 0
# define BTRFS_FT_REG_FILE 1
# define BTRFS_FT_DIR 2
# define BTRFS_FT_CHRDEV 3
# define BTRFS_FT_BLKDEV 4
# define BTRFS_FT_FIFO 5
# define BTRFS_FT_SOCK 6
# define BTRFS_FT_SYMLINK 7
2007-11-16 19:45:54 +03:00
# define BTRFS_FT_XATTR 8
# define BTRFS_FT_MAX 9
2007-06-08 06:13:21 +04:00
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-10-16 00:14:19 +04:00
u8 type ;
2007-04-17 23:39:32 +04:00
__le64 offset ;
2007-03-12 23:22:34 +03:00
} __attribute__ ( ( __packed__ ) ) ;
struct btrfs_key {
2007-02-02 17:18:22 +03:00
u64 objectid ;
2007-10-16 00:14:19 +04:00
u8 type ;
2007-04-17 23:39:32 +04:00
u64 offset ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2008-03-24 22:01:56 +03:00
struct btrfs_mapping_tree {
struct extent_map_tree map_tree ;
} ;
# define BTRFS_DEV_UUID_SIZE 16
struct btrfs_dev_item {
/* the internal btrfs device id */
__le64 devid ;
/* size of the device */
__le64 total_bytes ;
/* bytes used */
__le64 bytes_used ;
/* optimal io alignment for this device */
__le32 io_align ;
/* optimal io width for this device */
__le32 io_width ;
/* minimal io size for this device */
__le32 sector_size ;
/* type and info about this device */
__le64 type ;
2008-03-24 22:02:07 +03:00
/* btrfs generated uuid for this device */
2008-03-24 22:01:56 +03:00
u8 uuid [ BTRFS_DEV_UUID_SIZE ] ;
} __attribute__ ( ( __packed__ ) ) ;
struct btrfs_stripe {
__le64 devid ;
__le64 offset ;
} __attribute__ ( ( __packed__ ) ) ;
struct btrfs_chunk {
__le64 owner ;
__le64 stripe_len ;
__le64 type ;
/* optimal io alignment for this chunk */
__le32 io_align ;
/* optimal io width for this chunk */
__le32 io_width ;
/* minimal io size for this chunk */
__le32 sector_size ;
/* 2^16 stripes is quite a lot, a second limit is the size of a single
* item in the btree
*/
__le16 num_stripes ;
struct btrfs_stripe stripe ;
/* additional stripes go here */
} __attribute__ ( ( __packed__ ) ) ;
static inline unsigned long btrfs_chunk_item_size ( int num_stripes )
{
BUG_ON ( num_stripes = = 0 ) ;
return sizeof ( struct btrfs_chunk ) +
sizeof ( struct btrfs_stripe ) * ( num_stripes - 1 ) ;
}
2007-10-16 00:14:19 +04:00
# define BTRFS_FSID_SIZE 16
2008-04-01 19:21:32 +04:00
# define BTRFS_HEADER_FLAG_WRITTEN (1 << 0)
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-10-16 00:14:19 +04:00
u8 fsid [ BTRFS_FSID_SIZE ] ; /* FS specific uuid */
2007-10-16 00:15:53 +04:00
__le64 bytenr ; /* which block this node is supposed to live in */
2008-04-01 19:21:32 +04:00
__le64 flags ;
2007-03-23 22:56:19 +03:00
__le64 generation ;
2007-04-21 04:23:12 +04:00
__le64 owner ;
2007-10-16 00:14:19 +04:00
__le32 nritems ;
2007-03-27 17:06:38 +04:00
u8 level ;
2007-02-02 17:18:22 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-10-16 00:14:19 +04:00
# define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->nodesize - \
2007-03-14 21:14:43 +03:00
sizeof ( struct btrfs_header ) ) / \
2007-12-11 17:25:06 +03:00
sizeof ( struct btrfs_key_ptr ) )
2007-03-14 21:14:43 +03:00
# define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
2007-10-16 00:14:19 +04:00
# define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->leafsize))
2007-04-19 21:37:44 +04:00
# define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
sizeof ( struct btrfs_item ) - \
sizeof ( struct btrfs_file_extent_item ) )
2007-02-02 17:18:22 +03:00
2008-03-24 22:01:56 +03:00
/*
* this is a very generous portion of the super block , giving us
* room to translate 14 chunks with 3 stripes each .
*/
# define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
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 ] ;
2008-04-01 19:21:32 +04:00
/* the first 4 fields must match struct btrfs_header */
2007-03-13 23:47:54 +03:00
u8 fsid [ 16 ] ; /* FS specific uuid */
2007-10-16 00:15:53 +04:00
__le64 bytenr ; /* this block number */
2008-04-01 19:21:32 +04:00
__le64 flags ;
2007-03-13 23:47:54 +03:00
__le64 magic ;
__le64 generation ;
__le64 root ;
2008-03-24 22:01:56 +03:00
__le64 chunk_root ;
2007-10-16 00:15:53 +04:00
__le64 total_bytes ;
__le64 bytes_used ;
2007-03-21 18:12:56 +03:00
__le64 root_dir_objectid ;
2008-03-24 22:02:07 +03:00
__le64 num_devices ;
2007-10-16 00:14:19 +04:00
__le32 sectorsize ;
__le32 nodesize ;
__le32 leafsize ;
2007-11-30 19:30:34 +03:00
__le32 stripesize ;
2008-03-24 22:01:56 +03:00
__le32 sys_chunk_array_size ;
2007-10-16 00:15:53 +04:00
u8 root_level ;
2008-03-24 22:01:56 +03:00
u8 chunk_root_level ;
2008-03-24 22:02:07 +03:00
struct btrfs_dev_item dev_item ;
2008-03-24 22:01:56 +03:00
u8 sys_chunk_array [ BTRFS_SYSTEM_CHUNK_ARRAY_SIZE ] ;
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-10-16 00:14:19 +04:00
__le32 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 ;
2007-12-11 17:25:06 +03:00
__le64 generation ;
2007-03-14 21:14:43 +03:00
} __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-10-16 00:14:19 +04:00
struct extent_buffer * nodes [ BTRFS_MAX_LEVEL ] ;
2007-03-13 17:46:10 +03:00
int slots [ BTRFS_MAX_LEVEL ] ;
2007-08-07 23:52:22 +04:00
int reada ;
2007-08-08 00:15:09 +04:00
int lowest_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 ;
2007-12-11 17:25:06 +03:00
} __attribute__ ( ( __packed__ ) ) ;
struct btrfs_extent_ref {
__le64 root ;
__le64 generation ;
__le64 objectid ;
__le64 offset ;
2007-03-15 19:56:47 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2008-03-24 22:01:56 +03:00
/* dev extents record free space on individual devices. The owner
* field points back to the chunk allocation mapping tree that allocated
* the extent
*/
struct btrfs_dev_extent {
__le64 owner ;
__le64 length ;
} __attribute__ ( ( __packed__ ) ) ;
2007-12-12 22:38:19 +03:00
struct btrfs_inode_ref {
__le16 name_len ;
/* name goes here */
} __attribute__ ( ( __packed__ ) ) ;
2008-03-24 22:01:56 +03:00
struct btrfs_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 ;
2007-04-30 23:25:45 +04:00
__le64 block_group ;
2007-03-16 02:03:33 +03:00
__le32 nlink ;
__le32 uid ;
__le32 gid ;
__le32 mode ;
2008-03-24 22:01:56 +03:00
__le64 rdev ;
2007-03-16 02:03:33 +03:00
__le16 flags ;
__le16 compat_flags ;
2008-03-24 22:01:56 +03:00
struct btrfs_timespec atime ;
struct btrfs_timespec ctime ;
struct btrfs_timespec mtime ;
struct btrfs_timespec otime ;
2007-03-16 02:03:33 +03:00
} __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-11-16 19:45:54 +03:00
__le16 data_len ;
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-10-16 00:15:53 +04:00
__le64 bytenr ;
__le64 byte_limit ;
__le64 bytes_used ;
2007-06-22 22:16:25 +04:00
__le32 flags ;
2007-03-15 19:56:47 +03:00
__le32 refs ;
2007-06-22 22:16:25 +04:00
struct btrfs_disk_key drop_progress ;
u8 drop_level ;
2007-10-16 00:15:53 +04:00
u8 level ;
2007-03-20 21:38:32 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-03-15 19:56:47 +03:00
2007-04-19 21:37:44 +04:00
# define BTRFS_FILE_EXTENT_REG 0
# define BTRFS_FILE_EXTENT_INLINE 1
2007-03-20 21:38:32 +03:00
struct btrfs_file_extent_item {
2007-03-27 17:16:29 +04:00
__le64 generation ;
2007-04-19 21:37:44 +04:00
u8 type ;
2007-03-20 21:38:32 +03:00
/*
* disk space consumed by the extent , checksum blocks are included
* in these numbers
*/
2007-10-16 00:15:53 +04:00
__le64 disk_bytenr ;
__le64 disk_num_bytes ;
2007-03-20 21:38:32 +03:00
/*
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 )
*/
2007-10-16 00:15:53 +04:00
__le64 num_bytes ;
2007-03-20 21:38:32 +03:00
} __attribute__ ( ( __packed__ ) ) ;
2007-03-29 23:15:27 +04:00
struct btrfs_csum_item {
2007-05-10 20:36:17 +04:00
u8 csum ;
2007-03-29 23:15:27 +04:00
} __attribute__ ( ( __packed__ ) ) ;
2008-03-24 22:01:56 +03:00
/* different types of block groups (and chunks) */
# define BTRFS_BLOCK_GROUP_DATA (1 << 0)
# define BTRFS_BLOCK_GROUP_SYSTEM (1 << 1)
# define BTRFS_BLOCK_GROUP_METADATA (1 << 2)
2008-03-25 23:50:33 +03:00
# define BTRFS_BLOCK_GROUP_RAID0 (1 << 3)
2007-05-30 00:52:18 +04:00
2007-11-06 18:26:29 +03:00
2007-04-27 00:46:15 +04:00
struct btrfs_block_group_item {
__le64 used ;
2008-03-24 22:01:56 +03:00
__le64 chunk_tree ;
__le64 chunk_objectid ;
__le64 flags ;
2007-04-27 00:46:15 +04:00
} __attribute__ ( ( __packed__ ) ) ;
2008-03-24 22:01:59 +03:00
struct btrfs_space_info {
u64 flags ;
u64 total_bytes ;
u64 bytes_used ;
u64 bytes_pinned ;
int full ;
struct list_head list ;
} ;
2007-04-27 00:46:15 +04:00
struct btrfs_block_group_cache {
struct btrfs_key key ;
struct btrfs_block_group_item item ;
2008-03-24 22:01:59 +03:00
struct btrfs_space_info * space_info ;
2007-11-16 22:57:08 +03:00
u64 pinned ;
2008-03-24 22:01:56 +03:00
u64 flags ;
int cached ;
2007-04-27 00:46:15 +04:00
} ;
2008-03-24 22:01:56 +03:00
struct btrfs_device ;
2008-03-24 22:02:07 +03:00
struct btrfs_fs_devices ;
2007-03-20 21:38:32 +03:00
struct btrfs_fs_info {
2007-10-16 00:14:19 +04:00
u8 fsid [ BTRFS_FSID_SIZE ] ;
2007-03-15 19:56:47 +03:00
struct btrfs_root * extent_root ;
struct btrfs_root * tree_root ;
2008-03-24 22:01:56 +03:00
struct btrfs_root * chunk_root ;
struct btrfs_root * dev_root ;
2007-04-09 18:42:37 +04:00
struct radix_tree_root fs_roots_radix ;
2007-10-16 00:15:26 +04:00
2008-01-25 00:13:08 +03:00
struct extent_io_tree free_space_cache ;
struct extent_io_tree block_group_cache ;
struct extent_io_tree pinned_extents ;
struct extent_io_tree pending_del ;
struct extent_io_tree extent_ins ;
2007-10-16 00:15:26 +04:00
2008-03-24 22:01:56 +03:00
/* logical->physical extent mapping */
struct btrfs_mapping_tree mapping_tree ;
2007-03-20 22:57:25 +03:00
u64 generation ;
2007-08-11 00:22:09 +04:00
u64 last_trans_committed ;
2007-12-14 23:30:32 +03:00
unsigned long mount_opt ;
2007-12-18 04:14:04 +03:00
u64 max_extent ;
2008-01-30 00:03:38 +03:00
u64 max_inline ;
2008-01-02 18:01:11 +03:00
u64 alloc_start ;
2007-03-22 22:59:16 +03:00
struct btrfs_transaction * running_transaction ;
2007-06-26 18:06:50 +04:00
struct btrfs_super_block super_copy ;
2007-10-16 00:14:19 +04:00
struct extent_buffer * sb_buffer ;
2008-03-24 22:01:56 +03:00
struct block_device * __bdev ;
2007-03-22 19:13:20 +03:00
struct super_block * sb ;
2007-03-28 21:57:48 +04:00
struct inode * btree_inode ;
2008-03-26 17:28:07 +03:00
struct backing_dev_info bdi ;
2007-10-16 00:19:22 +04:00
spinlock_t hash_lock ;
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-04-20 05:01:03 +04:00
struct list_head trans_list ;
2007-10-16 00:19:22 +04:00
struct list_head hashers ;
2007-06-09 02:11:48 +04:00
struct list_head dead_roots ;
2007-12-19 00:15:09 +03:00
# if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18)
struct work_struct trans_work ;
# else
2007-06-08 23:33:54 +04:00
struct delayed_work trans_work ;
2007-12-19 00:15:09 +03:00
# endif
2007-08-29 23:47:34 +04:00
struct kobject super_kobj ;
struct completion kobj_unregister ;
2007-04-20 21:16:02 +04:00
int do_barriers ;
2007-06-09 02:11:48 +04:00
int closing ;
2008-01-08 23:46:30 +03:00
unsigned long throttles ;
2007-03-20 21:38:32 +03:00
2007-11-16 22:57:08 +03:00
u64 total_pinned ;
2008-03-24 22:01:56 +03:00
struct list_head dirty_cowonly_roots ;
2008-03-24 22:02:07 +03:00
struct btrfs_fs_devices * fs_devices ;
2008-03-24 22:01:59 +03:00
struct list_head space_info ;
2007-12-22 00:27:21 +03:00
spinlock_t delalloc_lock ;
2008-01-15 16:40:48 +03:00
spinlock_t new_trans_lock ;
2007-12-22 00:27:21 +03:00
u64 delalloc_bytes ;
2008-01-18 18:54:22 +03:00
u64 last_alloc ;
2008-02-01 00:45:07 +03:00
u64 last_data_alloc ;
2008-03-25 23:50:33 +03:00
int extra_data_alloc_bits ;
int extra_alloc_bits ;
2007-11-16 22:57:08 +03:00
} ;
2008-03-24 22:01:56 +03:00
2007-03-20 21:38:32 +03:00
/*
* in ram representation of the tree . extent_root is used for all allocations
2007-04-25 23:52:25 +04:00
* and for the extent tree extent_root root .
2007-03-20 21:38:32 +03:00
*/
struct btrfs_root {
2007-10-16 00:14:19 +04:00
struct extent_buffer * node ;
struct extent_buffer * 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 ;
2007-08-29 23:47:34 +04:00
struct kobject root_kobj ;
struct completion kobj_unregister ;
2007-04-09 18:42:37 +04:00
u64 objectid ;
u64 last_trans ;
2007-10-16 00:14:19 +04:00
/* data allocations are done in sectorsize units */
u32 sectorsize ;
/* node allocations are done in nodesize units */
u32 nodesize ;
/* leaf allocations are done in leafsize units */
u32 leafsize ;
2007-11-30 19:30:34 +03:00
u32 stripesize ;
2007-03-20 21:38:32 +03:00
u32 type ;
2007-04-10 20:13:09 +04:00
u64 highest_inode ;
u64 last_inode_alloc ;
2007-08-07 23:52:19 +04:00
int ref_cows ;
2008-03-24 22:01:56 +03:00
int track_dirty ;
2007-08-08 00:15:09 +04:00
struct btrfs_key defrag_progress ;
int defrag_running ;
int defrag_level ;
2007-08-29 23:47:34 +04:00
char * name ;
2008-01-03 17:08:48 +03:00
int in_sysfs ;
2008-03-24 22:01:56 +03:00
/* the dirty list is only used by non-reference counted roots */
struct list_head dirty_list ;
2007-03-15 19:56:47 +03:00
} ;
2007-03-16 02:03:33 +03:00
/*
2008-03-24 22:01:56 +03:00
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-04-27 00:46:15 +04:00
# define BTRFS_INODE_ITEM_KEY 1
2007-12-12 22:38:19 +03:00
# define BTRFS_INODE_REF_KEY 2
# define BTRFS_XATTR_ITEM_KEY 8
2007-04-27 00:46:15 +04:00
/* reserve 2-15 close to the inode for later flexibility */
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-04-27 00:46:15 +04:00
# define BTRFS_DIR_ITEM_KEY 16
# define BTRFS_DIR_INDEX_KEY 17
2007-03-16 02:03:33 +03:00
/*
2007-04-27 00:46:15 +04:00
* extent data is for file data
2007-03-16 02:03:33 +03:00
*/
2007-04-27 00:46:15 +04:00
# define BTRFS_EXTENT_DATA_KEY 18
2007-03-29 23:15:27 +04:00
/*
* csum items have the checksums for data in the extents
*/
2007-04-27 00:46:15 +04:00
# define BTRFS_CSUM_ITEM_KEY 19
/* reserve 20-31 for other file stuff */
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-27 00:46:15 +04:00
# define BTRFS_ROOT_ITEM_KEY 32
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-27 00:46:15 +04:00
# define BTRFS_EXTENT_ITEM_KEY 33
2007-12-11 17:25:06 +03:00
# define BTRFS_EXTENT_REF_KEY 34
2007-04-27 00:46:15 +04:00
/*
* block groups give us hints into the extent allocation trees . Which
* blocks are free etc etc
*/
2007-12-11 17:25:06 +03:00
# define BTRFS_BLOCK_GROUP_ITEM_KEY 50
2007-03-20 21:38:32 +03:00
2008-03-24 22:01:56 +03:00
# define BTRFS_DEV_EXTENT_KEY 75
# define BTRFS_DEV_ITEM_KEY 76
# define BTRFS_CHUNK_ITEM_KEY 77
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-27 00:46:15 +04:00
# define BTRFS_STRING_ITEM_KEY 253
2008-01-09 17:23:21 +03:00
# define BTRFS_MOUNT_NODATASUM (1 << 0)
# define BTRFS_MOUNT_NODATACOW (1 << 1)
# define BTRFS_MOUNT_NOBARRIER (1 << 2)
2008-01-18 18:54:22 +03:00
# define BTRFS_MOUNT_SSD (1 << 3)
2007-12-14 23:30:32 +03:00
# define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt)
# define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt)
# define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \
BTRFS_MOUNT_ # # opt )
2008-01-08 23:54:37 +03:00
/*
* Inode flags
*/
2008-01-14 21:26:08 +03:00
# define BTRFS_INODE_NODATASUM (1 << 0)
# define BTRFS_INODE_NODATACOW (1 << 1)
# define BTRFS_INODE_READONLY (1 << 2)
2008-01-08 23:54:37 +03:00
# define btrfs_clear_flag(inode, flag) (BTRFS_I(inode)->flags &= \
~ BTRFS_INODE_ # # flag )
# define btrfs_set_flag(inode, flag) (BTRFS_I(inode)->flags |= \
BTRFS_INODE_ # # flag )
# define btrfs_test_flag(inode, flag) (BTRFS_I(inode)->flags & \
BTRFS_INODE_ # # flag )
2007-10-16 00:14:19 +04:00
/* some macros to generate set/get funcs for the struct fields. This
* assumes there is a lefoo_to_cpu for every type , so lets make a simple
* one for u8 :
*/
# define le8_to_cpu(v) (v)
# define cpu_to_le8(v) (v)
# define __le8 u8
# define read_eb_member(eb, ptr, type, member, result) ( \
read_extent_buffer ( eb , ( char * ) ( result ) , \
( ( unsigned long ) ( ptr ) ) + \
offsetof ( type , member ) , \
sizeof ( ( ( type * ) 0 ) - > member ) ) )
# define write_eb_member(eb, ptr, type, member, result) ( \
write_extent_buffer ( eb , ( char * ) ( result ) , \
( ( unsigned long ) ( ptr ) ) + \
offsetof ( type , member ) , \
sizeof ( ( ( type * ) 0 ) - > member ) ) )
2007-10-16 00:18:56 +04:00
# ifndef BTRFS_SETGET_FUNCS
2007-10-16 00:14:19 +04:00
# define BTRFS_SETGET_FUNCS(name, type, member, bits) \
2007-10-16 00:18:56 +04:00
u # # bits btrfs_ # # name ( struct extent_buffer * eb , type * s ) ; \
void btrfs_set_ # # name ( struct extent_buffer * eb , type * s , u # # bits val ) ;
# endif
2007-10-16 00:14:19 +04:00
# define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
static inline u # # bits btrfs_ # # name ( struct extent_buffer * eb ) \
{ \
2008-02-15 18:40:52 +03:00
type * p = kmap_atomic ( eb - > first_page , KM_USER0 ) ; \
u # # bits res = le # # bits # # _to_cpu ( p - > member ) ; \
kunmap_atomic ( p , KM_USER0 ) ; \
2007-10-16 00:18:55 +04:00
return res ; \
2007-10-16 00:14:19 +04:00
} \
static inline void btrfs_set_ # # name ( struct extent_buffer * eb , \
u # # bits val ) \
{ \
2008-02-15 18:40:52 +03:00
type * p = kmap_atomic ( eb - > first_page , KM_USER0 ) ; \
p - > member = cpu_to_le # # bits ( val ) ; \
kunmap_atomic ( p , KM_USER0 ) ; \
2007-10-16 00:14:19 +04:00
}
2007-04-27 00:46:15 +04:00
2007-10-16 00:14:19 +04:00
# define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \
static inline u # # bits btrfs_ # # name ( type * s ) \
{ \
return le # # bits # # _to_cpu ( s - > member ) ; \
} \
static inline void btrfs_set_ # # name ( type * s , u # # bits val ) \
{ \
s - > member = cpu_to_le # # bits ( val ) ; \
2007-03-16 02:03:33 +03:00
}
2008-03-24 22:01:56 +03:00
BTRFS_SETGET_FUNCS ( device_type , struct btrfs_dev_item , type , 64 ) ;
BTRFS_SETGET_FUNCS ( device_total_bytes , struct btrfs_dev_item , total_bytes , 64 ) ;
BTRFS_SETGET_FUNCS ( device_bytes_used , struct btrfs_dev_item , bytes_used , 64 ) ;
BTRFS_SETGET_FUNCS ( device_io_align , struct btrfs_dev_item , io_align , 32 ) ;
BTRFS_SETGET_FUNCS ( device_io_width , struct btrfs_dev_item , io_width , 32 ) ;
BTRFS_SETGET_FUNCS ( device_sector_size , struct btrfs_dev_item , sector_size , 32 ) ;
BTRFS_SETGET_FUNCS ( device_id , struct btrfs_dev_item , devid , 64 ) ;
2008-03-24 22:02:07 +03:00
BTRFS_SETGET_STACK_FUNCS ( stack_device_type , struct btrfs_dev_item , type , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_device_total_bytes , struct btrfs_dev_item ,
total_bytes , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_device_bytes_used , struct btrfs_dev_item ,
bytes_used , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_device_io_align , struct btrfs_dev_item ,
io_align , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_device_io_width , struct btrfs_dev_item ,
io_width , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_device_sector_size , struct btrfs_dev_item ,
sector_size , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_device_id , struct btrfs_dev_item , devid , 64 ) ;
2008-03-24 22:01:56 +03:00
static inline char * btrfs_device_uuid ( struct btrfs_dev_item * d )
{
return ( char * ) d + offsetof ( struct btrfs_dev_item , uuid ) ;
}
BTRFS_SETGET_FUNCS ( chunk_owner , struct btrfs_chunk , owner , 64 ) ;
BTRFS_SETGET_FUNCS ( chunk_stripe_len , struct btrfs_chunk , stripe_len , 64 ) ;
BTRFS_SETGET_FUNCS ( chunk_io_align , struct btrfs_chunk , io_align , 32 ) ;
BTRFS_SETGET_FUNCS ( chunk_io_width , struct btrfs_chunk , io_width , 32 ) ;
BTRFS_SETGET_FUNCS ( chunk_sector_size , struct btrfs_chunk , sector_size , 32 ) ;
BTRFS_SETGET_FUNCS ( chunk_type , struct btrfs_chunk , type , 64 ) ;
BTRFS_SETGET_FUNCS ( chunk_num_stripes , struct btrfs_chunk , num_stripes , 16 ) ;
BTRFS_SETGET_FUNCS ( stripe_devid , struct btrfs_stripe , devid , 64 ) ;
BTRFS_SETGET_FUNCS ( stripe_offset , struct btrfs_stripe , offset , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_owner , struct btrfs_chunk , owner , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_stripe_len , struct btrfs_chunk ,
stripe_len , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_io_align , struct btrfs_chunk ,
io_align , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_io_width , struct btrfs_chunk ,
io_width , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_sector_size , struct btrfs_chunk ,
sector_size , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_type , struct btrfs_chunk , type , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_chunk_num_stripes , struct btrfs_chunk ,
num_stripes , 16 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_stripe_devid , struct btrfs_stripe , devid , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_stripe_offset , struct btrfs_stripe , offset , 64 ) ;
static inline struct btrfs_stripe * btrfs_stripe_nr ( struct btrfs_chunk * c ,
int nr )
{
unsigned long offset = ( unsigned long ) c ;
offset + = offsetof ( struct btrfs_chunk , stripe ) ;
offset + = nr * sizeof ( struct btrfs_stripe ) ;
return ( struct btrfs_stripe * ) offset ;
}
static inline u64 btrfs_stripe_offset_nr ( struct extent_buffer * eb ,
struct btrfs_chunk * c , int nr )
{
return btrfs_stripe_offset ( eb , btrfs_stripe_nr ( c , nr ) ) ;
}
static inline void btrfs_set_stripe_offset_nr ( struct extent_buffer * eb ,
struct btrfs_chunk * c , int nr ,
u64 val )
{
btrfs_set_stripe_offset ( eb , btrfs_stripe_nr ( c , nr ) , val ) ;
}
static inline u64 btrfs_stripe_devid_nr ( struct extent_buffer * eb ,
struct btrfs_chunk * c , int nr )
{
return btrfs_stripe_devid ( eb , btrfs_stripe_nr ( c , nr ) ) ;
}
static inline void btrfs_set_stripe_devid_nr ( struct extent_buffer * eb ,
struct btrfs_chunk * c , int nr ,
u64 val )
{
btrfs_set_stripe_devid ( eb , btrfs_stripe_nr ( c , nr ) , val ) ;
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_block_group_item */
BTRFS_SETGET_STACK_FUNCS ( block_group_used , struct btrfs_block_group_item ,
used , 64 ) ;
BTRFS_SETGET_FUNCS ( disk_block_group_used , struct btrfs_block_group_item ,
used , 64 ) ;
2008-03-24 22:01:56 +03:00
BTRFS_SETGET_STACK_FUNCS ( block_group_chunk_tree , struct btrfs_block_group_item ,
chunk_tree , 64 ) ;
BTRFS_SETGET_FUNCS ( disk_block_group_chunk_tree , struct btrfs_block_group_item ,
chunk_tree , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( block_group_chunk_objectid ,
struct btrfs_block_group_item , chunk_objectid , 64 ) ;
BTRFS_SETGET_FUNCS ( disk_block_group_chunk_objecitd ,
struct btrfs_block_group_item , chunk_objectid , 64 ) ;
BTRFS_SETGET_FUNCS ( disk_block_group_flags ,
struct btrfs_block_group_item , flags , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( block_group_flags ,
struct btrfs_block_group_item , flags , 64 ) ;
2007-03-16 02:03:33 +03:00
2007-12-12 22:38:19 +03:00
/* struct btrfs_inode_ref */
BTRFS_SETGET_FUNCS ( inode_ref_name_len , struct btrfs_inode_ref , name_len , 16 ) ;
2007-10-16 00:14:19 +04:00
/* struct btrfs_inode_item */
BTRFS_SETGET_FUNCS ( inode_generation , struct btrfs_inode_item , generation , 64 ) ;
BTRFS_SETGET_FUNCS ( inode_size , struct btrfs_inode_item , size , 64 ) ;
BTRFS_SETGET_FUNCS ( inode_nblocks , struct btrfs_inode_item , nblocks , 64 ) ;
BTRFS_SETGET_FUNCS ( inode_block_group , struct btrfs_inode_item , block_group , 64 ) ;
BTRFS_SETGET_FUNCS ( inode_nlink , struct btrfs_inode_item , nlink , 32 ) ;
BTRFS_SETGET_FUNCS ( inode_uid , struct btrfs_inode_item , uid , 32 ) ;
BTRFS_SETGET_FUNCS ( inode_gid , struct btrfs_inode_item , gid , 32 ) ;
BTRFS_SETGET_FUNCS ( inode_mode , struct btrfs_inode_item , mode , 32 ) ;
2008-03-24 22:01:56 +03:00
BTRFS_SETGET_FUNCS ( inode_rdev , struct btrfs_inode_item , rdev , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_FUNCS ( inode_flags , struct btrfs_inode_item , flags , 16 ) ;
BTRFS_SETGET_FUNCS ( inode_compat_flags , struct btrfs_inode_item ,
compat_flags , 16 ) ;
2007-03-16 02:03:33 +03:00
2008-03-24 22:01:56 +03:00
static inline struct btrfs_timespec *
2007-10-16 00:14:19 +04:00
btrfs_inode_atime ( struct btrfs_inode_item * inode_item )
2007-03-16 02:03:33 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = ( unsigned long ) inode_item ;
ptr + = offsetof ( struct btrfs_inode_item , atime ) ;
2008-03-24 22:01:56 +03:00
return ( struct btrfs_timespec * ) ptr ;
2007-03-16 02:03:33 +03:00
}
2008-03-24 22:01:56 +03:00
static inline struct btrfs_timespec *
2007-10-16 00:14:19 +04:00
btrfs_inode_mtime ( struct btrfs_inode_item * inode_item )
2007-03-16 02:03:33 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = ( unsigned long ) inode_item ;
ptr + = offsetof ( struct btrfs_inode_item , mtime ) ;
2008-03-24 22:01:56 +03:00
return ( struct btrfs_timespec * ) ptr ;
2007-03-16 02:03:33 +03:00
}
2008-03-24 22:01:56 +03:00
static inline struct btrfs_timespec *
2007-10-16 00:14:19 +04:00
btrfs_inode_ctime ( struct btrfs_inode_item * inode_item )
2007-03-16 02:03:33 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = ( unsigned long ) inode_item ;
ptr + = offsetof ( struct btrfs_inode_item , ctime ) ;
2008-03-24 22:01:56 +03:00
return ( struct btrfs_timespec * ) ptr ;
2007-03-16 02:03:33 +03:00
}
2008-03-24 22:01:56 +03:00
static inline struct btrfs_timespec *
2007-10-16 00:14:19 +04:00
btrfs_inode_otime ( struct btrfs_inode_item * inode_item )
2007-03-16 02:03:33 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = ( unsigned long ) inode_item ;
ptr + = offsetof ( struct btrfs_inode_item , otime ) ;
2008-03-24 22:01:56 +03:00
return ( struct btrfs_timespec * ) ptr ;
2007-03-16 02:03:33 +03:00
}
2008-03-24 22:01:56 +03:00
BTRFS_SETGET_FUNCS ( timespec_sec , struct btrfs_timespec , sec , 64 ) ;
BTRFS_SETGET_FUNCS ( timespec_nsec , struct btrfs_timespec , nsec , 32 ) ;
2007-03-22 19:13:20 +03:00
2007-10-16 00:14:19 +04:00
/* struct btrfs_extent_item */
BTRFS_SETGET_FUNCS ( extent_refs , struct btrfs_extent_item , refs , 32 ) ;
2007-12-11 17:25:06 +03:00
2008-03-24 22:01:56 +03:00
/* struct btrfs_dev_extent */
BTRFS_SETGET_FUNCS ( dev_extent_owner , struct btrfs_dev_extent , owner , 64 ) ;
BTRFS_SETGET_FUNCS ( dev_extent_length , struct btrfs_dev_extent , length , 64 ) ;
2007-12-11 17:25:06 +03:00
/* struct btrfs_extent_ref */
BTRFS_SETGET_FUNCS ( ref_root , struct btrfs_extent_ref , root , 64 ) ;
BTRFS_SETGET_FUNCS ( ref_generation , struct btrfs_extent_ref , generation , 64 ) ;
BTRFS_SETGET_FUNCS ( ref_objectid , struct btrfs_extent_ref , objectid , 64 ) ;
BTRFS_SETGET_FUNCS ( ref_offset , struct btrfs_extent_ref , offset , 64 ) ;
2007-12-11 17:25:06 +03:00
BTRFS_SETGET_STACK_FUNCS ( stack_ref_root , struct btrfs_extent_ref , root , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_ref_generation , struct btrfs_extent_ref ,
2007-12-11 17:25:06 +03:00
generation , 64 ) ;
2007-12-11 17:25:06 +03:00
BTRFS_SETGET_STACK_FUNCS ( stack_ref_objectid , struct btrfs_extent_ref ,
objectid , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( stack_ref_offset , struct btrfs_extent_ref , offset , 64 ) ;
2007-03-22 19:13:20 +03:00
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_STACK_FUNCS ( stack_extent_refs , struct btrfs_extent_item ,
refs , 32 ) ;
2007-03-22 19:13:20 +03:00
2007-10-16 00:14:19 +04:00
/* struct btrfs_node */
BTRFS_SETGET_FUNCS ( key_blockptr , struct btrfs_key_ptr , blockptr , 64 ) ;
2007-12-11 17:25:06 +03:00
BTRFS_SETGET_FUNCS ( key_generation , struct btrfs_key_ptr , generation , 64 ) ;
2007-03-22 19:13:20 +03:00
2007-10-16 00:14:19 +04:00
static inline u64 btrfs_node_blockptr ( struct extent_buffer * eb , int nr )
2007-03-13 16:49:06 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr ;
ptr = offsetof ( struct btrfs_node , ptrs ) +
sizeof ( struct btrfs_key_ptr ) * nr ;
return btrfs_key_blockptr ( eb , ( struct btrfs_key_ptr * ) ptr ) ;
2007-03-13 16:49:06 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_set_node_blockptr ( struct extent_buffer * eb ,
int nr , u64 val )
2007-03-13 16:49:06 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr ;
ptr = offsetof ( struct btrfs_node , ptrs ) +
sizeof ( struct btrfs_key_ptr ) * nr ;
btrfs_set_key_blockptr ( eb , ( struct btrfs_key_ptr * ) ptr , val ) ;
2007-03-13 16:49:06 +03:00
}
2007-12-11 17:25:06 +03:00
static inline u64 btrfs_node_ptr_generation ( struct extent_buffer * eb , int nr )
{
unsigned long ptr ;
ptr = offsetof ( struct btrfs_node , ptrs ) +
sizeof ( struct btrfs_key_ptr ) * nr ;
return btrfs_key_generation ( eb , ( struct btrfs_key_ptr * ) ptr ) ;
}
static inline void btrfs_set_node_ptr_generation ( struct extent_buffer * eb ,
int nr , u64 val )
{
unsigned long ptr ;
ptr = offsetof ( struct btrfs_node , ptrs ) +
sizeof ( struct btrfs_key_ptr ) * nr ;
btrfs_set_key_generation ( eb , ( struct btrfs_key_ptr * ) ptr , val ) ;
}
2007-10-16 00:18:55 +04:00
static inline unsigned long btrfs_node_key_ptr_offset ( int nr )
2007-04-21 04:23:12 +04:00
{
2007-10-16 00:14:19 +04:00
return offsetof ( struct btrfs_node , ptrs ) +
sizeof ( struct btrfs_key_ptr ) * nr ;
2007-04-21 04:23:12 +04:00
}
2007-11-06 23:09:29 +03:00
void btrfs_node_key ( struct extent_buffer * eb ,
struct btrfs_disk_key * disk_key , int nr ) ;
2007-10-16 00:14:19 +04:00
static inline void btrfs_set_node_key ( struct extent_buffer * eb ,
struct btrfs_disk_key * disk_key , int nr )
2007-03-13 16:28:32 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr ;
ptr = btrfs_node_key_ptr_offset ( nr ) ;
write_eb_member ( eb , ( struct btrfs_key_ptr * ) ptr ,
struct btrfs_key_ptr , key , disk_key ) ;
2007-03-13 16:28:32 +03:00
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_item */
BTRFS_SETGET_FUNCS ( item_offset , struct btrfs_item , offset , 32 ) ;
BTRFS_SETGET_FUNCS ( item_size , struct btrfs_item , size , 32 ) ;
2007-04-21 04:23:12 +04:00
2007-10-16 00:14:19 +04:00
static inline unsigned long btrfs_item_nr_offset ( int nr )
2007-03-13 16:28:32 +03:00
{
2007-10-16 00:14:19 +04:00
return offsetof ( struct btrfs_leaf , items ) +
sizeof ( struct btrfs_item ) * nr ;
2007-03-13 16:28:32 +03:00
}
2007-10-16 00:14:19 +04:00
static inline struct btrfs_item * btrfs_item_nr ( struct extent_buffer * eb ,
int nr )
2007-03-13 03:12:07 +03:00
{
2007-10-16 00:14:19 +04:00
return ( struct btrfs_item * ) btrfs_item_nr_offset ( nr ) ;
2007-03-13 03:12:07 +03:00
}
2007-10-16 00:14:19 +04:00
static inline u32 btrfs_item_end ( struct extent_buffer * eb ,
struct btrfs_item * item )
2007-03-13 03:12:07 +03:00
{
2007-10-16 00:14:19 +04:00
return btrfs_item_offset ( eb , item ) + btrfs_item_size ( eb , item ) ;
2007-03-13 03:12:07 +03:00
}
2007-10-16 00:14:19 +04:00
static inline u32 btrfs_item_end_nr ( struct extent_buffer * eb , int nr )
2007-03-13 03:12:07 +03:00
{
2007-10-16 00:14:19 +04:00
return btrfs_item_end ( eb , btrfs_item_nr ( eb , nr ) ) ;
2007-03-13 03:12:07 +03:00
}
2007-10-16 00:14:19 +04:00
static inline u32 btrfs_item_offset_nr ( struct extent_buffer * eb , int nr )
2007-03-13 03:12:07 +03:00
{
2007-10-16 00:14:19 +04:00
return btrfs_item_offset ( eb , btrfs_item_nr ( eb , nr ) ) ;
2007-03-13 03:12:07 +03:00
}
2007-10-16 00:14:19 +04:00
static inline u32 btrfs_item_size_nr ( struct extent_buffer * eb , int nr )
2007-03-13 03:12:07 +03:00
{
2007-10-16 00:14:19 +04:00
return btrfs_item_size ( eb , btrfs_item_nr ( eb , nr ) ) ;
2007-03-13 03:12:07 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_item_key ( struct extent_buffer * eb ,
struct btrfs_disk_key * disk_key , int nr )
2007-03-15 22:18:43 +03:00
{
2007-10-16 00:14:19 +04:00
struct btrfs_item * item = btrfs_item_nr ( eb , nr ) ;
read_eb_member ( eb , item , struct btrfs_item , key , disk_key ) ;
2007-03-15 22:18:43 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_set_item_key ( struct extent_buffer * eb ,
struct btrfs_disk_key * disk_key , int nr )
2007-03-15 22:18:43 +03:00
{
2007-10-16 00:14:19 +04:00
struct btrfs_item * item = btrfs_item_nr ( eb , nr ) ;
write_eb_member ( eb , item , struct btrfs_item , key , disk_key ) ;
2007-03-15 22:18:43 +03:00
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_dir_item */
2007-11-16 19:45:54 +03:00
BTRFS_SETGET_FUNCS ( dir_data_len , struct btrfs_dir_item , data_len , 16 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_FUNCS ( dir_type , struct btrfs_dir_item , type , 8 ) ;
BTRFS_SETGET_FUNCS ( dir_name_len , struct btrfs_dir_item , name_len , 16 ) ;
2007-03-15 22:18:43 +03:00
2007-10-16 00:14:19 +04:00
static inline void btrfs_dir_item_key ( struct extent_buffer * eb ,
struct btrfs_dir_item * item ,
struct btrfs_disk_key * key )
2007-03-15 22:18:43 +03:00
{
2007-10-16 00:14:19 +04:00
read_eb_member ( eb , item , struct btrfs_dir_item , location , key ) ;
2007-03-15 22:18:43 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_set_dir_item_key ( struct extent_buffer * eb ,
struct btrfs_dir_item * item ,
struct btrfs_disk_key * key )
2007-03-16 15:46:49 +03:00
{
2007-10-16 00:14:19 +04:00
write_eb_member ( eb , item , struct btrfs_dir_item , location , key ) ;
2007-03-16 15:46:49 +03:00
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_disk_key */
BTRFS_SETGET_STACK_FUNCS ( disk_key_objectid , struct btrfs_disk_key ,
objectid , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( disk_key_offset , struct btrfs_disk_key , offset , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( disk_key_type , struct btrfs_disk_key , type , 8 ) ;
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 ) ;
2007-10-16 00:14:19 +04:00
cpu - > type = disk - > type ;
2007-03-12 23:22:34 +03:00
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 ) ;
2007-10-16 00:14:19 +04:00
disk - > type = cpu - > type ;
2007-03-12 23:22:34 +03:00
disk - > objectid = cpu_to_le64 ( cpu - > objectid ) ;
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_node_key_to_cpu ( struct extent_buffer * eb ,
struct btrfs_key * key , int nr )
2007-03-23 22:56:19 +03:00
{
2007-10-16 00:14:19 +04:00
struct btrfs_disk_key disk_key ;
btrfs_node_key ( eb , & disk_key , nr ) ;
btrfs_disk_key_to_cpu ( key , & disk_key ) ;
2007-03-23 22:56:19 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_item_key_to_cpu ( struct extent_buffer * eb ,
struct btrfs_key * key , int nr )
2007-03-23 22:56:19 +03:00
{
2007-10-16 00:14:19 +04:00
struct btrfs_disk_key disk_key ;
btrfs_item_key ( eb , & disk_key , nr ) ;
btrfs_disk_key_to_cpu ( key , & disk_key ) ;
2007-03-23 22:56:19 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_dir_item_key_to_cpu ( struct extent_buffer * eb ,
struct btrfs_dir_item * item ,
struct btrfs_key * key )
2007-04-21 04:23:12 +04:00
{
2007-10-16 00:14:19 +04:00
struct btrfs_disk_key disk_key ;
btrfs_dir_item_key ( eb , item , & disk_key ) ;
btrfs_disk_key_to_cpu ( key , & disk_key ) ;
2007-04-21 04:23:12 +04:00
}
2007-08-29 23:47:34 +04:00
2007-10-16 00:14:19 +04:00
static inline u8 btrfs_key_type ( struct btrfs_key * key )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
return key - > type ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
static inline void btrfs_set_key_type ( struct btrfs_key * key , u8 val )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
key - > type = val ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_header */
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_HEADER_FUNCS ( header_bytenr , struct btrfs_header , bytenr , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_HEADER_FUNCS ( header_generation , struct btrfs_header ,
generation , 64 ) ;
BTRFS_SETGET_HEADER_FUNCS ( header_owner , struct btrfs_header , owner , 64 ) ;
BTRFS_SETGET_HEADER_FUNCS ( header_nritems , struct btrfs_header , nritems , 32 ) ;
2008-04-01 19:21:32 +04:00
BTRFS_SETGET_HEADER_FUNCS ( header_flags , struct btrfs_header , flags , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_HEADER_FUNCS ( header_level , struct btrfs_header , level , 8 ) ;
2007-04-09 18:42:37 +04:00
2008-04-01 19:21:32 +04:00
static inline int btrfs_header_flag ( struct extent_buffer * eb , u64 flag )
{
return ( btrfs_header_flags ( eb ) & flag ) = = flag ;
}
static inline int btrfs_set_header_flag ( struct extent_buffer * eb , u64 flag )
{
u64 flags = btrfs_header_flags ( eb ) ;
btrfs_set_header_flags ( eb , flags | flag ) ;
return ( flags & flag ) = = flag ;
}
static inline int btrfs_clear_header_flag ( struct extent_buffer * eb , u64 flag )
{
u64 flags = btrfs_header_flags ( eb ) ;
btrfs_set_header_flags ( eb , flags & ~ flag ) ;
return ( flags & flag ) = = flag ;
}
2007-10-16 00:14:19 +04:00
static inline u8 * btrfs_header_fsid ( struct extent_buffer * eb )
2007-04-09 18:42:37 +04:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = offsetof ( struct btrfs_header , fsid ) ;
return ( u8 * ) ptr ;
2007-04-09 18:42:37 +04:00
}
2007-10-16 00:14:19 +04:00
static inline u8 * btrfs_super_fsid ( struct extent_buffer * eb )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = offsetof ( struct btrfs_super_block , fsid ) ;
return ( u8 * ) ptr ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
static inline u8 * btrfs_header_csum ( struct extent_buffer * eb )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long ptr = offsetof ( struct btrfs_header , csum ) ;
return ( u8 * ) ptr ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
static inline struct btrfs_node * btrfs_buffer_node ( struct extent_buffer * eb )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
return NULL ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
static inline struct btrfs_leaf * btrfs_buffer_leaf ( struct extent_buffer * eb )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
return NULL ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
static inline struct btrfs_header * btrfs_buffer_header ( struct extent_buffer * eb )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
return NULL ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
static inline int btrfs_is_leaf ( struct extent_buffer * eb )
2007-03-13 23:47:54 +03:00
{
2007-10-16 00:14:19 +04:00
return ( btrfs_header_level ( eb ) = = 0 ) ;
2007-03-13 23:47:54 +03:00
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_root_item */
BTRFS_SETGET_FUNCS ( disk_root_refs , struct btrfs_root_item , refs , 32 ) ;
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_FUNCS ( disk_root_bytenr , struct btrfs_root_item , bytenr , 64 ) ;
BTRFS_SETGET_FUNCS ( disk_root_level , struct btrfs_root_item , level , 8 ) ;
2007-03-13 23:47:54 +03:00
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_STACK_FUNCS ( root_bytenr , struct btrfs_root_item , bytenr , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( root_level , struct btrfs_root_item , level , 8 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_STACK_FUNCS ( root_dirid , struct btrfs_root_item , root_dirid , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( root_refs , struct btrfs_root_item , refs , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( root_flags , struct btrfs_root_item , flags , 32 ) ;
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_STACK_FUNCS ( root_used , struct btrfs_root_item , bytes_used , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( root_limit , struct btrfs_root_item , byte_limit , 64 ) ;
2007-03-14 21:14:43 +03:00
2007-10-16 00:14:19 +04:00
/* struct btrfs_super_block */
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_STACK_FUNCS ( super_bytenr , struct btrfs_super_block , bytenr , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_STACK_FUNCS ( super_generation , struct btrfs_super_block ,
generation , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( super_root , struct btrfs_super_block , root , 64 ) ;
2008-03-24 22:01:56 +03:00
BTRFS_SETGET_STACK_FUNCS ( super_sys_array_size ,
struct btrfs_super_block , sys_chunk_array_size , 32 ) ;
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_STACK_FUNCS ( super_root_level , struct btrfs_super_block ,
root_level , 8 ) ;
2008-03-24 22:01:56 +03:00
BTRFS_SETGET_STACK_FUNCS ( super_chunk_root , struct btrfs_super_block ,
chunk_root , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( super_chunk_root_level , struct btrfs_super_block ,
chunk_root_level , 64 ) ;
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_STACK_FUNCS ( super_total_bytes , struct btrfs_super_block ,
total_bytes , 64 ) ;
BTRFS_SETGET_STACK_FUNCS ( super_bytes_used , struct btrfs_super_block ,
bytes_used , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_STACK_FUNCS ( super_sectorsize , struct btrfs_super_block ,
sectorsize , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( super_nodesize , struct btrfs_super_block ,
nodesize , 32 ) ;
BTRFS_SETGET_STACK_FUNCS ( super_leafsize , struct btrfs_super_block ,
leafsize , 32 ) ;
2007-11-30 19:30:34 +03:00
BTRFS_SETGET_STACK_FUNCS ( super_stripesize , struct btrfs_super_block ,
stripesize , 32 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_STACK_FUNCS ( super_root_dir , struct btrfs_super_block ,
root_dir_objectid , 64 ) ;
2008-03-24 22:02:07 +03:00
BTRFS_SETGET_STACK_FUNCS ( super_num_devices , struct btrfs_super_block ,
num_devices , 64 ) ;
2007-03-21 18:12:56 +03:00
2007-10-16 00:14:19 +04:00
static inline unsigned long btrfs_leaf_data ( struct extent_buffer * l )
2007-03-21 18:12:56 +03:00
{
2007-10-16 00:14:19 +04:00
return offsetof ( struct btrfs_leaf , items ) ;
2007-03-21 18:12:56 +03:00
}
2007-10-16 00:14:19 +04:00
/* struct btrfs_file_extent_item */
BTRFS_SETGET_FUNCS ( file_extent_type , struct btrfs_file_extent_item , type , 8 ) ;
2007-03-20 21:38:32 +03:00
2007-10-16 00:14:19 +04:00
static inline unsigned long btrfs_file_extent_inline_start ( struct
2007-04-19 21:37:44 +04:00
btrfs_file_extent_item * e )
{
2007-10-16 00:14:19 +04:00
unsigned long offset = ( unsigned long ) e ;
2007-10-16 00:15:53 +04:00
offset + = offsetof ( struct btrfs_file_extent_item , disk_bytenr ) ;
2007-10-16 00:14:19 +04:00
return offset ;
2007-04-19 21:37:44 +04:00
}
static inline u32 btrfs_file_extent_calc_inline_size ( u32 datasize )
{
2007-10-16 00:15:53 +04:00
return offsetof ( struct btrfs_file_extent_item , disk_bytenr ) + datasize ;
2007-03-20 21:38:32 +03:00
}
2007-10-16 00:14:19 +04:00
static inline u32 btrfs_file_extent_inline_len ( struct extent_buffer * eb ,
struct btrfs_item * e )
2007-03-20 21:38:32 +03:00
{
2007-10-16 00:14:19 +04:00
unsigned long offset ;
2007-10-16 00:15:53 +04:00
offset = offsetof ( struct btrfs_file_extent_item , disk_bytenr ) ;
2007-10-16 00:14:19 +04:00
return btrfs_item_size ( eb , e ) - offset ;
2007-03-20 21:38:32 +03:00
}
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_FUNCS ( file_extent_disk_bytenr , struct btrfs_file_extent_item ,
disk_bytenr , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_FUNCS ( file_extent_generation , struct btrfs_file_extent_item ,
generation , 64 ) ;
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_FUNCS ( file_extent_disk_num_bytes , struct btrfs_file_extent_item ,
disk_num_bytes , 64 ) ;
2007-10-16 00:14:19 +04:00
BTRFS_SETGET_FUNCS ( file_extent_offset , struct btrfs_file_extent_item ,
offset , 64 ) ;
2007-10-16 00:15:53 +04:00
BTRFS_SETGET_FUNCS ( file_extent_num_bytes , struct btrfs_file_extent_item ,
num_bytes , 64 ) ;
2007-03-20 21:38:32 +03:00
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-08-29 23:47:34 +04:00
static inline int btrfs_set_root_name ( struct btrfs_root * root ,
const char * name , int len )
{
/* if we already have a name just free it */
if ( root - > name )
kfree ( root - > name ) ;
root - > name = kmalloc ( len + 1 , GFP_KERNEL ) ;
if ( ! root - > name )
return - ENOMEM ;
memcpy ( root - > name , name , len ) ;
root - > name [ len ] = ' \0 ' ;
return 0 ;
}
2007-10-16 00:15:53 +04:00
static inline u32 btrfs_level_size ( struct btrfs_root * root , int level ) {
if ( level = = 0 )
return root - > leafsize ;
return root - > nodesize ;
}
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 ) + \
2007-10-16 00:14:19 +04:00
btrfs_item_offset_nr ( leaf , slot ) ) )
# define btrfs_item_ptr_offset(leaf, slot) \
( ( unsigned long ) ( btrfs_leaf_data ( leaf ) + \
btrfs_item_offset_nr ( leaf , slot ) ) )
2007-03-14 17:31:29 +03:00
2007-12-19 00:15:09 +03:00
static inline struct dentry * fdentry ( struct file * file ) {
# if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18)
return file - > f_dentry ;
# else
return file - > f_path . dentry ;
# endif
}
2007-04-17 21:26:50 +04:00
/* extent-tree.c */
2007-12-18 04:14:01 +03:00
u32 btrfs_count_snapshots_in_path ( struct btrfs_root * root ,
struct btrfs_path * count_path ,
u64 first_extent ) ;
2007-08-10 22:06:19 +04:00
int btrfs_extent_post_op ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ) ;
2008-01-25 00:13:08 +03:00
int btrfs_copy_pinned ( struct btrfs_root * root , struct extent_io_tree * copy ) ;
2007-06-12 05:33:38 +04:00
struct btrfs_block_group_cache * btrfs_lookup_block_group ( struct
btrfs_fs_info * info ,
2007-10-16 00:15:53 +04:00
u64 bytenr ) ;
2007-04-30 23:25:45 +04:00
struct btrfs_block_group_cache * btrfs_find_block_group ( struct btrfs_root * root ,
struct btrfs_block_group_cache
2007-05-06 18:15:01 +04:00
* hint , u64 search_start ,
2007-05-18 21:28:27 +04:00
int data , int owner ) ;
2007-04-10 17:27:04 +04:00
int btrfs_inc_root_ref ( struct btrfs_trans_handle * trans ,
2007-12-11 17:25:06 +03:00
struct btrfs_root * root , u64 owner_objectid ) ;
2007-10-16 00:14:19 +04:00
struct extent_buffer * btrfs_alloc_free_block ( struct btrfs_trans_handle * trans ,
2007-10-16 00:15:53 +04:00
struct btrfs_root * root , u32 size ,
2007-12-11 17:25:06 +03:00
u64 root_objectid ,
2007-10-16 00:15:53 +04:00
u64 hint , u64 empty_size ) ;
2007-12-11 17:25:06 +03:00
struct extent_buffer * __btrfs_alloc_free_block ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
u32 blocksize ,
u64 root_objectid ,
u64 ref_generation ,
u64 first_objectid ,
int level ,
u64 hint ,
u64 empty_size ) ;
2007-12-22 00:27:24 +03:00
int btrfs_grow_extent_tree ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , u64 new_size ) ;
int btrfs_shrink_extent_tree ( struct btrfs_root * root , u64 new_size ) ;
2007-12-11 17:25:06 +03:00
int btrfs_insert_extent_backref ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 bytenr ,
u64 root_objectid , u64 ref_generation ,
u64 owner , u64 owner_offset ) ;
2007-04-21 04:23:12 +04:00
int btrfs_alloc_extent ( struct btrfs_trans_handle * trans ,
2007-12-11 17:25:06 +03:00
struct btrfs_root * root ,
u64 num_bytes , u64 root_objectid , u64 ref_generation ,
u64 owner , u64 owner_offset ,
u64 empty_size , u64 hint_byte ,
2007-05-03 17:06:49 +04:00
u64 search_end , struct btrfs_key * ins , int data ) ;
2007-03-16 23:20:31 +03:00
int btrfs_inc_ref ( struct btrfs_trans_handle * trans , struct btrfs_root * root ,
2007-10-16 00:14:19 +04:00
struct extent_buffer * buf ) ;
2007-03-16 23:20:31 +03:00
int btrfs_free_extent ( struct btrfs_trans_handle * trans , struct btrfs_root
2007-12-11 17:25:06 +03:00
* root , u64 bytenr , u64 num_bytes ,
u64 root_objectid , u64 ref_generation ,
u64 owner_objectid , u64 owner_offset , int pin ) ;
2007-06-28 23:57:36 +04:00
int btrfs_finish_extent_commit ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
2008-01-25 00:13:08 +03:00
struct extent_io_tree * unpin ) ;
2007-04-17 21:26:50 +04:00
int btrfs_inc_extent_ref ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
2007-12-11 17:25:06 +03:00
u64 bytenr , u64 num_bytes ,
u64 root_objectid , u64 ref_generation ,
u64 owner , u64 owner_offset ) ;
2007-04-27 00:46:15 +04:00
int btrfs_write_dirty_block_groups ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ) ;
int btrfs_free_block_groups ( struct btrfs_fs_info * info ) ;
int btrfs_read_block_groups ( struct btrfs_root * root ) ;
2008-03-24 22:01:56 +03:00
int btrfs_make_block_group ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , u64 bytes_used ,
u64 type , u64 chunk_tree , u64 chunk_objectid ,
u64 size ) ;
2007-03-27 00:00:06 +04:00
/* ctree.c */
2008-03-24 22:01:56 +03:00
int btrfs_previous_item ( struct btrfs_root * root ,
struct btrfs_path * path , u64 min_objectid ,
int type ) ;
2007-10-16 00:14:19 +04:00
int btrfs_cow_block ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , struct extent_buffer * buf ,
struct extent_buffer * parent , int parent_slot ,
struct extent_buffer * * cow_ret ) ;
2007-12-18 04:14:01 +03:00
int btrfs_copy_root ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct extent_buffer * buf ,
struct extent_buffer * * cow_ret , u64 new_root_objectid ) ;
2007-04-16 17:22:45 +04:00
int btrfs_extend_item ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , struct btrfs_path * path , u32 data_size ) ;
2007-04-17 21:26:50 +04:00
int btrfs_truncate_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path ,
2007-11-01 18:28:41 +03:00
u32 new_size , int from_end ) ;
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-08-08 00:15:09 +04:00
int btrfs_realloc_node ( struct btrfs_trans_handle * trans ,
2007-10-16 00:14:19 +04:00
struct btrfs_root * root , struct extent_buffer * parent ,
2007-10-16 00:22:39 +04:00
int start_slot , int cache_only , u64 * last_ret ,
struct btrfs_key * progress ) ;
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 ) ;
2008-01-29 23:11:36 +03:00
int btrfs_del_items ( struct btrfs_trans_handle * trans , struct btrfs_root * root ,
struct btrfs_path * path , int slot , int nr ) ;
static inline int btrfs_del_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path )
{
return btrfs_del_items ( trans , root , path , path - > slots [ 0 ] , 1 ) ;
}
2007-03-16 23:20:31 +03:00
int btrfs_insert_item ( struct btrfs_trans_handle * trans , struct btrfs_root
* root , struct btrfs_key * key , void * data , u32 data_size ) ;
2008-01-29 23:15:18 +03:00
int btrfs_insert_empty_items ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path ,
struct btrfs_key * cpu_key , u32 * data_size , int nr ) ;
static inline int btrfs_insert_empty_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path ,
struct btrfs_key * key ,
u32 data_size )
{
return btrfs_insert_empty_items ( trans , root , path , key , & data_size , 1 ) ;
}
2007-03-13 17:46:10 +03:00
int btrfs_next_leaf ( struct btrfs_root * root , struct btrfs_path * path ) ;
2007-12-11 17:25:06 +03:00
int btrfs_prev_leaf ( struct btrfs_root * root , struct btrfs_path * path ) ;
2007-10-16 00:14:19 +04:00
int btrfs_leaf_free_space ( struct btrfs_root * root , struct extent_buffer * leaf ) ;
2007-03-16 23:20:31 +03:00
int btrfs_drop_snapshot ( struct btrfs_trans_handle * trans , struct btrfs_root
2007-08-07 23:52:19 +04:00
* root ) ;
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-09-11 19:15:39 +04:00
int btrfs_find_dead_roots ( struct btrfs_root * root , u64 objectid ,
struct btrfs_root * latest_root ) ;
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-04-19 23:36:27 +04:00
struct btrfs_dir_item * 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 ) ;
struct btrfs_dir_item *
btrfs_lookup_dir_index_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 dir ,
u64 objectid , const char * name , int name_len ,
int mod ) ;
struct btrfs_dir_item * 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-04-19 23:36:27 +04:00
int btrfs_delete_one_dir_name ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path ,
struct btrfs_dir_item * di ) ;
2007-11-16 19:45:54 +03:00
int btrfs_insert_xattr_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , const char * name ,
u16 name_len , const void * data , u16 data_len ,
u64 dir ) ;
struct btrfs_dir_item * btrfs_lookup_xattr ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 dir ,
const char * name , u16 name_len ,
int mod ) ;
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-12-12 22:38:19 +03:00
int btrfs_insert_inode_ref ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
const char * name , int name_len ,
u64 inode_objectid , u64 ref_objectid ) ;
int btrfs_del_inode_ref ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
const char * name , int name_len ,
u64 inode_objectid , u64 ref_objectid ) ;
2007-10-16 00:14:19 +04:00
int btrfs_insert_empty_inode ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 objectid ) ;
2007-03-20 22:57:25 +03:00
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 */
2007-04-17 21:26:50 +04:00
int btrfs_insert_file_extent ( struct btrfs_trans_handle * trans ,
2007-03-27 00:00:06 +04:00
struct btrfs_root * root ,
2007-04-17 21:26:50 +04:00
u64 objectid , u64 pos , u64 offset ,
2007-10-16 00:15:53 +04:00
u64 disk_num_bytes ,
u64 num_bytes ) ;
2007-03-27 00:00:06 +04:00
int btrfs_lookup_file_extent ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 objectid ,
2007-10-16 00:15:53 +04:00
u64 bytenr , int mod ) ;
2008-02-20 20:07:25 +03:00
int btrfs_csum_file_blocks ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , struct inode * inode ,
struct bio * bio ) ;
2007-04-17 21:26:50 +04:00
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 ) ;
2007-05-29 23:17:08 +04:00
int btrfs_csum_truncate ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , struct btrfs_path * path ,
u64 isize ) ;
2007-06-12 14:35:45 +04:00
/* inode.c */
2008-03-24 22:02:07 +03:00
int btrfs_merge_bio_hook ( struct page * page , unsigned long offset ,
size_t size , struct bio * bio ) ;
2008-02-08 21:49:28 +03:00
static inline void dec_i_blocks ( struct inode * inode , u64 dec )
{
dec = dec > > 9 ;
if ( dec < = inode - > i_blocks )
inode - > i_blocks - = dec ;
else
inode - > i_blocks = 0 ;
}
2007-12-22 00:27:24 +03:00
unsigned long btrfs_force_ra ( struct address_space * mapping ,
struct file_ra_state * ra , struct file * file ,
pgoff_t offset , pgoff_t last_index ) ;
2007-12-22 00:27:21 +03:00
int btrfs_check_free_space ( struct btrfs_root * root , u64 num_required ,
int for_del ) ;
2007-06-15 21:50:00 +04:00
int btrfs_page_mkwrite ( struct vm_area_struct * vma , struct page * page ) ;
int btrfs_readpage ( struct file * file , struct page * page ) ;
2007-06-12 14:35:45 +04:00
void btrfs_delete_inode ( struct inode * inode ) ;
2008-01-16 19:44:43 +03:00
void btrfs_put_inode ( struct inode * inode ) ;
2007-06-12 14:35:45 +04:00
void btrfs_read_locked_inode ( struct inode * inode ) ;
int btrfs_write_inode ( struct inode * inode , int wait ) ;
void btrfs_dirty_inode ( struct inode * inode ) ;
struct inode * btrfs_alloc_inode ( struct super_block * sb ) ;
void btrfs_destroy_inode ( struct inode * inode ) ;
int btrfs_init_cachep ( void ) ;
void btrfs_destroy_cachep ( void ) ;
2007-09-14 18:22:47 +04:00
long btrfs_ioctl ( struct file * file , unsigned int cmd , unsigned long arg ) ;
2007-06-12 14:35:45 +04:00
struct inode * btrfs_iget_locked ( struct super_block * s , u64 objectid ,
struct btrfs_root * root ) ;
2008-01-08 23:46:30 +03:00
struct inode * btrfs_ilookup ( struct super_block * s , u64 objectid ,
u64 root_objectid ) ;
2007-06-12 14:35:45 +04:00
int btrfs_commit_write ( struct file * file , struct page * page ,
unsigned from , unsigned to ) ;
2007-08-28 00:49:44 +04:00
struct extent_map * btrfs_get_extent ( struct inode * inode , struct page * page ,
size_t page_offset , u64 start , u64 end ,
int create ) ;
int btrfs_update_inode ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct inode * inode ) ;
2007-06-12 14:35:45 +04:00
/* file.c */
2007-08-28 00:49:44 +04:00
int btrfs_drop_extent_cache ( struct inode * inode , u64 start , u64 end ) ;
2008-01-23 00:47:59 +03:00
int btrfs_check_file ( struct btrfs_root * root , struct inode * inode ) ;
2007-06-12 14:35:45 +04:00
extern struct file_operations btrfs_file_operations ;
int btrfs_drop_extents ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , struct inode * inode ,
2007-11-30 18:09:33 +03:00
u64 start , u64 end , u64 inline_limit , u64 * hint_block ) ;
2007-08-08 00:15:09 +04:00
/* tree-defrag.c */
int btrfs_defrag_leaves ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , int cache_only ) ;
2007-08-29 23:47:34 +04:00
/* sysfs.c */
int btrfs_init_sysfs ( void ) ;
void btrfs_exit_sysfs ( void ) ;
int btrfs_sysfs_add_super ( struct btrfs_fs_info * fs ) ;
int btrfs_sysfs_add_root ( struct btrfs_root * root ) ;
void btrfs_sysfs_del_root ( struct btrfs_root * root ) ;
void btrfs_sysfs_del_super ( struct btrfs_fs_info * root ) ;
2007-11-16 19:45:54 +03:00
/* xattr.c */
ssize_t btrfs_listxattr ( struct dentry * dentry , char * buffer , size_t size ) ;
int btrfs_delete_xattrs ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , struct inode * inode ) ;
2007-12-22 00:27:24 +03:00
/* super.c */
u64 btrfs_parse_size ( char * str ) ;
2007-02-02 17:18:22 +03:00
# endif