⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reiserfs_fs.h

📁 Axis 221 camera embedded programing interface
💻 H
📖 第 1 页 / 共 5 页
字号:
	return key->on_disk_key.k_offset;}static __inline__ loff_t cpu_key_k_type(const struct cpu_key *key){	return key->on_disk_key.k_type;}static __inline__ void set_cpu_key_k_offset(struct cpu_key *key, loff_t offset){	key->on_disk_key.k_offset = offset;}static __inline__ void set_cpu_key_k_type(struct cpu_key *key, int type){	key->on_disk_key.k_type = type;}static __inline__ void cpu_key_k_offset_dec(struct cpu_key *key){	key->on_disk_key.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 reiserfs_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 {	__le16 blk_level;	/* Level of a block in the tree. */	__le16 blk_nr_item;	/* Number of keys/items in a block. */	__le16 blk_free_space;	/* Block free space in bytes. */	__le16 blk_reserved;	/* dump this in v4/planA */	struct reiserfs_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 {	__le16 sd_mode;		/* file type, permissions */	__le16 sd_nlink;	/* number of hard links */	__le16 sd_uid;		/* owner */	__le16 sd_gid;		/* group */	__le32 sd_size;		/* file size */	__le32 sd_atime;	/* time of last access */	__le32 sd_mtime;	/* time file was last modified  */	__le32 sd_ctime;	/* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */	union {		__le32 sd_rdev;		__le32 sd_blocks;	/* number of blocks file uses */	} __attribute__ ((__packed__)) u;	__le32 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))/* 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 FS_IMMUTABLE_FL#define REISERFS_APPEND_FL    FS_APPEND_FL#define REISERFS_SYNC_FL      FS_SYNC_FL#define REISERFS_NOATIME_FL   FS_NOATIME_FL#define REISERFS_NODUMP_FL    FS_NODUMP_FL#define REISERFS_SECRM_FL     FS_SECRM_FL#define REISERFS_UNRM_FL      FS_UNRM_FL#define REISERFS_COMPR_FL     FS_COMPR_FL#define REISERFS_NOTAIL_FL    FS_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 {	__le16 sd_mode;		/* file type, permissions */	__le16 sd_attrs;	/* persistent inode flags */	__le32 sd_nlink;	/* number of hard links */	__le64 sd_size;		/* file size */	__le32 sd_uid;		/* owner */	__le32 sd_gid;		/* group */	__le32 sd_atime;	/* time of last access */	__le32 sd_mtime;	/* time file was last modified  */	__le32 sd_ctime;	/* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */	__le32 sd_blocks;	union {		__le32 sd_rdev;		__le32 sd_generation;		//__le32 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))/***************************************************************************//*                      DIRECTORY STRUCTURE                                *//***************************************************************************//*    Picture represents the structure of directory items   ________________________________________________   |  Array of     |   |     |        |       |   |   | directory     |N-1| N-2 | ....   |   1st |0th|   | entry headers |   |     |        |       |   |   |_______________|___|_____|________|_______|___|                    <----   directory entries         ------> First directory item has k_offset component 1. We store "." and ".." in one item, always, we never split "." and ".." into differing items.  This makes, among other things, the code for removing directories simpler. */#define SD_OFFSET  0#define SD_UNIQUENESS 0#define DOT_OFFSET 1#define DOT_DOT_OFFSET 2#define DIRENTRY_UNIQUENESS 500/* */#define FIRST_ITEM_OFFSET 1/*   Q: How to get key of object pointed to by entry from entry?     A: Each directory entry has its header. This header has deh_dir_id and deh_objectid fields, those are key      of object, entry points to *//* NOT IMPLEMENTED:      Directory will someday contain stat data of object */struct reiserfs_de_head {	__le32 deh_offset;	/* third component of the directory entry key */	__le32 deh_dir_id;	/* objectid of the parent directory of the object, that is referenced				   by directory entry */	__le32 deh_objectid;	/* objectid of the object, that is referenced by directory entry */	__le16 deh_location;	/* offset of name in the whole item */	__le16 deh_state;	/* whether 1) entry contains stat data (for future), and 2) whether				   entry is hidden (unlinked) */} __attribute__ ((__packed__));#define DEH_SIZE                  sizeof(struct reiserfs_de_head)#define deh_offset(p_deh)         (le32_to_cpu((p_deh)->deh_offset))#define deh_dir_id(p_deh)         (le32_to_cpu((p_deh)->deh_dir_id))#define deh_objectid(p_deh)       (le32_to_cpu((p_deh)->deh_objectid))#define deh_location(p_deh)       (le16_to_cpu((p_deh)->deh_location))#define deh_state(p_deh)          (le16_to_cpu((p_deh)->deh_state))#define put_deh_offset(p_deh,v)   ((p_deh)->deh_offset = cpu_to_le32((v)))#define put_deh_dir_id(p_deh,v)   ((p_deh)->deh_dir_id = cpu_to_le32((v)))#define put_deh_objectid(p_deh,v) ((p_deh)->deh_objectid = cpu_to_le32((v)))#define put_deh_location(p_deh,v) ((p_deh)->deh_location = cpu_to_le16((v)))#define put_deh_state(p_deh,v)    ((p_deh)->deh_state = cpu_to_le16((v)))/* empty directory contains two entries "." and ".." and their headers */#define EMPTY_DIR_SIZE \(DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen ("..")))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -