X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Freiserfs_fs.h;h=06bcc4d417c52cdef2ffe9df0b09dfdb97cdbd86;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=249ad93f3e55dbb97bf0c462a8f0122ce3b20829;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 249ad93f3..06bcc4d41 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -16,6 +16,7 @@ #ifdef __KERNEL__ #include #include +#include #include #include #include @@ -242,10 +243,6 @@ struct reiserfs_super_block #define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" #define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" -extern const char reiserfs_3_5_magic_string[]; -extern const char reiserfs_3_6_magic_string[]; -extern const char reiserfs_jr_magic_string[]; - 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); @@ -438,7 +435,7 @@ static inline void set_offset_v2_k_offset( struct offset_v2 *v2, loff_t offset ) /* Key of an item determines its location in the S+tree, and is composed of 4 components */ -struct key { +struct reiserfs_key { __u32 k_dir_id; /* packing locality: by default parent directory object id */ __u32 k_objectid; /* object identifier */ @@ -450,7 +447,7 @@ struct key { struct cpu_key { - struct key on_disk_key; + struct reiserfs_key on_disk_key; int version; int key_length; /* 3 in all cases but direct2indirect and indirect2direct conversion */ @@ -470,7 +467,7 @@ struct cpu_key { #define KEY_FOUND 1 #define KEY_NOT_FOUND 0 -#define KEY_SIZE (sizeof(struct key)) +#define KEY_SIZE (sizeof(struct reiserfs_key)) #define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32)) /* return values for search_by_key and clones */ @@ -503,7 +500,7 @@ struct item_head { /* Everything in the tree is found by searching for it based on * its key.*/ - struct key ih_key; + struct reiserfs_key ih_key; union { /* The free space in the last unformatted node of an indirect item if this is an indirect item. This @@ -602,7 +599,7 @@ static inline __u32 type2uniqueness (int type) // 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) +static inline loff_t le_key_k_offset (int version, const struct reiserfs_key * key) { return (version == KEY_FORMAT_3_5) ? le32_to_cpu( key->u.k_offset_v1.k_offset ) : @@ -614,7 +611,7 @@ 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) +static inline loff_t le_key_k_type (int version, const struct reiserfs_key * key) { return (version == KEY_FORMAT_3_5) ? uniqueness2type( le32_to_cpu( key->u.k_offset_v1.k_uniqueness)) : @@ -627,7 +624,7 @@ static inline loff_t le_ih_k_type (const struct item_head * ih) } -static inline void set_le_key_k_offset (int version, struct key * key, loff_t offset) +static inline void set_le_key_k_offset (int version, struct reiserfs_key * key, loff_t offset) { (version == KEY_FORMAT_3_5) ? (void)(key->u.k_offset_v1.k_offset = cpu_to_le32 (offset)) : /* jdm check */ @@ -641,7 +638,7 @@ static inline void set_le_ih_k_offset (struct item_head * ih, loff_t offset) } -static inline void set_le_key_k_type (int version, struct key * key, int type) +static inline void set_le_key_k_type (int version, struct reiserfs_key * key, int type) { (version == KEY_FORMAT_3_5) ? (void)(key->u.k_offset_v1.k_uniqueness = cpu_to_le32(type2uniqueness(type))): @@ -738,7 +735,7 @@ static inline void cpu_key_k_offset_dec (struct cpu_key * key) /* object identifier for root dir */ #define REISERFS_ROOT_OBJECTID 2 #define REISERFS_ROOT_PARENT_OBJECTID 1 -extern struct key root_key; +extern struct reiserfs_key root_key; @@ -760,7 +757,7 @@ struct block_head { __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 */ + struct reiserfs_key blk_right_delim_key; /* kept only for compatibility */ }; #define BLKH_SIZE (sizeof(struct block_head)) @@ -1313,7 +1310,7 @@ struct path var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,} #define UNFM_P_SHIFT 2 // in in-core inode key is stored on le form -#define INODE_PKEY(inode) ((struct key *)(REISERFS_I(inode)->i_key)) +#define INODE_PKEY(inode) ((struct reiserfs_key *)(REISERFS_I(inode)->i_key)) #define MAX_UL_INT 0xffffffff #define MAX_INT 0x7ffffff @@ -1491,7 +1488,7 @@ struct tree_balance int fs_gen; /* saved value of `reiserfs_generation' counter see FILESYSTEM_CHANGED() macro in reiserfs_fs.h */ #ifdef DISPLACE_NEW_PACKING_LOCALITIES - struct key key; /* key pointer, to pass to block allocator or + struct reiserfs_key key; /* key pointer, to pass to block allocator or another low-level subsystem */ #endif } ; @@ -1555,7 +1552,7 @@ struct buffer_info { struct item_operations { int (*bytes_number) (struct item_head * ih, int block_size); void (*decrement_key) (struct cpu_key *); - int (*is_left_mergeable) (struct key * ih, unsigned long bsize); + int (*is_left_mergeable) (struct reiserfs_key * ih, unsigned long bsize); void (*print_item) (struct item_head *, char * item); void (*check_item) (struct item_head *, char * item); @@ -1570,8 +1567,6 @@ struct item_operations { }; -extern struct item_operations stat_data_ops, indirect_ops, direct_ops, - direntry_ops; extern struct item_operations * item_ops [TYPE_ANY + 1]; #define op_bytes_number(ih,bsize) item_ops[le_ih_k_type (ih)]->bytes_number (ih, bsize) @@ -1587,11 +1582,7 @@ extern struct item_operations * item_ops [TYPE_ANY + 1]; - - -#define COMP_KEYS comp_keys #define COMP_SHORT_KEYS comp_short_keys -/*#define keys_of_same_object comp_short_keys*/ /* number of blocks pointed to by the indirect item */ #define I_UNFM_NUM(p_s_ih) ( ih_item_len(p_s_ih) / UNFM_P_SIZE ) @@ -1606,7 +1597,7 @@ extern struct item_operations * item_ops [TYPE_ANY + 1]; #define B_N_PITEM_HEAD(bh,item_num) ( (struct item_head * )((bh)->b_data + BLKH_SIZE) + (item_num) ) /* get key */ -#define B_N_PDELIM_KEY(bh,item_num) ( (struct key * )((bh)->b_data + BLKH_SIZE) + (item_num) ) +#define B_N_PDELIM_KEY(bh,item_num) ( (struct reiserfs_key * )((bh)->b_data + BLKH_SIZE) + (item_num) ) /* get the key */ #define B_N_PKEY(bh,item_num) ( &(B_N_PITEM_HEAD(bh,item_num)->ih_key) ) @@ -1699,6 +1690,13 @@ struct reiserfs_journal_header { #define JOURNAL_MAX_COMMIT_AGE 30 #define JOURNAL_MAX_TRANS_AGE 30 #define JOURNAL_PER_BALANCE_CNT (3 * (MAX_HEIGHT-2) + 9) +#ifdef CONFIG_QUOTA +#define REISERFS_QUOTA_TRANS_BLOCKS 2 /* We need to update data and inode (atime) */ +#define REISERFS_QUOTA_INIT_BLOCKS (DQUOT_MAX_WRITES*(JOURNAL_PER_BALANCE_CNT+2)+1) /* 1 balancing, 1 bitmap, 1 data per write + stat data update */ +#else +#define REISERFS_QUOTA_TRANS_BLOCKS 0 +#define REISERFS_QUOTA_INIT_BLOCKS 0 +#endif /* both of these can be as low as 1, or as high as you want. The min is the ** number of 4k bitmap nodes preallocated on mount. New nodes are allocated @@ -1723,14 +1721,29 @@ struct reiserfs_journal_header { #define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) enum reiserfs_bh_state_bits { - BH_JDirty = BH_PrivateStart, + BH_JDirty = BH_PrivateStart, /* buffer is in current transaction */ BH_JDirty_wait, - BH_JNew, + BH_JNew, /* disk block was taken off free list before + * being in a finished transaction, or + * written to disk. Can be reused immed. */ BH_JPrepared, BH_JRestore_dirty, BH_JTest, // debugging only will go away }; +BUFFER_FNS(JDirty, journaled); +TAS_BUFFER_FNS(JDirty, journaled); +BUFFER_FNS(JDirty_wait, journal_dirty); +TAS_BUFFER_FNS(JDirty_wait, journal_dirty); +BUFFER_FNS(JNew, journal_new); +TAS_BUFFER_FNS(JNew, journal_new); +BUFFER_FNS(JPrepared, journal_prepared); +TAS_BUFFER_FNS(JPrepared, journal_prepared); +BUFFER_FNS(JRestore_dirty, journal_restore_dirty); +TAS_BUFFER_FNS(JRestore_dirty, journal_restore_dirty); +BUFFER_FNS(JTest, journal_test); +TAS_BUFFER_FNS(JTest, journal_test); + /* ** transaction handle which is passed around for all journal calls */ @@ -1748,6 +1761,7 @@ struct reiserfs_transaction_handle { void *t_handle_save ; /* save existing current->journal_info */ unsigned displace_new_blocks:1; /* if new block allocation occurres, that block should be displaced from others */ + struct list_head t_list; } ; /* used to keep track of ordered and tail writes, attached to the buffer @@ -1807,41 +1821,14 @@ int journal_mark_freed(struct reiserfs_transaction_handle *, struct super_block int journal_transaction_should_end(struct reiserfs_transaction_handle *, int) ; int reiserfs_in_journal(struct super_block *p_s_sb, int bmap_nr, int bit_nr, int searchall, b_blocknr_t *next) ; int journal_begin(struct reiserfs_transaction_handle *, struct super_block *p_s_sb, unsigned long) ; - -int buffer_journaled(const struct buffer_head *bh) ; -int mark_buffer_journal_new(struct buffer_head *bh) ; +int journal_join_abort(struct reiserfs_transaction_handle *, struct super_block *p_s_sb, unsigned long) ; +void reiserfs_journal_abort (struct super_block *sb, int errno); +void reiserfs_abort (struct super_block *sb, int errno, const char *fmt, ...); int reiserfs_allocate_list_bitmaps(struct super_block *s, struct reiserfs_list_bitmap *, int) ; - /* why is this kerplunked right here? */ -static inline int reiserfs_buffer_prepared(const struct buffer_head *bh) { - if (bh && test_bit(BH_JPrepared, &bh->b_state)) - return 1 ; - else - return 0 ; -} - -/* buffer was journaled, waiting to get to disk */ -static inline int buffer_journal_dirty(const struct buffer_head *bh) { - if (bh) - return test_bit(BH_JDirty_wait, &bh->b_state) ; - else - return 0 ; -} -static inline int mark_buffer_notjournal_dirty(struct buffer_head *bh) { - if (bh) - clear_bit(BH_JDirty_wait, &bh->b_state) ; - return 0 ; -} -static inline int mark_buffer_notjournal_new(struct buffer_head *bh) { - if (bh) { - clear_bit(BH_JNew, &bh->b_state) ; - } - return 0 ; -} - void add_save_link (struct reiserfs_transaction_handle * th, struct inode * inode, int truncate); -void remove_save_link (struct inode * inode, int truncate); +int remove_save_link (struct inode * inode, int truncate); /* objectid.c */ __u32 reiserfs_get_unused_objectid (struct reiserfs_transaction_handle *th); @@ -1850,31 +1837,22 @@ int reiserfs_convert_objectid_map_v1(struct super_block *) ; /* stree.c */ int B_IS_IN_TREE(const struct buffer_head *); -extern inline void copy_short_key (void * to, const void * from); extern void copy_item_head(struct item_head * p_v_to, const struct item_head * p_v_from); // first key is in cpu form, second - le -extern int comp_keys (const struct key * le_key, - const struct cpu_key * cpu_key); -extern int comp_short_keys (const struct key * le_key, +extern int comp_short_keys (const struct reiserfs_key * le_key, const struct cpu_key * cpu_key); -extern void le_key2cpu_key (struct cpu_key * to, const struct key * from); - -// both are cpu keys -extern int comp_cpu_keys (const struct cpu_key *, const struct cpu_key *); -extern int comp_short_cpu_keys (const struct cpu_key *, - const struct cpu_key *); -extern void cpu_key2cpu_key (struct cpu_key *, const struct cpu_key *); +extern void le_key2cpu_key (struct cpu_key * to, const struct reiserfs_key * from); // both are in le form -extern int comp_le_keys (const struct key *, const struct key *); -extern int comp_short_le_keys (const struct key *, const struct key *); +extern int comp_le_keys (const struct reiserfs_key *, const struct reiserfs_key *); +extern int comp_short_le_keys (const struct reiserfs_key *, const struct reiserfs_key *); // // get key version from on disk key - kludge // -static inline int le_key_version (const struct key * key) +static inline int le_key_version (const struct reiserfs_key * key) { int type; @@ -1887,17 +1865,15 @@ static inline int le_key_version (const struct key * key) } -static inline void copy_key (struct key *to, const struct key *from) +static inline void copy_key (struct reiserfs_key *to, const struct reiserfs_key *from) { memcpy (to, from, KEY_SIZE); } int comp_items (const struct item_head * stored_ih, const struct path * p_s_path); -const struct key * get_rkey (const struct path * p_s_chk_path, +const struct reiserfs_key * get_rkey (const struct path * p_s_chk_path, const struct super_block * p_s_sb); -inline int bin_search (const void * p_v_key, const void * p_v_base, - int p_n_num, int p_n_width, int * p_n_pos); int search_by_key (struct super_block *, const struct cpu_key *, struct path *, int); #define search_item(s,key,path) search_by_key (s, key, path, DISK_LEAF_NODE_LEVEL) @@ -1936,9 +1912,9 @@ int reiserfs_delete_item (struct reiserfs_transaction_handle *th, struct buffer_head * p_s_un_bh); void reiserfs_delete_solid_item (struct reiserfs_transaction_handle *th, - struct inode *inode, struct key * key); -void reiserfs_delete_object (struct reiserfs_transaction_handle *th, struct inode * p_s_inode); -void reiserfs_do_truncate (struct reiserfs_transaction_handle *th, + struct inode *inode, struct reiserfs_key * key); +int reiserfs_delete_object (struct reiserfs_transaction_handle *th, struct inode * p_s_inode); +int reiserfs_do_truncate (struct reiserfs_transaction_handle *th, struct inode * p_s_inode, struct page *, int update_timestamps); @@ -1952,12 +1928,21 @@ void reiserfs_do_truncate (struct reiserfs_transaction_handle *th, void padd_item (char * item, int total_length, int length); /* inode.c */ -void restart_transaction(struct reiserfs_transaction_handle *th, struct inode *inode, struct path *path); +/* args for the create parameter of reiserfs_get_block */ +#define GET_BLOCK_NO_CREATE 0 /* don't create new blocks or convert tails */ +#define GET_BLOCK_CREATE 1 /* add anything you need to find block */ +#define GET_BLOCK_NO_HOLE 2 /* return -ENOENT for file holes */ +#define GET_BLOCK_READ_DIRECT 4 /* read the tail if indirect item not found */ +#define GET_BLOCK_NO_ISEM 8 /* i_sem is not held, don't preallocate */ +#define GET_BLOCK_NO_DANGLE 16 /* don't leave any transactions running */ + +int restart_transaction(struct reiserfs_transaction_handle *th, struct inode *inode, struct path *path); void reiserfs_read_locked_inode(struct inode * inode, struct reiserfs_iget_args *args) ; int reiserfs_find_actor(struct inode * inode, void *p) ; int reiserfs_init_locked_inode(struct inode * inode, void *p) ; void reiserfs_delete_inode (struct inode * inode); int reiserfs_write_inode (struct inode * inode, int) ; +int reiserfs_get_block (struct inode * inode, sector_t block, struct buffer_head * bh_result, int create); struct dentry *reiserfs_get_dentry(struct super_block *, void *) ; struct dentry *reiserfs_decode_fh(struct super_block *sb, __u32 *data, int len, int fhtype, @@ -1966,8 +1951,7 @@ struct dentry *reiserfs_decode_fh(struct super_block *sb, __u32 *data, int reiserfs_encode_fh( struct dentry *dentry, __u32 *data, int *lenp, int connectable ); -int reiserfs_prepare_write(struct file *, struct page *, unsigned, unsigned) ; -void reiserfs_truncate_file(struct inode *, int update_timestamps) ; +int reiserfs_truncate_file(struct inode *, int update_timestamps) ; void make_cpu_key (struct cpu_key * cpu_key, struct inode * inode, loff_t offset, int type, int key_length); void make_le_item_head (struct item_head * ih, const struct cpu_key * key, @@ -1982,9 +1966,6 @@ int reiserfs_new_inode (struct reiserfs_transaction_handle *th, const char * symname, loff_t i_size, struct dentry *dentry, struct inode *inode); -int reiserfs_sync_inode (struct reiserfs_transaction_handle *th, - struct inode * inode); - void reiserfs_update_sd_size (struct reiserfs_transaction_handle *th, struct inode * inode, loff_t size); @@ -2083,15 +2064,12 @@ static inline void reiserfs_kfree(const void *vp, size_t size, int fix_nodes (int n_op_mode, struct tree_balance * p_s_tb, struct item_head * p_s_ins_ih, const void *); void unfix_nodes (struct tree_balance *); -void free_buffers_in_tb (struct tree_balance * p_s_tb); /* prints.c */ void reiserfs_panic (struct super_block * s, const char * fmt, ...) __attribute__ ( ( noreturn ) ); void reiserfs_info (struct super_block *s, const char * fmt, ...); -void reiserfs_printk (const char * fmt, ...); void reiserfs_debug (struct super_block *s, int level, const char * fmt, ...); -void print_virtual_node (struct virtual_node * vn); void print_indirect_item (struct buffer_head * bh, int item_num); void store_print_tb (struct tree_balance * tb); void print_cur_tb (char * mes); @@ -2101,7 +2079,6 @@ void print_bi (struct buffer_info * bi, char * mes); #define PRINT_DIRECTORY_ITEMS 2 /* print directory items */ #define PRINT_DIRECT_ITEMS 4 /* print contents of direct items */ void print_block (struct buffer_head * bh, ...); -void print_path (struct tree_balance * tb, struct path * path); void print_bmap (struct super_block * s, int silent); void print_bmap_block (int i, char * data, int size, int silent); /*void print_super_block (struct super_block * s, char * mes);*/ @@ -2142,8 +2119,6 @@ void reiserfs_invalidate_buffer (struct tree_balance * tb, struct buffer_head * int get_left_neighbor_position (struct tree_balance * tb, int h); int get_right_neighbor_position (struct tree_balance * tb, int h); void replace_key (struct tree_balance * tb, struct buffer_head *, int, struct buffer_head *, int); -void replace_lkey (struct tree_balance *, int, struct item_head *); -void replace_rkey (struct tree_balance *, int, struct item_head *); void make_empty_node (struct buffer_info *); struct buffer_head * get_FEB (struct tree_balance *); @@ -2154,7 +2129,7 @@ struct buffer_head * get_FEB (struct tree_balance *); struct __reiserfs_blocknr_hint { struct inode * inode; /* inode passed to allocator, if we allocate unf. nodes */ long block; /* file offset, in blocks */ - struct key key; + struct reiserfs_key key; struct path * path; /* search path, used by allocator to deternine search_start by * various ways */ struct reiserfs_transaction_handle * th; /* transaction handle is needed to log super blocks and @@ -2268,7 +2243,6 @@ __u32 r5_hash (const signed char *msg, int len); /* prototypes from ioctl.c */ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg); -int reiserfs_unpack (struct inode * inode, struct file * filp); /* ioctl's command */ #define REISERFS_IOC_UNPACK _IOW(0xCD,1,long)