296 lines
6.3 KiB
C
296 lines
6.3 KiB
C
#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
|