reiserfs_fs.h
来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 1,597 行 · 第 1/5 页
H
1,597 行
}static inline void set_le_key_k_type (int version, struct key * key, int type){ (version == KEY_FORMAT_3_5) ? (void)(key->u.k_offset_v1.k_uniqueness = cpu_to_le32(type2uniqueness(type))): (void)(set_offset_v2_k_type( &(key->u.k_offset_v2), type ));}static inline void set_le_ih_k_type (struct item_head * ih, int type){ set_le_key_k_type (ih_version (ih), &(ih->ih_key), type);}#define is_direntry_le_key(version,key) (le_key_k_type (version, key) == TYPE_DIRENTRY)#define is_direct_le_key(version,key) (le_key_k_type (version, key) == TYPE_DIRECT)#define is_indirect_le_key(version,key) (le_key_k_type (version, key) == TYPE_INDIRECT)#define is_statdata_le_key(version,key) (le_key_k_type (version, key) == TYPE_STAT_DATA)//// item header has version.//#define is_direntry_le_ih(ih) is_direntry_le_key (ih_version (ih), &((ih)->ih_key))#define is_direct_le_ih(ih) is_direct_le_key (ih_version (ih), &((ih)->ih_key))#define is_indirect_le_ih(ih) is_indirect_le_key (ih_version(ih), &((ih)->ih_key))#define is_statdata_le_ih(ih) is_statdata_le_key (ih_version (ih), &((ih)->ih_key))//// key is pointer to cpu key, result is cpu//static inline loff_t cpu_key_k_offset (const struct cpu_key * key){ return (key->version == KEY_FORMAT_3_5) ? key->on_disk_key.u.k_offset_v1.k_offset : key->on_disk_key.u.k_offset_v2.k_offset;}static inline loff_t cpu_key_k_type (const struct cpu_key * key){ return (key->version == KEY_FORMAT_3_5) ? uniqueness2type (key->on_disk_key.u.k_offset_v1.k_uniqueness) : key->on_disk_key.u.k_offset_v2.k_type;}static inline void set_cpu_key_k_offset (struct cpu_key * key, loff_t offset){ (key->version == KEY_FORMAT_3_5) ? (key->on_disk_key.u.k_offset_v1.k_offset = offset) : (key->on_disk_key.u.k_offset_v2.k_offset = offset);}static inline void set_cpu_key_k_type (struct cpu_key * key, int type){ (key->version == KEY_FORMAT_3_5) ? (key->on_disk_key.u.k_offset_v1.k_uniqueness = type2uniqueness (type)): (key->on_disk_key.u.k_offset_v2.k_type = type);}static inline void cpu_key_k_offset_dec (struct cpu_key * key){ if (key->version == KEY_FORMAT_3_5) key->on_disk_key.u.k_offset_v1.k_offset --; else key->on_disk_key.u.k_offset_v2.k_offset --;}#define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY)#define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT)#define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT)#define is_statdata_cpu_key(key) (cpu_key_k_type (key) == TYPE_STAT_DATA)/* are these used ? */#define is_direntry_cpu_ih(ih) (is_direntry_cpu_key (&((ih)->ih_key)))#define is_direct_cpu_ih(ih) (is_direct_cpu_key (&((ih)->ih_key)))#define is_indirect_cpu_ih(ih) (is_indirect_cpu_key (&((ih)->ih_key)))#define is_statdata_cpu_ih(ih) (is_statdata_cpu_key (&((ih)->ih_key)))#define I_K_KEY_IN_ITEM(p_s_ih, p_s_key, n_blocksize) \ ( ! COMP_SHORT_KEYS(p_s_ih, p_s_key) && \ I_OFF_BYTE_IN_ITEM(p_s_ih, k_offset (p_s_key), n_blocksize) )/* maximal length of item */ #define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)#define MIN_ITEM_LEN 1/* object identifier for root dir */#define REISERFS_ROOT_OBJECTID 2#define REISERFS_ROOT_PARENT_OBJECTID 1extern struct key root_key;/* * Picture represents a leaf of the S+tree * ______________________________________________________ * | | Array of | | | * |Block | Object-Item | F r e e | Objects- | * | head | Headers | S p a c e | Items | * |______|_______________|___________________|___________| *//* Header of a disk block. More precisely, header of a formatted leaf or internal node, and not the header of an unformatted node. */struct block_head { __u16 blk_level; /* Level of a block in the tree. */ __u16 blk_nr_item; /* Number of keys/items in a block. */ __u16 blk_free_space; /* Block free space in bytes. */ __u16 blk_reserved; /* dump this in v4/planA */ struct key blk_right_delim_key; /* kept only for compatibility */};#define BLKH_SIZE (sizeof(struct block_head))#define blkh_level(p_blkh) (le16_to_cpu((p_blkh)->blk_level))#define blkh_nr_item(p_blkh) (le16_to_cpu((p_blkh)->blk_nr_item))#define blkh_free_space(p_blkh) (le16_to_cpu((p_blkh)->blk_free_space))#define blkh_reserved(p_blkh) (le16_to_cpu((p_blkh)->blk_reserved))#define set_blkh_level(p_blkh,val) ((p_blkh)->blk_level = cpu_to_le16(val))#define set_blkh_nr_item(p_blkh,val) ((p_blkh)->blk_nr_item = cpu_to_le16(val))#define set_blkh_free_space(p_blkh,val) ((p_blkh)->blk_free_space = cpu_to_le16(val))#define set_blkh_reserved(p_blkh,val) ((p_blkh)->blk_reserved = cpu_to_le16(val))#define blkh_right_delim_key(p_blkh) ((p_blkh)->blk_right_delim_key)#define set_blkh_right_delim_key(p_blkh,val) ((p_blkh)->blk_right_delim_key = val)/* * values for blk_level field of the struct block_head */#define FREE_LEVEL 0 /* when node gets removed from the tree its blk_level is set to FREE_LEVEL. It is then used to see whether the node is still in the tree */#define DISK_LEAF_NODE_LEVEL 1 /* Leaf node level.*//* Given the buffer head of a formatted node, resolve to the block head of that node. */#define B_BLK_HEAD(p_s_bh) ((struct block_head *)((p_s_bh)->b_data))/* Number of items that are in buffer. */#define B_NR_ITEMS(p_s_bh) (blkh_nr_item(B_BLK_HEAD(p_s_bh)))#define B_LEVEL(p_s_bh) (blkh_level(B_BLK_HEAD(p_s_bh)))#define B_FREE_SPACE(p_s_bh) (blkh_free_space(B_BLK_HEAD(p_s_bh)))#define PUT_B_NR_ITEMS(p_s_bh,val) do { set_blkh_nr_item(B_BLK_HEAD(p_s_bh),val); } while (0)#define PUT_B_LEVEL(p_s_bh,val) do { set_blkh_level(B_BLK_HEAD(p_s_bh),val); } while (0)#define PUT_B_FREE_SPACE(p_s_bh,val) do { set_blkh_free_space(B_BLK_HEAD(p_s_bh),val); } while (0)/* Get right delimiting key. -- little endian */#define B_PRIGHT_DELIM_KEY(p_s_bh) (&(blk_right_delim_key(B_BLK_HEAD(p_s_bh))/* Does the buffer contain a disk leaf. */#define B_IS_ITEMS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) == DISK_LEAF_NODE_LEVEL)/* Does the buffer contain a disk internal node */#define B_IS_KEYS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) > DISK_LEAF_NODE_LEVEL \ && B_LEVEL(p_s_bh) <= MAX_HEIGHT)/***************************************************************************//* STAT DATA *//***************************************************************************///// old stat data is 32 bytes long. We are going to distinguish new one by// different size//struct stat_data_v1{ __u16 sd_mode; /* file type, permissions */ __u16 sd_nlink; /* number of hard links */ __u16 sd_uid; /* owner */ __u16 sd_gid; /* group */ __u32 sd_size; /* file size */ __u32 sd_atime; /* time of last access */ __u32 sd_mtime; /* time file was last modified */ __u32 sd_ctime; /* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */ union { __u32 sd_rdev; __u32 sd_blocks; /* number of blocks file uses */ } __attribute__ ((__packed__)) u; __u32 sd_first_direct_byte; /* first byte of file which is stored in a direct item: except that if it equals 1 it is a symlink and if it equals ~(__u32)0 there is no direct item. The existence of this field really grates on me. Let's replace it with a macro based on sd_size and our tail suppression policy. Someday. -Hans */} __attribute__ ((__packed__));#define SD_V1_SIZE (sizeof(struct stat_data_v1))#define stat_data_v1(ih) (ih_version (ih) == KEY_FORMAT_3_5)#define sd_v1_mode(sdp) (le16_to_cpu((sdp)->sd_mode))#define set_sd_v1_mode(sdp,v) ((sdp)->sd_mode = cpu_to_le16(v))#define sd_v1_nlink(sdp) (le16_to_cpu((sdp)->sd_nlink))#define set_sd_v1_nlink(sdp,v) ((sdp)->sd_nlink = cpu_to_le16(v))#define sd_v1_uid(sdp) (le16_to_cpu((sdp)->sd_uid))#define set_sd_v1_uid(sdp,v) ((sdp)->sd_uid = cpu_to_le16(v))#define sd_v1_gid(sdp) (le16_to_cpu((sdp)->sd_gid))#define set_sd_v1_gid(sdp,v) ((sdp)->sd_gid = cpu_to_le16(v))#define sd_v1_size(sdp) (le32_to_cpu((sdp)->sd_size))#define set_sd_v1_size(sdp,v) ((sdp)->sd_size = cpu_to_le32(v))#define sd_v1_atime(sdp) (le32_to_cpu((sdp)->sd_atime))#define set_sd_v1_atime(sdp,v) ((sdp)->sd_atime = cpu_to_le32(v))#define sd_v1_mtime(sdp) (le32_to_cpu((sdp)->sd_mtime))#define set_sd_v1_mtime(sdp,v) ((sdp)->sd_mtime = cpu_to_le32(v))#define sd_v1_ctime(sdp) (le32_to_cpu((sdp)->sd_ctime))#define set_sd_v1_ctime(sdp,v) ((sdp)->sd_ctime = cpu_to_le32(v))#define sd_v1_rdev(sdp) (le32_to_cpu((sdp)->u.sd_rdev))#define set_sd_v1_rdev(sdp,v) ((sdp)->u.sd_rdev = cpu_to_le32(v))#define sd_v1_blocks(sdp) (le32_to_cpu((sdp)->u.sd_blocks))#define set_sd_v1_blocks(sdp,v) ((sdp)->u.sd_blocks = cpu_to_le32(v))#define sd_v1_first_direct_byte(sdp) \ (le32_to_cpu((sdp)->sd_first_direct_byte))#define set_sd_v1_first_direct_byte(sdp,v) \ ((sdp)->sd_first_direct_byte = cpu_to_le32(v))#include <linux/ext2_fs.h>/* inode flags stored in sd_attrs (nee sd_reserved) *//* we want common flags to have the same values as in ext2, so chattr(1) will work without problems */#define REISERFS_IMMUTABLE_FL EXT2_IMMUTABLE_FL#define REISERFS_APPEND_FL EXT2_APPEND_FL#define REISERFS_SYNC_FL EXT2_SYNC_FL#define REISERFS_NOATIME_FL EXT2_NOATIME_FL#define REISERFS_NODUMP_FL EXT2_NODUMP_FL#define REISERFS_SECRM_FL EXT2_SECRM_FL#define REISERFS_UNRM_FL EXT2_UNRM_FL#define REISERFS_COMPR_FL EXT2_COMPR_FL#define REISERFS_NOTAIL_FL EXT2_NOTAIL_FL/* persistent flags that file inherits from the parent directory */#define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FL | \ REISERFS_SYNC_FL | \ REISERFS_NOATIME_FL | \ REISERFS_NODUMP_FL | \ REISERFS_SECRM_FL | \ REISERFS_COMPR_FL | \ REISERFS_NOTAIL_FL )/* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */struct stat_data { __u16 sd_mode; /* file type, permissions */ __u16 sd_attrs; /* persistent inode flags */ __u32 sd_nlink; /* number of hard links */ __u64 sd_size; /* file size */ __u32 sd_uid; /* owner */ __u32 sd_gid; /* group */ __u32 sd_atime; /* time of last access */ __u32 sd_mtime; /* time file was last modified */ __u32 sd_ctime; /* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */ __u32 sd_blocks; union { __u32 sd_rdev; __u32 sd_generation; //__u32 sd_first_direct_byte; /* first byte of file which is stored in a direct item: except that if it equals 1 it is a symlink and if it equals ~(__u32)0 there is no direct item. The existence of this field really grates on me. Let's replace it with a macro based on sd_size and our tail suppression policy? */ } __attribute__ ((__packed__)) u;} __attribute__ ((__packed__));//// this is 44 bytes long//#define SD_SIZE (sizeof(struct stat_data))#define SD_V2_SIZE SD_SIZE#define stat_data_v2(ih) (ih_version (ih) == KEY_FORMAT_3_6)#define sd_v2_mode(sdp) (le16_to_cpu((sdp)->sd_mode))#define set_sd_v2_mode(sdp,v) ((sdp)->sd_mode = cpu_to_le16(v))/* sd_reserved *//* set_sd_reserved */#define sd_v2_nlink(sdp) (le32_to_cpu((sdp)->sd_nlink))#define set_sd_v2_nlink(sdp,v) ((sdp)->sd_nlink = cpu_to_le32(v))#define sd_v2_size(sdp) (le64_to_cpu((sdp)->sd_size))#define set_sd_v2_size(sdp,v) ((sdp)->sd_size = cpu_to_le64(v))#define sd_v2_uid(sdp) (le32_to_cpu((sdp)->sd_uid))#define set_sd_v2_uid(sdp,v) ((sdp)->sd_uid = cpu_to_le32(v))#define sd_v2_gid(sdp) (le32_to_cpu((sdp)->sd_gid))#define set_sd_v2_gid(sdp,v) ((sdp)->sd_gid = cpu_to_le32(v))#define sd_v2_atime(sdp) (le32_to_cpu((sdp)->sd_atime))#define set_sd_v2_atime(sdp,v) ((sdp)->sd_atime = cpu_to_le32(v))#define sd_v2_mtime(sdp) (le32_to_cpu((sdp)->sd_mtime))#define set_sd_v2_mtime(sdp,v) ((sdp)->sd_mtime = cpu_to_le32(v))#define sd_v2_ctime(sdp) (le32_to_cpu((sdp)->sd_ctime))#define set_sd_v2_ctime(sdp,v) ((sdp)->sd_ctime = cpu_to_le32(v))#define sd_v2_blocks(sdp) (le32_to_cpu((sdp)->sd_blocks))#define set_sd_v2_blocks(sdp,v) ((sdp)->sd_blocks = cpu_to_le32(v))#define sd_v2_rdev(sdp) (le32_to_cpu((sdp)->u.sd_rdev))#define set_sd_v2_rdev(sdp,v) ((sdp)->u.sd_rdev = cpu_to_le32(v))#define sd_v2_generation(sdp) (le32_to_cpu((sdp)->u.sd_generation))#define set_sd_v2_generation(sdp,v) ((sdp)->u.sd_generation = cpu_to_le32(v))#define sd_v2_attrs(sdp) (le16_to_cpu((sdp)->sd_attrs))#define set_sd_v2_attrs(sdp,v) ((sdp)->sd_attrs = cpu_to_le16(v))
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?