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

📄 reiserfs_fs.h

📁 linux得一些常用命令,以及linux环境下的c编程
💻 H
📖 第 1 页 / 共 5 页
字号:
   to it as that parameter. */#define REISERFS_FULL_KEY_LEN     4#define REISERFS_SHORT_KEY_LEN    2/* The result of the key compare */#define FIRST_GREATER 1#define SECOND_GREATER -1#define KEYS_IDENTICAL 0#define KEY_FOUND 1#define KEY_NOT_FOUND 0#define KEY_SIZE (sizeof(struct key))#define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32))/* return values for search_by_key and clones */#define ITEM_FOUND 1#define ITEM_NOT_FOUND 0#define ENTRY_FOUND 1#define ENTRY_NOT_FOUND 0#define DIRECTORY_NOT_FOUND -1#define REGULAR_FILE_FOUND -2#define DIRECTORY_FOUND -3#define BYTE_FOUND 1#define BYTE_NOT_FOUND 0#define FILE_NOT_FOUND -1#define POSITION_FOUND 1#define POSITION_NOT_FOUND 0// return values for reiserfs_find_entry and search_by_entry_key#define NAME_FOUND 1#define NAME_NOT_FOUND 0#define GOTO_PREVIOUS_ITEM 2#define NAME_FOUND_INVISIBLE 3/*  Everything in the filesystem is stored as a set of items.  The    item head contains the key of the item, its free space (for    indirect items) and specifies the location of the item itself    within the block.  */struct item_head{	/* Everything in the tree is found by searching for it based on	 * its key.*/	struct key ih_key; 		union {		/* The free space in the last unformatted node of an		   indirect item if this is an indirect item.  This		   equals 0xFFFF iff this is a direct item or stat data		   item. Note that the key, not this field, is used to		   determine the item type, and thus which field this		   union contains. */		__u16 ih_free_space_reserved; 		/* Iff this is a directory item, this field equals the		   number of directory entries in the directory item. */		__u16 ih_entry_count; 	} __attribute__ ((__packed__)) u;	__u16 ih_item_len;           /* total size of the item body */	__u16 ih_item_location;      /* an offset to the item body				      * within the block */	__u16 ih_version;	     /* 0 for all old items, 2 for new					ones. Highest bit is set by fsck					temporary, cleaned after all					done */} __attribute__ ((__packed__));/* size of item header     */#define IH_SIZE (sizeof(struct item_head))#define ih_free_space(ih)            le16_to_cpu((ih)->u.ih_free_space_reserved)#define ih_version(ih)               le16_to_cpu((ih)->ih_version)#define ih_entry_count(ih)           le16_to_cpu((ih)->u.ih_entry_count)#define ih_location(ih)              le16_to_cpu((ih)->ih_item_location)#define ih_item_len(ih)              le16_to_cpu((ih)->ih_item_len)#define put_ih_free_space(ih, val)   do { (ih)->u.ih_free_space_reserved = cpu_to_le16(val); } while(0)#define put_ih_version(ih, val)      do { (ih)->ih_version = cpu_to_le16(val); } while (0)#define put_ih_entry_count(ih, val)  do { (ih)->u.ih_entry_count = cpu_to_le16(val); } while (0)#define put_ih_location(ih, val)     do { (ih)->ih_item_location = cpu_to_le16(val); } while (0)#define put_ih_item_len(ih, val)     do { (ih)->ih_item_len = cpu_to_le16(val); } while (0)#define unreachable_item(ih) (ih_version(ih) & (1 << 15))#define get_ih_free_space(ih) (ih_version (ih) == KEY_FORMAT_3_6 ? 0 : ih_free_space (ih))#define set_ih_free_space(ih,val) put_ih_free_space((ih), ((ih_version(ih) == KEY_FORMAT_3_6) ? 0 : (val)))/* these operate on indirect items, where you've got an array of ints** at a possibly unaligned location.  These are a noop on ia32** ** p is the array of __u32, i is the index into the array, v is the value** to store there.*/#define get_block_num(p, i) le32_to_cpu(get_unaligned((p) + (i)))#define put_block_num(p, i, v) put_unaligned(cpu_to_le32(v), (p) + (i))//// in old version uniqueness field shows key type//#define V1_SD_UNIQUENESS 0#define V1_INDIRECT_UNIQUENESS 0xfffffffe#define V1_DIRECT_UNIQUENESS 0xffffffff#define V1_DIRENTRY_UNIQUENESS 500#define V1_ANY_UNIQUENESS 555 // FIXME: comment is requiredextern void reiserfs_warning (const char * fmt, ...);/* __attribute__( ( format ( printf, 1, 2 ) ) ); *///// here are conversion routines//static inline int uniqueness2type (__u32 uniqueness) CONSTF;static inline int uniqueness2type (__u32 uniqueness){    switch (uniqueness) {    case V1_SD_UNIQUENESS: return TYPE_STAT_DATA;    case V1_INDIRECT_UNIQUENESS: return TYPE_INDIRECT;    case V1_DIRECT_UNIQUENESS: return TYPE_DIRECT;    case V1_DIRENTRY_UNIQUENESS: return TYPE_DIRENTRY;    default:	    reiserfs_warning( "vs-500: unknown uniqueness %d\n", uniqueness);	case V1_ANY_UNIQUENESS:	    return TYPE_ANY;    }}static inline __u32 type2uniqueness (int type) CONSTF;static inline __u32 type2uniqueness (int type){    switch (type) {    case TYPE_STAT_DATA: return V1_SD_UNIQUENESS;    case TYPE_INDIRECT: return V1_INDIRECT_UNIQUENESS;    case TYPE_DIRECT: return V1_DIRECT_UNIQUENESS;    case TYPE_DIRENTRY: return V1_DIRENTRY_UNIQUENESS;    default:	    reiserfs_warning( "vs-501: unknown type %d\n", type);	case TYPE_ANY:	    return V1_ANY_UNIQUENESS;    }}//// key is pointer to on disk key which is stored in le, result is cpu,// there is no way to get version of object from key, so, provide// version to these defines//static inline loff_t le_key_k_offset (int version, const struct key * key){    return (version == KEY_FORMAT_3_5) ?        le32_to_cpu( key->u.k_offset_v1.k_offset ) :	offset_v2_k_offset( &(key->u.k_offset_v2) );}static inline loff_t le_ih_k_offset (const struct item_head * ih){    return le_key_k_offset (ih_version (ih), &(ih->ih_key));}static inline loff_t le_key_k_type (int version, const struct key * key){    return (version == KEY_FORMAT_3_5) ?        uniqueness2type( le32_to_cpu( key->u.k_offset_v1.k_uniqueness)) :	offset_v2_k_type( &(key->u.k_offset_v2) );}static inline loff_t le_ih_k_type (const struct item_head * ih){    return le_key_k_type (ih_version (ih), &(ih->ih_key));}static inline void set_le_key_k_offset (int version, struct key * key, loff_t offset){    (version == KEY_FORMAT_3_5) ?        (key->u.k_offset_v1.k_offset = cpu_to_le32 (offset)) : /* jdm check */	(set_offset_v2_k_offset( &(key->u.k_offset_v2), offset ));}static inline void set_le_ih_k_offset (struct item_head * ih, loff_t offset){    set_le_key_k_offset (ih_version (ih), &(ih->ih_key), offset);}static inline void set_le_key_k_type (int version, struct key * key, int type){    (version == KEY_FORMAT_3_5) ?        (key->u.k_offset_v1.k_uniqueness = cpu_to_le32(type2uniqueness(type))):	(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)

⌨️ 快捷键说明

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