diff options
| author | Oleg Drokin <green@angband.namesys.com> | 2002-09-04 21:27:40 +0400 |
|---|---|---|
| committer | Oleg Drokin <green@angband.namesys.com> | 2002-09-04 21:27:40 +0400 |
| commit | 4ff479db8340fa104f3f839a5fe6fc3a9b62e268 (patch) | |
| tree | 22579f46105f8729bbe1108425430262feaa3273 /include | |
| parent | 97460db935d53cb700d97156448b661168e29687 (diff) | |
| parent | bdb5599340454f0c598f92fdf08bc24a6b260da9 (diff) | |
Merge angband.namesys.com:/home/green/bk/linux-2.5
into angband.namesys.com:/home/green/bk_work/reiser3-linux-2.5
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/reiserfs_fs.h | 108 | ||||
| -rw-r--r-- | include/linux/reiserfs_fs_i.h | 4 | ||||
| -rw-r--r-- | include/linux/reiserfs_fs_sb.h | 45 |
3 files changed, 137 insertions, 20 deletions
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index b3a2a5a1a78c..a5693b3f4a3f 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -59,7 +59,8 @@ #define USE_INODE_GENERATION_COUNTER #define REISERFS_PREALLOCATE -#define PREALLOCATION_SIZE 8 +#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)) @@ -326,7 +327,7 @@ static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb) 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(n_file_size,n_tail_size,n_block_size) \ +#define STORE_TAIL_IN_UNFM_S1(n_file_size,n_tail_size,n_block_size) \ (\ (!(n_tail_size)) || \ (((n_tail_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) || \ @@ -339,6 +340,18 @@ static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb) ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size) * 3)/4) ) ) \ ) +/* Another strategy for tails, this one means only create a tail if all the + file would fit into one DIRECT item. + Primary intention for this one is to increase performance by decreasing + seeking. +*/ +#define STORE_TAIL_IN_UNFM_S2(n_file_size,n_tail_size,n_block_size) \ +(\ + (!(n_tail_size)) || \ + (((n_file_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) ) \ +) + + /* * values for s_umount_state field @@ -1433,6 +1446,10 @@ 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 + another low-level subsystem */ +#endif } ; /* These are modes of balancing */ @@ -1673,7 +1690,7 @@ int journal_mark_freed(struct reiserfs_transaction_handle *, struct super_block int push_journal_writer(char *w) ; int pop_journal_writer(int windex) ; int journal_transaction_should_end(struct reiserfs_transaction_handle *, int) ; -int reiserfs_in_journal(struct super_block *p_s_sb, unsigned long bl, int searchall, unsigned long *next) ; +int reiserfs_in_journal(struct super_block *p_s_sb, int bmap_nr, int bit_nr, int searchall, unsigned long *next) ; int journal_begin(struct reiserfs_transaction_handle *, struct super_block *p_s_sb, unsigned long) ; void flush_async_commits(struct super_block *p_s_sb) ; @@ -1818,8 +1835,8 @@ void reiserfs_do_truncate (struct reiserfs_transaction_handle *th, #define file_size(inode) ((inode)->i_size) #define tail_size(inode) (file_size (inode) & (i_block_size (inode) - 1)) -#define tail_has_to_be_packed(inode) (!dont_have_tails ((inode)->i_sb) &&\ -!STORE_TAIL_IN_UNFM(file_size (inode), tail_size(inode), i_block_size (inode))) +#define tail_has_to_be_packed(inode) (have_large_tails ((inode)->i_sb)?\ +!STORE_TAIL_IN_UNFM_S1(file_size (inode), tail_size(inode), inode->i_sb->s_blocksize):have_small_tails ((inode)->i_sb)?!STORE_TAIL_IN_UNFM_S2(file_size (inode), tail_size(inode), inode->i_sb->s_blocksize):0 ) void padd_item (char * item, int total_length, int length); @@ -2015,22 +2032,87 @@ void make_empty_node (struct buffer_info *); struct buffer_head * get_FEB (struct tree_balance *); /* bitmap.c */ + +/* structure contains hints for block allocator, and it is a container for + * arguments, such as node, search path, transaction_handle, etc. */ + 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 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 + * bitmap blocks changes */ + b_blocknr_t beg, end; + b_blocknr_t search_start; /* a field used to transfer search start value (block number) + * between different block allocator procedures + * (determine_search_start() and others) */ + int prealloc_size; /* is set in determine_prealloc_size() function, used by underlayed + * function that do actual allocation */ + + int formatted_node:1; /* the allocator uses different polices for getting disk space for + * formatted/unformatted blocks with/without preallocation */ + int preallocate:1; +}; + +typedef struct __reiserfs_blocknr_hint reiserfs_blocknr_hint_t; + +int reiserfs_parse_alloc_options (struct super_block *, char *); int is_reusable (struct super_block * s, unsigned long block, int bit_value); void reiserfs_free_block (struct reiserfs_transaction_handle *th, unsigned long); -int reiserfs_new_blocknrs (struct reiserfs_transaction_handle *th, - unsigned long * pblocknrs, unsigned long start_from, int amount_needed); -int reiserfs_new_unf_blocknrs (struct reiserfs_transaction_handle *th, - unsigned long * pblocknr, unsigned long start_from); +int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *, b_blocknr_t * , int, int); +extern inline int reiserfs_new_form_blocknrs (struct tree_balance * tb, + b_blocknr_t *new_blocknrs, int amount_needed) +{ + reiserfs_blocknr_hint_t hint = { + th:tb->transaction_handle, + path: tb->tb_path, + inode: NULL, + key: tb->key, + block: 0, + formatted_node:1 + }; + return reiserfs_allocate_blocknrs(&hint, new_blocknrs, amount_needed, 0); +} + +extern inline int reiserfs_new_unf_blocknrs (struct reiserfs_transaction_handle *th, + b_blocknr_t *new_blocknrs, + struct path * path, long block) +{ + reiserfs_blocknr_hint_t hint = { + th: th, + path: path, + inode: NULL, + block: block, + formatted_node: 0, + preallocate: 0 + }; + return reiserfs_allocate_blocknrs(&hint, new_blocknrs, 1, 0); +} + #ifdef REISERFS_PREALLOCATE -int reiserfs_new_unf_blocknrs2 (struct reiserfs_transaction_handle *th, - struct inode * inode, - unsigned long * pblocknr, - unsigned long start_from); +extern inline int reiserfs_new_unf_blocknrs2(struct reiserfs_transaction_handle *th, + struct inode * inode, + b_blocknr_t *new_blocknrs, + struct path * path, long block) +{ + reiserfs_blocknr_hint_t hint = { + th: th, + path: path, + inode: inode, + block: block, + formatted_node: 0, + preallocate: 1 + }; + return reiserfs_allocate_blocknrs(&hint, new_blocknrs, 1, 0); +} void reiserfs_discard_prealloc (struct reiserfs_transaction_handle *th, struct inode * inode); void reiserfs_discard_all_prealloc (struct reiserfs_transaction_handle *th); #endif +void reiserfs_claim_blocks_to_be_allocated( struct super_block *sb, int blocks); +void reiserfs_release_claimed_blocks( struct super_block *sb, int blocks); /* hashes.c */ __u32 keyed_hash (const signed char *msg, int len); diff --git a/include/linux/reiserfs_fs_i.h b/include/linux/reiserfs_fs_i.h index d76abebe56a8..5c6b26b1d9b5 100644 --- a/include/linux/reiserfs_fs_i.h +++ b/include/linux/reiserfs_fs_i.h @@ -37,6 +37,10 @@ struct reiserfs_inode_info { struct list_head i_prealloc_list; /* per-transaction list of inodes which * have preallocated blocks */ + int new_packing_locality:1; /* new_packig_locality is created; new blocks + * for the contents of this directory should be + * displaced */ + /* we use these for fsync or O_SYNC to decide which transaction ** needs to be committed in order for this inode to be properly ** flushed */ diff --git a/include/linux/reiserfs_fs_sb.h b/include/linux/reiserfs_fs_sb.h index 534d8e20bdb7..74bd8e0a1d3e 100644 --- a/include/linux/reiserfs_fs_sb.h +++ b/include/linux/reiserfs_fs_sb.h @@ -160,7 +160,10 @@ struct reiserfs_transaction_handle { int t_blocks_allocated ; /* number of blocks this writer allocated */ unsigned long t_trans_id ; /* sanity check, equals the current trans id */ struct super_block *t_super ; /* super for this FS when journal_begin was - called. */ + called. saves calls to reiserfs_get_super */ + int displace_new_blocks:1; /* if new block allocation occurres, that block + should be displaced from others */ + } ; /* @@ -254,6 +257,14 @@ struct reiserfs_journal { typedef __u32 (*hashf_t) (const signed char *, int); +struct reiserfs_bitmap_info +{ + // FIXME: Won't work with block sizes > 8K + __u16 first_zero_hint; + __u16 free_count; + struct buffer_head *bh; /* the actual bitmap */ +}; + struct proc_dir_entry; #if defined( CONFIG_PROC_FS ) && defined( CONFIG_REISERFS_PROC_INFO ) @@ -270,6 +281,12 @@ typedef struct reiserfs_proc_info_data stat_cnt_t search_by_key_fs_changed; stat_cnt_t search_by_key_restarted; + stat_cnt_t insert_item_restarted; + stat_cnt_t paste_into_item_restarted; + stat_cnt_t cut_from_item_restarted; + stat_cnt_t delete_solid_item_restarted; + stat_cnt_t delete_item_restarted; + stat_cnt_t leaked_oid; stat_cnt_t leaves_removable; @@ -292,14 +309,15 @@ typedef struct reiserfs_proc_info_data stat_cnt_t need_r_neighbor[ 5 ]; stat_cnt_t free_block; - struct __find_forward_stats { + struct __scan_bitmap_stats { stat_cnt_t call; stat_cnt_t wait; stat_cnt_t bmap; stat_cnt_t retry; stat_cnt_t in_journal_hint; - stat_cnt_t in_journal_out; - } find_forward; + stat_cnt_t in_journal_nohint; + stat_cnt_t stolen; + } scan_bitmap; struct __journal_stats { stat_cnt_t in_journal; stat_cnt_t in_journal_bitmap; @@ -329,7 +347,7 @@ struct reiserfs_sb_info /* both the comment and the choice of name are unclear for s_rs -Hans */ struct reiserfs_super_block * s_rs; /* Pointer to the super block in the buffer */ - struct buffer_head ** s_ap_bitmap; /* array of buffers, holding block bitmap */ + struct reiserfs_bitmap_info * s_ap_bitmap; struct reiserfs_journal *s_journal ; /* pointer to journal information */ unsigned short s_mount_state; /* reiserfs state (valid, invalid) */ @@ -342,6 +360,16 @@ struct reiserfs_sb_info here (currently - NOTAIL, NOLOG, REPLAYONLY) */ + struct { /* This is a structure that describes block allocator options */ + unsigned long bits; /* Bitfield for enable/disable kind of options */ + unsigned long large_file_size; /* size started from which we consider file to be a large one(in blocks) */ + int border; /* percentage of disk, border takes */ + int preallocmin; /* Minimal file size (in blocks) starting from which we do preallocations */ + int preallocsize; /* Number of blocks we try to prealloc when file + reaches preallocmin size (in blocks) or + prealloc_list is empty. */ + } s_alloc_options; + /* Comment? -Hans */ wait_queue_head_t s_wait; /* To be obsoleted soon by per buffer seals.. -Hans */ @@ -368,6 +396,7 @@ struct reiserfs_sb_info int s_is_unlinked_ok; reiserfs_proc_info_data_t s_proc_info_data; struct proc_dir_entry *procdir; + int reserved_blocks; /* amount of blocks reserved for further allocations */ }; /* Definitions of reiserfs on-disk properties: */ @@ -375,7 +404,8 @@ struct reiserfs_sb_info #define REISERFS_3_6 1 /* Mount options */ -#define NOTAIL 0 /* -o notail: no tails will be created in a session */ +#define REISERFS_LARGETAIL 0 /* large tails will be created in a session */ +#define REISERFS_SMALLTAIL 17 /* small (for files less than block size) tails will be created in a session */ #define REPLAYONLY 3 /* replay journal and return 0. Use by fsck */ #define REISERFS_NOLOG 4 /* -o nolog: turn journalling off */ #define REISERFS_CONVERT 5 /* -o conv: causes conversion of old @@ -423,7 +453,8 @@ struct reiserfs_sb_info #define reiserfs_hashed_relocation(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_HASHED_RELOCATION)) #define reiserfs_test4(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_TEST4)) -#define dont_have_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << NOTAIL)) +#define have_large_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_LARGETAIL)) +#define have_small_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_SMALLTAIL)) #define replay_only(s) (REISERFS_SB(s)->s_mount_opt & (1 << REPLAYONLY)) #define reiserfs_dont_log(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_NOLOG)) #define old_format_only(s) (REISERFS_SB(s)->s_properties & (1 << REISERFS_3_5)) |
