📄 reiserfs_fs.h
字号:
/* * Copyright 1996, 1997, 1998 Hans Reiser, see reiserfs/README for licensing and copyright details */ /* this file has an amazingly stupid name, yura please fix it to be reiserfs.h, and merge all the rest of our .h files that are in this directory into it. */#ifndef _LINUX_REISER_FS_H#define _LINUX_REISER_FS_H#include <linux/types.h>#include <linux/magic.h>#ifdef __KERNEL__#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/sched.h>#include <linux/workqueue.h>#include <asm/unaligned.h>#include <linux/bitops.h>#include <linux/proc_fs.h>#include <linux/smp_lock.h>#include <linux/buffer_head.h>#include <linux/reiserfs_fs_i.h>#include <linux/reiserfs_fs_sb.h>#endif/* * include/linux/reiser_fs.h * * Reiser File System constants and structures * *//* in reading the #defines, it may help to understand that they employ the following abbreviations: B = Buffer I = Item header H = Height within the tree (should be changed to LEV) N = Number of the item in the node STAT = stat data DEH = Directory Entry Header EC = Entry Count E = Entry number UL = Unsigned Long BLKH = BLocK Header UNFM = UNForMatted node DC = Disk Child P = Path These #defines are named by concatenating these abbreviations, where first comes the arguments, and last comes the return value, of the macro.*/#define USE_INODE_GENERATION_COUNTER#define REISERFS_PREALLOCATE#define DISPLACE_NEW_PACKING_LOCALITIES#define PREALLOCATION_SIZE 9/* n must be power of 2 */#define _ROUND_UP(x,n) (((x)+(n)-1u) & ~((n)-1u))// to be ok for alpha and others we have to align structures to 8 byte// boundary.// FIXME: do not change 4 by anything else: there is code which relies on that#define ROUND_UP(x) _ROUND_UP(x,8LL)/* debug levels. Right now, CONFIG_REISERFS_CHECK means print all debug** messages.*/#define REISERFS_DEBUG_CODE 5 /* extra messages to help find/debug errors */void reiserfs_warning(struct super_block *s, const char *fmt, ...);/* assertions handling *//** always check a condition and panic if it's false. */#define RASSERT( cond, format, args... ) \if( !( cond ) ) \ reiserfs_panic( NULL, "reiserfs[%i]: assertion " #cond " failed at " \ __FILE__ ":%i:%s: " format "\n", \ in_interrupt() ? -1 : current -> pid, __LINE__ , __FUNCTION__ , ##args )#if defined( CONFIG_REISERFS_CHECK )#define RFALSE( cond, format, args... ) RASSERT( !( cond ), format, ##args )#else#define RFALSE( cond, format, args... ) do {;} while( 0 )#endif#define CONSTF __attribute_const__/* * Disk Data Structures *//***************************************************************************//* SUPER BLOCK *//***************************************************************************//* * Structure of super block on disk, a version of which in RAM is often accessed as REISERFS_SB(s)->s_rs * the version in RAM is part of a larger structure containing fields never written to disk. */#define UNSET_HASH 0 // read_super will guess about, what hash names // in directories were sorted with#define TEA_HASH 1#define YURA_HASH 2#define R5_HASH 3#define DEFAULT_HASH R5_HASHstruct journal_params { __le32 jp_journal_1st_block; /* where does journal start from on its * device */ __le32 jp_journal_dev; /* journal device st_rdev */ __le32 jp_journal_size; /* size of the journal */ __le32 jp_journal_trans_max; /* max number of blocks in a transaction. */ __le32 jp_journal_magic; /* random value made on fs creation (this * was sb_journal_block_count) */ __le32 jp_journal_max_batch; /* max number of blocks to batch into a * trans */ __le32 jp_journal_max_commit_age; /* in seconds, how old can an async * commit be */ __le32 jp_journal_max_trans_age; /* in seconds, how old can a transaction * be */};/* this is the super from 3.5.X, where X >= 10 */struct reiserfs_super_block_v1 { __le32 s_block_count; /* blocks count */ __le32 s_free_blocks; /* free blocks count */ __le32 s_root_block; /* root block number */ struct journal_params s_journal; __le16 s_blocksize; /* block size */ __le16 s_oid_maxsize; /* max size of object id array, see * get_objectid() commentary */ __le16 s_oid_cursize; /* current size of object id array */ __le16 s_umount_state; /* this is set to 1 when filesystem was * umounted, to 2 - when not */ char s_magic[10]; /* reiserfs magic string indicates that * file system is reiserfs: * "ReIsErFs" or "ReIsEr2Fs" or "ReIsEr3Fs" */ __le16 s_fs_state; /* it is set to used by fsck to mark which * phase of rebuilding is done */ __le32 s_hash_function_code; /* indicate, what hash function is being use * to sort names in a directory*/ __le16 s_tree_height; /* height of disk tree */ __le16 s_bmap_nr; /* amount of bitmap blocks needed to address * each block of file system */ __le16 s_version; /* this field is only reliable on filesystem * with non-standard journal */ __le16 s_reserved_for_journal; /* size in blocks of journal area on main * device, we need to keep after * making fs with non-standard journal */} __attribute__ ((__packed__));#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1))/* this is the on disk super block */struct reiserfs_super_block { struct reiserfs_super_block_v1 s_v1; __le32 s_inode_generation; __le32 s_flags; /* Right now used only by inode-attributes, if enabled */ unsigned char s_uuid[16]; /* filesystem unique identifier */ unsigned char s_label[16]; /* filesystem volume label */ char s_unused[88]; /* zero filled by mkreiserfs and * reiserfs_convert_objectid_map_v1() * so any additions must be updated * there as well. */} __attribute__ ((__packed__));#define SB_SIZE (sizeof(struct reiserfs_super_block))#define REISERFS_VERSION_1 0#define REISERFS_VERSION_2 2// on-disk super block fields converted to cpu form#define SB_DISK_SUPER_BLOCK(s) (REISERFS_SB(s)->s_rs)#define SB_V1_DISK_SUPER_BLOCK(s) (&(SB_DISK_SUPER_BLOCK(s)->s_v1))#define SB_BLOCKSIZE(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_blocksize))#define SB_BLOCK_COUNT(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_block_count))#define SB_FREE_BLOCKS(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks))#define SB_REISERFS_MAGIC(s) \ (SB_V1_DISK_SUPER_BLOCK(s)->s_magic)#define SB_ROOT_BLOCK(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_root_block))#define SB_TREE_HEIGHT(s) \ le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height))#define SB_REISERFS_STATE(s) \ le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state))#define SB_VERSION(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_version))#define SB_BMAP_NR(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr))#define PUT_SB_BLOCK_COUNT(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_block_count = cpu_to_le32(val); } while (0)#define PUT_SB_FREE_BLOCKS(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks = cpu_to_le32(val); } while (0)#define PUT_SB_ROOT_BLOCK(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_root_block = cpu_to_le32(val); } while (0)#define PUT_SB_TREE_HEIGHT(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height = cpu_to_le16(val); } while (0)#define PUT_SB_REISERFS_STATE(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state = cpu_to_le16(val); } while (0)#define PUT_SB_VERSION(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_version = cpu_to_le16(val); } while (0)#define PUT_SB_BMAP_NR(s, val) \ do { SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr = cpu_to_le16 (val); } while (0)#define SB_ONDISK_JP(s) (&SB_V1_DISK_SUPER_BLOCK(s)->s_journal)#define SB_ONDISK_JOURNAL_SIZE(s) \ le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_size))#define SB_ONDISK_JOURNAL_1st_BLOCK(s) \ le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_1st_block))#define SB_ONDISK_JOURNAL_DEVICE(s) \ le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_dev))#define SB_ONDISK_RESERVED_FOR_JOURNAL(s) \ le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_reserved_for_journal))#define is_block_in_log_or_reserved_area(s, block) \ block >= SB_JOURNAL_1st_RESERVED_BLOCK(s) \ && block < SB_JOURNAL_1st_RESERVED_BLOCK(s) + \ ((!is_reiserfs_jr(SB_DISK_SUPER_BLOCK(s)) ? \ SB_ONDISK_JOURNAL_SIZE(s) + 1 : SB_ONDISK_RESERVED_FOR_JOURNAL(s)))int is_reiserfs_3_5(struct reiserfs_super_block *rs);int is_reiserfs_3_6(struct reiserfs_super_block *rs);int is_reiserfs_jr(struct reiserfs_super_block *rs);/* ReiserFS leaves the first 64k unused, so that partition labels have enough space. If someone wants to write a fancy bootloader that needs more than 64k, let us know, and this will be increased in size. This number must be larger than than the largest block size on any platform, or code will break. -Hans */#define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)#define REISERFS_FIRST_BLOCK unused_define#define REISERFS_JOURNAL_OFFSET_IN_BYTES REISERFS_DISK_OFFSET_IN_BYTES/* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */#define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)// reiserfs internal error code (used by search_by_key adn fix_nodes))#define CARRY_ON 0#define REPEAT_SEARCH -1#define IO_ERROR -2#define NO_DISK_SPACE -3#define NO_BALANCING_NEEDED (-4)#define NO_MORE_UNUSED_CONTIGUOUS_BLOCKS (-5)#define QUOTA_EXCEEDED -6typedef __u32 b_blocknr_t;typedef __le32 unp_t;struct unfm_nodeinfo { unp_t unfm_nodenum; unsigned short unfm_freespace;};/* there are two formats of keys: 3.5 and 3.6 */#define KEY_FORMAT_3_5 0#define KEY_FORMAT_3_6 1/* there are two stat datas */#define STAT_DATA_V1 0#define STAT_DATA_V2 1static inline struct reiserfs_inode_info *REISERFS_I(const struct inode *inode){ return container_of(inode, struct reiserfs_inode_info, vfs_inode);}static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb){ return sb->s_fs_info;}/** this says about version of key of all items (but stat data) the object consists of */#define get_inode_item_key_version( inode ) \ ((REISERFS_I(inode)->i_flags & i_item_key_version_mask) ? KEY_FORMAT_3_6 : KEY_FORMAT_3_5)#define set_inode_item_key_version( inode, version ) \ ({ if((version)==KEY_FORMAT_3_6) \ REISERFS_I(inode)->i_flags |= i_item_key_version_mask; \ else \ REISERFS_I(inode)->i_flags &= ~i_item_key_version_mask; })#define get_inode_sd_version(inode) \ ((REISERFS_I(inode)->i_flags & i_stat_data_version_mask) ? STAT_DATA_V2 : STAT_DATA_V1)#define set_inode_sd_version(inode, version) \ ({ if((version)==STAT_DATA_V2) \ REISERFS_I(inode)->i_flags |= i_stat_data_version_mask; \ else \ REISERFS_I(inode)->i_flags &= ~i_stat_data_version_mask; })/* This is an aggressive tail suppression policy, I am hoping it improves our benchmarks. The principle behind it is that percentage space saving is what matters, not absolute space saving. This is non-intuitive, but it helps to understand it if you consider that the cost to access 4 blocks is not much more than the cost to access 1 block, if you have to do a seek and rotate. A tail risks a non-linear disk access that is significant as a percentage of total time cost for a 4 block file and saves an amount of space that is less significant as a percentage of space, or so goes the hypothesis. -Hans */#define STORE_TAIL_IN_UNFM_S1(n_file_size,n_tail_size,n_block_size) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -