blob: 1568e4de791edc0ebdc94f5f769e8ab5681d5ee3 [file] [log] [blame]
#ifndef _BTRFS_H_
#define _BTRFS_H_
#include <stdint.h>
#include <zconf.h>
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
/* type that store on disk, but it is same as cpu type for i386 arch */
typedef u16 __le16;
typedef u32 __le32;
typedef u64 __le64;
#include "crc32c.h"
#define btrfs_crc32c crc32c_le
#define BTRFS_SUPER_INFO_OFFSET (64 * 1024)
#define BTRFS_SUPER_INFO_SIZE 4096
#define BTRFS_MAX_LEAF_SIZE 4096
#define BTRFS_BLOCK_SHIFT 12
#define BTRFS_BLOCK_SIZE (1 << BTRFS_BLOCK_SHIFT)
#define BTRFS_SUPER_MIRROR_MAX 3
#define BTRFS_SUPER_MIRROR_SHIFT 12
#define BTRFS_CSUM_SIZE 32
#define BTRFS_FSID_SIZE 16
#define BTRFS_LABEL_SIZE 256
#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
#define BTRFS_UUID_SIZE 16
#define BTRFS_MAGIC "_BHRfS_M"
#define BTRFS_MAGIC_L 8
#define BTRFS_MAGIC_N 0x4d5f53665248425f
#define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33)
#define BTRFS_DEV_ITEM_KEY 216
#define BTRFS_CHUNK_ITEM_KEY 228
#define BTRFS_ROOT_REF_KEY 156
#define BTRFS_ROOT_ITEM_KEY 132
#define BTRFS_EXTENT_DATA_KEY 108
#define BTRFS_DIR_ITEM_KEY 84
#define BTRFS_INODE_ITEM_KEY 1
#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
#define BTRFS_FS_TREE_OBJECTID 5ULL
#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
#define BTRFS_FILE_EXTENT_INLINE 0
#define BTRFS_FILE_EXTENT_REG 1
#define BTRFS_FILE_EXTENT_PREALLOC 2
#define BTRFS_MAX_LEVEL 8
#define BTRFS_MAX_CHUNK_ENTRIES 256
#define BTRFS_FT_REG_FILE 1
#define BTRFS_FT_DIR 2
#define BTRFS_FT_SYMLINK 7
#define ROOT_DIR_WORD 0x002f
struct btrfs_dev_item {
__le64 devid;
__le64 total_bytes;
__le64 bytes_used;
__le32 io_align;
__le32 io_width;
__le32 sector_size;
__le64 type;
__le64 generation;
__le64 start_offset;
__le32 dev_group;
u8 seek_speed;
u8 bandwidth;
u8 uuid[BTRFS_UUID_SIZE];
u8 fsid[BTRFS_UUID_SIZE];
} __attribute__ ((__packed__));
struct btrfs_super_block {
u8 csum[BTRFS_CSUM_SIZE];
/* the first 3 fields must match struct btrfs_header */
u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
__le64 bytenr; /* this block number */
__le64 flags;
/* allowed to be different from the btrfs_header from here own down */
__le64 magic;
__le64 generation;
__le64 root;
__le64 chunk_root;
__le64 log_root;
/* this will help find the new super based on the log root */
__le64 log_root_transid;
__le64 total_bytes;
__le64 bytes_used;
__le64 root_dir_objectid;
__le64 num_devices;
__le32 sectorsize;
__le32 nodesize;
__le32 leafsize;
__le32 stripesize;
__le32 sys_chunk_array_size;
__le64 chunk_root_generation;
__le64 compat_flags;
__le64 compat_ro_flags;
__le64 incompat_flags;
__le16 csum_type;
u8 root_level;
u8 chunk_root_level;
u8 log_root_level;
struct btrfs_dev_item dev_item;
char label[BTRFS_LABEL_SIZE];
/* future expansion */
__le64 reserved[32];
u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
} __attribute__ ((__packed__));
struct btrfs_disk_key {
__le64 objectid;
u8 type;
__le64 offset;
} __attribute__ ((__packed__));
struct btrfs_stripe {
__le64 devid;
__le64 offset;
u8 dev_uuid[BTRFS_UUID_SIZE];
} __attribute__ ((__packed__));
struct btrfs_chunk {
__le64 length;
__le64 owner;
__le64 stripe_len;
__le64 type;
__le32 io_align;
__le32 io_width;
__le32 sector_size;
__le16 num_stripes;
__le16 sub_stripes;
struct btrfs_stripe stripe;
} __attribute__ ((__packed__));
struct btrfs_header {
/* these first four must match the super block */
u8 csum[BTRFS_CSUM_SIZE];
u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
__le64 bytenr; /* which block this node is supposed to live in */
__le64 flags;
/* allowed to be different from the super from here on down */
u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
__le64 generation;
__le64 owner;
__le32 nritems;
u8 level;
} __attribute__ ((__packed__));
struct btrfs_item {
struct btrfs_disk_key key;
__le32 offset;
__le32 size;
} __attribute__ ((__packed__));
struct btrfs_leaf {
struct btrfs_header header;
struct btrfs_item items[];
} __attribute__ ((__packed__));
struct btrfs_key_ptr {
struct btrfs_disk_key key;
__le64 blockptr;
__le64 generation;
} __attribute__ ((__packed__));
struct btrfs_node {
struct btrfs_header header;
struct btrfs_key_ptr ptrs[];
} __attribute__ ((__packed__));
/* remember how we get to a node/leaf */
struct btrfs_path {
u64 offsets[BTRFS_MAX_LEVEL];
int itemsnr[BTRFS_MAX_LEVEL];
int slots[BTRFS_MAX_LEVEL];
/* remember last slot's item and data */
struct btrfs_item item;
u8 data[BTRFS_MAX_LEAF_SIZE];
};
/* store logical offset to physical offset mapping */
struct btrfs_chunk_map_item {
u64 logical;
u64 length;
u64 devid;
u64 physical;
};
struct btrfs_chunk_map {
struct btrfs_chunk_map_item *map;
u32 map_length;
u32 cur_length;
};
struct btrfs_timespec {
__le64 sec;
__le32 nsec;
} __attribute__ ((__packed__));
struct btrfs_inode_item {
/* nfs style generation number */
__le64 generation;
/* transid that last touched this inode */
__le64 transid;
__le64 size;
__le64 nbytes;
__le64 block_group;
__le32 nlink;
__le32 uid;
__le32 gid;
__le32 mode;
__le64 rdev;
__le64 flags;
/* modification sequence number for NFS */
__le64 sequence;
/*
* a little future expansion, for more than this we can
* just grow the inode item and version it
*/
__le64 reserved[4];
struct btrfs_timespec atime;
struct btrfs_timespec ctime;
struct btrfs_timespec mtime;
struct btrfs_timespec otime;
} __attribute__ ((__packed__));
struct btrfs_root_item {
struct btrfs_inode_item inode;
__le64 generation;
__le64 root_dirid;
__le64 bytenr;
__le64 byte_limit;
__le64 bytes_used;
__le64 last_snapshot;
__le64 flags;
__le32 refs;
struct btrfs_disk_key drop_progress;
u8 drop_level;
u8 level;
} __attribute__ ((__packed__));
struct btrfs_dir_item {
struct btrfs_disk_key location;
__le64 transid;
__le16 data_len;
__le16 name_len;
u8 type;
} __attribute__ ((__packed__));
struct btrfs_file_extent_item {
__le64 generation;
__le64 ram_bytes;
u8 compression;
u8 encryption;
__le16 other_encoding; /* spare for later use */
u8 type;
__le64 disk_bytenr;
__le64 disk_num_bytes;
__le64 offset;
__le64 num_bytes;
} __attribute__ ((__packed__));
struct btrfs_root_ref {
__le64 dirid;
__le64 sequence;
__le16 name_len;
} __attribute__ ((__packed__));
/*
* btrfs private inode information
*/
struct btrfs_pvt_inode {
uint64_t offset;
};
#define PVT(i) ((struct btrfs_pvt_inode *)((i)->pvt))
#endif