1 /* Copyright 1996-2002 Hans Reiser, see reiserfs/README for licensing
2  * and copyright details */
3 
4 #ifndef _LINUX_REISER_FS_SB
5 #define _LINUX_REISER_FS_SB
6 
7 #ifdef __KERNEL__
8 #include <linux/tqueue.h>
9 #endif
10 
11 //
12 // super block's field values
13 //s
14 /*#define REISERFS_VERSION 0 undistributed bitmap */
15 /*#define REISERFS_VERSION 1 distributed bitmap and resizer*/
16 #define REISERFS_VERSION_2 2 /* distributed bitmap, resizer, 64-bit, etc*/
17 #define UNSET_HASH 0 // read_super will guess about, what hash names
18                      // in directories were sorted with
19 #define TEA_HASH  1
20 #define YURA_HASH 2
21 #define R5_HASH   3
22 #define DEFAULT_HASH R5_HASH
23 
24 /* struct reiserfs_super_block accessors/mutators
25  * since this is a disk structure, it will always be in
26  * little endian format. */
27 
28 typedef enum {
29   reiserfs_attrs_cleared       = 0x00000001,
30 } reiserfs_super_block_flags;
31 
32 #define sb_block_count(sbp)         (le32_to_cpu((sbp)->s_v1.s_block_count))
33 #define set_sb_block_count(sbp,v)   ((sbp)->s_v1.s_block_count = cpu_to_le32(v))
34 #define sb_free_blocks(sbp)         (le32_to_cpu((sbp)->s_v1.s_free_blocks))
35 #define set_sb_free_blocks(sbp,v)   ((sbp)->s_v1.s_free_blocks = cpu_to_le32(v))
36 #define sb_root_block(sbp)          (le32_to_cpu((sbp)->s_v1.s_root_block))
37 #define set_sb_root_block(sbp,v)    ((sbp)->s_v1.s_root_block = cpu_to_le32(v))
38 
39 #define sb_jp_journal_1st_block(sbp)  \
40               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_1st_block))
41 #define set_sb_jp_journal_1st_block(sbp,v) \
42               ((sbp)->s_v1.s_journal.jp_journal_1st_block = cpu_to_le32(v))
43 #define sb_jp_journal_dev(sbp) \
44               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_dev))
45 #define set_sb_jp_journal_dev(sbp,v) \
46               ((sbp)->s_v1.s_journal.jp_journal_dev = cpu_to_le32(v))
47 #define sb_jp_journal_size(sbp) \
48               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_size))
49 #define set_sb_jp_journal_size(sbp,v) \
50               ((sbp)->s_v1.s_journal.jp_journal_size = cpu_to_le32(v))
51 #define sb_jp_journal_trans_max(sbp) \
52               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_trans_max))
53 #define set_sb_jp_journal_trans_max(sbp,v) \
54               ((sbp)->s_v1.s_journal.jp_journal_trans_max = cpu_to_le32(v))
55 #define sb_jp_journal_magic(sbp) \
56               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_magic))
57 #define set_sb_jp_journal_magic(sbp,v) \
58               ((sbp)->s_v1.s_journal.jp_journal_magic = cpu_to_le32(v))
59 #define sb_jp_journal_max_batch(sbp) \
60               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_max_batch))
61 #define set_sb_jp_journal_max_batch(sbp,v) \
62               ((sbp)->s_v1.s_journal.jp_journal_max_batch = cpu_to_le32(v))
63 #define sb_jp_jourmal_max_commit_age(sbp) \
64               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_max_commit_age))
65 #define set_sb_jp_journal_max_commit_age(sbp,v) \
66               ((sbp)->s_v1.s_journal.jp_journal_max_commit_age = cpu_to_le32(v))
67 
68 #define sb_blocksize(sbp)          (le16_to_cpu((sbp)->s_v1.s_blocksize))
69 #define set_sb_blocksize(sbp,v)    ((sbp)->s_v1.s_blocksize = cpu_to_le16(v))
70 #define sb_oid_maxsize(sbp)        (le16_to_cpu((sbp)->s_v1.s_oid_maxsize))
71 #define set_sb_oid_maxsize(sbp,v)  ((sbp)->s_v1.s_oid_maxsize = cpu_to_le16(v))
72 #define sb_oid_cursize(sbp)        (le16_to_cpu((sbp)->s_v1.s_oid_cursize))
73 #define set_sb_oid_cursize(sbp,v)  ((sbp)->s_v1.s_oid_cursize = cpu_to_le16(v))
74 #define sb_umount_state(sbp)       (le16_to_cpu((sbp)->s_v1.s_umount_state))
75 #define set_sb_umount_state(sbp,v) ((sbp)->s_v1.s_umount_state = cpu_to_le16(v))
76 #define sb_fs_state(sbp)           (le16_to_cpu((sbp)->s_v1.s_fs_state))
77 #define set_sb_fs_state(sbp,v)     ((sbp)->s_v1.s_fs_state = cpu_to_le16(v))
78 #define sb_hash_function_code(sbp) \
79               (le32_to_cpu((sbp)->s_v1.s_hash_function_code))
80 #define set_sb_hash_function_code(sbp,v) \
81               ((sbp)->s_v1.s_hash_function_code = cpu_to_le32(v))
82 #define sb_tree_height(sbp)        (le16_to_cpu((sbp)->s_v1.s_tree_height))
83 #define set_sb_tree_height(sbp,v)  ((sbp)->s_v1.s_tree_height = cpu_to_le16(v))
84 #define sb_bmap_nr(sbp)            (le16_to_cpu((sbp)->s_v1.s_bmap_nr))
85 #define set_sb_bmap_nr(sbp,v)      ((sbp)->s_v1.s_bmap_nr = cpu_to_le16(v))
86 #define sb_version(sbp)            (le16_to_cpu((sbp)->s_v1.s_version))
87 #define set_sb_version(sbp,v)      ((sbp)->s_v1.s_version = cpu_to_le16(v))
88 
89 #define sb_reserved_for_journal(sbp) \
90               (le16_to_cpu((sbp)->s_v1.s_reserved_for_journal))
91 #define set_sb_reserved_for_journal(sbp,v) \
92               ((sbp)->s_v1.s_reserved_for_journal = cpu_to_le16(v))
93 
94 /* LOGGING -- */
95 
96 /* These all interelate for performance.
97 **
98 ** If the journal block count is smaller than n transactions, you lose speed.
99 ** I don't know what n is yet, I'm guessing 8-16.
100 **
101 ** typical transaction size depends on the application, how often fsync is
102 ** called, and how many metadata blocks you dirty in a 30 second period.
103 ** The more small files (<16k) you use, the larger your transactions will
104 ** be.
105 **
106 ** If your journal fills faster than dirty buffers get flushed to disk, it must flush them before allowing the journal
107 ** to wrap, which slows things down.  If you need high speed meta data updates, the journal should be big enough
108 ** to prevent wrapping before dirty meta blocks get to disk.
109 **
110 ** If the batch max is smaller than the transaction max, you'll waste space at the end of the journal
111 ** because journal_end sets the next transaction to start at 0 if the next transaction has any chance of wrapping.
112 **
113 ** The large the batch max age, the better the speed, and the more meta data changes you'll lose after a crash.
114 **
115 */
116 
117 /* don't mess with these for a while */
118 				/* we have a node size define somewhere in reiserfs_fs.h. -Hans */
119 #define JOURNAL_BLOCK_SIZE  4096 /* BUG gotta get rid of this */
120 #define JOURNAL_MAX_CNODE   1500 /* max cnodes to allocate. */
121 #define JOURNAL_HASH_SIZE 8192
122 #define JOURNAL_NUM_BITMAPS 5 /* number of copies of the bitmaps to have floating.  Must be >= 2 */
123 #define JOURNAL_LIST_COUNT 64
124 
125 /* these are bh_state bit flag offset numbers, for use in the buffer head */
126 
127 #define BH_JDirty       16      /* journal data needs to be written before buffer can be marked dirty */
128 #define BH_JDirty_wait 18	/* commit is done, buffer marked dirty */
129 #define BH_JNew 19		/* buffer allocated during this transaction, no need to write if freed during this trans too */
130 
131 /* ugly.  metadata blocks must be prepared before they can be logged.
132 ** prepared means unlocked and cleaned.  If the block is prepared, but not
133 ** logged for some reason, any bits cleared while preparing it must be
134 ** set again.
135 */
136 #define BH_JPrepared 20		/* block has been prepared for the log */
137 #define BH_JRestore_dirty 22    /* restore the dirty bit later */
138 
139 /* One of these for every block in every transaction
140 ** Each one is in two hash tables.  First, a hash of the current transaction, and after journal_end, a
141 ** hash of all the in memory transactions.
142 ** next and prev are used by the current transaction (journal_hash).
143 ** hnext and hprev are used by journal_list_hash.  If a block is in more than one transaction, the journal_list_hash
144 ** links it in multiple times.  This allows flush_journal_list to remove just the cnode belonging
145 ** to a given transaction.
146 */
147 struct reiserfs_journal_cnode {
148   struct buffer_head *bh ;		 /* real buffer head */
149   kdev_t dev ;				 /* dev of real buffer head */
150   unsigned long blocknr ;		 /* block number of real buffer head, == 0 when buffer on disk */
151   long state ;
152   struct reiserfs_journal_list *jlist ;  /* journal list this cnode lives in */
153   struct reiserfs_journal_cnode *next ;  /* next in transaction list */
154   struct reiserfs_journal_cnode *prev ;  /* prev in transaction list */
155   struct reiserfs_journal_cnode *hprev ; /* prev in hash list */
156   struct reiserfs_journal_cnode *hnext ; /* next in hash list */
157 };
158 
159 struct reiserfs_bitmap_node {
160   int id ;
161   char *data ;
162   struct list_head list ;
163 } ;
164 
165 struct reiserfs_list_bitmap {
166   struct reiserfs_journal_list *journal_list ;
167   struct reiserfs_bitmap_node **bitmaps ;
168 } ;
169 
170 /*
171 ** transaction handle which is passed around for all journal calls
172 */
173 struct reiserfs_transaction_handle {
174 				/* ifdef it. -Hans */
175   char *t_caller ;              /* debugging use */
176   int t_blocks_logged ;         /* number of blocks this writer has logged */
177   int t_blocks_allocated ;      /* number of blocks this writer allocated */
178   unsigned long t_trans_id ;    /* sanity check, equals the current trans id */
179   struct super_block *t_super ; /* super for this FS when journal_begin was
180                                    called. saves calls to reiserfs_get_super */
181   int displace_new_blocks:1;	/* if new block allocation occurres, that block
182 				   should be displaced from others */
183 } ;
184 
185 /*
186 ** one of these for each transaction.  The most important part here is the j_realblock.
187 ** this list of cnodes is used to hash all the blocks in all the commits, to mark all the
188 ** real buffer heads dirty once all the commits hit the disk,
189 ** and to make sure every real block in a transaction is on disk before allowing the log area
190 ** to be overwritten */
191 struct reiserfs_journal_list {
192   unsigned long j_start ;
193   unsigned long j_len ;
194   atomic_t j_nonzerolen ;
195   atomic_t j_commit_left ;
196   atomic_t j_flushing ;
197   atomic_t j_commit_flushing ;
198   atomic_t j_older_commits_done ;      /* all commits older than this on disk*/
199   unsigned long j_trans_id ;
200   time_t j_timestamp ;
201   struct reiserfs_list_bitmap *j_list_bitmap ;
202   struct buffer_head *j_commit_bh ; /* commit buffer head */
203   struct reiserfs_journal_cnode *j_realblock  ;
204   struct reiserfs_journal_cnode *j_freedlist ; /* list of buffers that were freed during this trans.  free each of these on flush */
205   wait_queue_head_t j_commit_wait ; /* wait for all the commit blocks to be flushed */
206   wait_queue_head_t j_flush_wait ; /* wait for all the real blocks to be flushed */
207 } ;
208 
209 struct reiserfs_page_list  ; /* defined in reiserfs_fs.h */
210 
211 struct reiserfs_journal {
212   struct buffer_head ** j_ap_blocks ; /* journal blocks on disk */
213   struct reiserfs_journal_cnode *j_last ; /* newest journal block */
214   struct reiserfs_journal_cnode *j_first ; /*  oldest journal block.  start here for traverse */
215 
216   kdev_t               j_dev;
217   struct file         *j_dev_file;
218   struct block_device *j_dev_bd;
219 	int j_1st_reserved_block;     /* first block of journal or reserved area on */
220 				      /* _MAIN_ device, it is calculated by macro during mount */
221   long j_state ;
222   unsigned long j_trans_id ;
223   unsigned long j_mount_id ;
224   unsigned long j_start ;             /* start of current waiting commit (index into j_ap_blocks) */
225   unsigned long j_len ;               /* lenght of current waiting commit */
226   unsigned long j_len_alloc ;         /* number of buffers requested by journal_begin() */
227   atomic_t j_wcount ;            /* count of writers for current commit */
228   unsigned long j_bcount ;            /* batch count. allows turning X transactions into 1 */
229   unsigned long j_first_unflushed_offset ;  /* first unflushed transactions offset */
230   unsigned long j_last_flush_trans_id ;    /* last fully flushed journal timestamp */
231   struct buffer_head *j_header_bh ;
232 
233   /* j_flush_pages must be flushed before the current transaction can
234   ** commit
235   */
236   struct reiserfs_page_list *j_flush_pages ;
237   time_t j_trans_start_time ;         /* time this transaction started */
238   wait_queue_head_t j_wait ;         /* wait  journal_end to finish I/O */
239   atomic_t j_wlock ;                       /* lock for j_wait */
240   wait_queue_head_t j_join_wait ;    /* wait for current transaction to finish before starting new one */
241   atomic_t j_jlock ;                       /* lock for j_join_wait */
242   int j_journal_list_index ;	      /* journal list number of the current trans */
243   int j_list_bitmap_index ;	      /* number of next list bitmap to use */
244   int j_must_wait ;		       /* no more journal begins allowed. MUST sleep on j_join_wait */
245   int j_next_full_flush ;             /* next journal_end will flush all journal list */
246   int j_next_async_flush ;             /* next journal_end will flush all async commits */
247 
248   int j_cnode_used ;	      /* number of cnodes on the used list */
249   int j_cnode_free ;          /* number of cnodes on the free list */
250 
251   unsigned int s_journal_trans_max ;           /* max number of blocks in a transaction.  */
252   unsigned int s_journal_max_batch ;           /* max number of blocks to batch into a trans */
253   unsigned int s_journal_max_commit_age ;      /* in seconds, how old can an async commit be */
254   unsigned int s_journal_max_trans_age ;       /* in seconds, how old can a transaction be */
255 
256   struct reiserfs_journal_cnode *j_cnode_free_list ;
257   struct reiserfs_journal_cnode *j_cnode_free_orig ; /* orig pointer returned from vmalloc */
258 
259   int j_free_bitmap_nodes ;
260   int j_used_bitmap_nodes ;
261   struct list_head j_bitmap_nodes ;
262   struct list_head j_dirty_buffers ;
263   struct reiserfs_list_bitmap j_list_bitmap[JOURNAL_NUM_BITMAPS] ;	/* array of bitmaps to record the deleted blocks */
264   struct reiserfs_journal_list j_journal_list[JOURNAL_LIST_COUNT] ;	    /* array of all the journal lists */
265   struct reiserfs_journal_cnode *j_hash_table[JOURNAL_HASH_SIZE] ; 	    /* hash table for real buffer heads in current trans */
266   struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE] ; /* hash table for all the real buffer heads in all
267   										the transactions */
268   struct list_head j_prealloc_list;     /* list of inodes which have preallocated blocks */
269 };
270 
271 #define JOURNAL_DESC_MAGIC "ReIsErLB" /* ick.  magic string to find desc blocks in the journal */
272 
273 
274 typedef __u32 (*hashf_t) (const signed char *, int);
275 
276 struct reiserfs_bitmap_info
277 {
278     // FIXME: Won't work with block sizes > 8K
279     __u16  first_zero_hint;
280     __u16  free_count;
281     struct buffer_head *bh; /* the actual bitmap */
282 };
283 
284 struct proc_dir_entry;
285 
286 #if defined( CONFIG_PROC_FS ) && defined( CONFIG_REISERFS_PROC_INFO )
287 typedef unsigned long int stat_cnt_t;
288 typedef struct reiserfs_proc_info_data
289 {
290   spinlock_t lock;
291   int exiting;
292   int max_hash_collisions;
293 
294   stat_cnt_t breads;
295   stat_cnt_t bread_miss;
296   stat_cnt_t search_by_key;
297   stat_cnt_t search_by_key_fs_changed;
298   stat_cnt_t search_by_key_restarted;
299 
300   stat_cnt_t insert_item_restarted;
301   stat_cnt_t paste_into_item_restarted;
302   stat_cnt_t cut_from_item_restarted;
303   stat_cnt_t delete_solid_item_restarted;
304   stat_cnt_t delete_item_restarted;
305 
306   stat_cnt_t leaked_oid;
307   stat_cnt_t leaves_removable;
308 
309   /* balances per level. Use explicit 5 as MAX_HEIGHT is not visible yet. */
310   stat_cnt_t balance_at[ 5 ]; /* XXX */
311   /* sbk == search_by_key */
312   stat_cnt_t sbk_read_at[ 5 ]; /* XXX */
313   stat_cnt_t sbk_fs_changed[ 5 ];
314   stat_cnt_t sbk_restarted[ 5 ];
315   stat_cnt_t items_at[ 5 ]; /* XXX */
316   stat_cnt_t free_at[ 5 ]; /* XXX */
317   stat_cnt_t can_node_be_removed[ 5 ]; /* XXX */
318   long int lnum[ 5 ]; /* XXX */
319   long int rnum[ 5 ]; /* XXX */
320   long int lbytes[ 5 ]; /* XXX */
321   long int rbytes[ 5 ]; /* XXX */
322   stat_cnt_t get_neighbors[ 5 ];
323   stat_cnt_t get_neighbors_restart[ 5 ];
324   stat_cnt_t need_l_neighbor[ 5 ];
325   stat_cnt_t need_r_neighbor[ 5 ];
326 
327   stat_cnt_t free_block;
328   struct __scan_bitmap_stats {
329 	stat_cnt_t call;
330 	stat_cnt_t wait;
331 	stat_cnt_t bmap;
332 	stat_cnt_t retry;
333 	stat_cnt_t in_journal_hint;
334 	stat_cnt_t in_journal_nohint;
335 	stat_cnt_t stolen;
336   } scan_bitmap;
337   struct __journal_stats {
338 	stat_cnt_t in_journal;
339 	stat_cnt_t in_journal_bitmap;
340 	stat_cnt_t in_journal_reusable;
341 	stat_cnt_t lock_journal;
342 	stat_cnt_t lock_journal_wait;
343 	stat_cnt_t journal_being;
344 	stat_cnt_t journal_relock_writers;
345 	stat_cnt_t journal_relock_wcount;
346 	stat_cnt_t mark_dirty;
347 	stat_cnt_t mark_dirty_already;
348 	stat_cnt_t mark_dirty_notjournal;
349 	stat_cnt_t restore_prepared;
350 	stat_cnt_t prepare;
351 	stat_cnt_t prepare_retry;
352   } journal;
353 } reiserfs_proc_info_data_t;
354 #else
355 typedef struct reiserfs_proc_info_data
356 {} reiserfs_proc_info_data_t;
357 #endif
358 
359 /* reiserfs union of in-core super block data */
360 struct reiserfs_sb_info
361 {
362     struct buffer_head * s_sbh;                   /* Buffer containing the super block */
363 				/* both the comment and the choice of
364                                    name are unclear for s_rs -Hans */
365     struct reiserfs_super_block * s_rs;           /* Pointer to the super block in the buffer */
366     struct reiserfs_bitmap_info * s_ap_bitmap;
367     struct reiserfs_journal *s_journal ;		/* pointer to journal information */
368     unsigned short s_mount_state;                 /* reiserfs state (valid, invalid) */
369 
370 				/* Comment? -Hans */
371     void (*end_io_handler)(struct buffer_head *, int);
372     hashf_t s_hash_function;	/* pointer to function which is used
373                                    to sort names in directory. Set on
374                                    mount */
375     unsigned long s_mount_opt;	/* reiserfs's mount options are set
376                                    here (currently - NOTAIL, NOLOG,
377                                    REPLAYONLY) */
378 
379     struct {			/* This is a structure that describes block allocator options */
380 	unsigned long bits;	/* Bitfield for enable/disable kind of options */
381 	unsigned long large_file_size; /* size started from which we consider file to be a large one(in blocks) */
382 	int border;		/* percentage of disk, border takes */
383 	int preallocmin;	/* Minimal file size (in blocks) starting from which we do preallocations */
384 	int preallocsize;	/* Number of blocks we try to prealloc when file
385 				   reaches preallocmin size (in blocks) or
386 				   prealloc_list is empty. */
387     } s_alloc_options;
388 
389 				/* Comment? -Hans */
390     wait_queue_head_t s_wait;
391 				/* To be obsoleted soon by per buffer seals.. -Hans */
392     atomic_t s_generation_counter; // increased by one every time the
393     // tree gets re-balanced
394     unsigned long s_properties;    /* File system properties. Currently holds
395 				     on-disk FS format */
396 
397     /* session statistics */
398     int s_kmallocs;
399     int s_disk_reads;
400     int s_disk_writes;
401     int s_fix_nodes;
402     int s_do_balance;
403     int s_unneeded_left_neighbor;
404     int s_good_search_by_key_reada;
405     int s_bmaps;
406     int s_bmaps_without_search;
407     int s_direct2indirect;
408     int s_indirect2direct;
409 	/* set up when it's ok for reiserfs_read_inode2() to read from
410 	   disk inode with nlink==0. Currently this is only used during
411 	   finish_unfinished() processing at mount time */
412     int s_is_unlinked_ok;
413     reiserfs_proc_info_data_t s_proc_info_data;
414     struct proc_dir_entry *procdir;
415     int reserved_blocks; /* amount of blocks reserved for further allocations */
416 };
417 
418 /* Definitions of reiserfs on-disk properties: */
419 #define REISERFS_3_5 0
420 #define REISERFS_3_6 1
421 
422 /* Mount options */
423 #define REISERFS_LARGETAIL 0  /* large tails will be created in a session */
424 #define REISERFS_SMALLTAIL 17  /* small (for files less than block size) tails will be created in a session */
425 #define REPLAYONLY 3 /* replay journal and return 0. Use by fsck */
426 #define REISERFS_NOLOG 4      /* -o nolog: turn journalling off */
427 #define REISERFS_CONVERT 5    /* -o conv: causes conversion of old
428                                  format super block to the new
429                                  format. If not specified - old
430                                  partition will be dealt with in a
431                                  manner of 3.5.x */
432 
433 /* -o hash={tea, rupasov, r5, detect} is meant for properly mounting
434 ** reiserfs disks from 3.5.19 or earlier.  99% of the time, this option
435 ** is not required.  If the normal autodection code can't determine which
436 ** hash to use (because both hases had the same value for a file)
437 ** use this option to force a specific hash.  It won't allow you to override
438 ** the existing hash on the FS, so if you have a tea hash disk, and mount
439 ** with -o hash=rupasov, the mount will fail.
440 */
441 #define FORCE_TEA_HASH 6      /* try to force tea hash on mount */
442 #define FORCE_RUPASOV_HASH 7  /* try to force rupasov hash on mount */
443 #define FORCE_R5_HASH 8       /* try to force rupasov hash on mount */
444 #define FORCE_HASH_DETECT 9   /* try to detect hash function on mount */
445 
446 
447 /* used for testing experimental features, makes benchmarking new
448    features with and without more convenient, should never be used by
449    users in any code shipped to users (ideally) */
450 
451 #define REISERFS_NO_BORDER 11
452 #define REISERFS_NO_UNHASHED_RELOCATION 12
453 #define REISERFS_HASHED_RELOCATION 13
454 #define REISERFS_TEST4 14
455 
456 #define REISERFS_TEST1 11
457 #define REISERFS_TEST2 12
458 #define REISERFS_TEST3 13
459 #define REISERFS_TEST4 14
460 
461 #define REISERFS_ATTRS (15)
462 
463 #define reiserfs_r5_hash(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << FORCE_R5_HASH))
464 #define reiserfs_rupasov_hash(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << FORCE_RUPASOV_HASH))
465 #define reiserfs_tea_hash(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << FORCE_TEA_HASH))
466 #define reiserfs_hash_detect(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << FORCE_HASH_DETECT))
467 #define reiserfs_no_border(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_NO_BORDER))
468 #define reiserfs_no_unhashed_relocation(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_NO_UNHASHED_RELOCATION))
469 #define reiserfs_hashed_relocation(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_HASHED_RELOCATION))
470 #define reiserfs_test4(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_TEST4))
471 
472 #define have_large_tails(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_LARGETAIL))
473 #define have_small_tails(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_SMALLTAIL))
474 #define replay_only(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REPLAYONLY))
475 #define reiserfs_dont_log(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_NOLOG))
476 #define reiserfs_attrs(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_ATTRS))
477 #define old_format_only(s) ((s)->u.reiserfs_sb.s_properties & (1 << REISERFS_3_5))
478 #define convert_reiserfs(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_CONVERT))
479 
480 
481 void reiserfs_file_buffer (struct buffer_head * bh, int list);
482 int reiserfs_is_super(struct super_block *s)  ;
483 int journal_mark_dirty(struct reiserfs_transaction_handle *, struct super_block *, struct buffer_head *bh) ;
484 int flush_old_commits(struct super_block *s, int) ;
485 int show_reiserfs_locks(void) ;
486 int reiserfs_resize(struct super_block *, unsigned long) ;
487 
488 #define CARRY_ON                0
489 #define SCHEDULE_OCCURRED       1
490 
491 
492 #define SB_BUFFER_WITH_SB(s) ((s)->u.reiserfs_sb.s_sbh)
493 #define SB_JOURNAL(s) ((s)->u.reiserfs_sb.s_journal)
494 #define SB_JOURNAL_1st_RESERVED_BLOCK(s) (SB_JOURNAL(s)->j_1st_reserved_block)
495 #define SB_JOURNAL_LIST(s) (SB_JOURNAL(s)->j_journal_list)
496 #define SB_JOURNAL_LIST_INDEX(s) (SB_JOURNAL(s)->j_journal_list_index)
497 #define SB_JOURNAL_LEN_FREE(s) (SB_JOURNAL(s)->j_journal_len_free)
498 #define SB_AP_BITMAP(s) ((s)->u.reiserfs_sb.s_ap_bitmap)
499 
500 #define SB_DISK_JOURNAL_HEAD(s) (SB_JOURNAL(s)->j_header_bh->)
501 
502 #define SB_JOURNAL_TRANS_MAX(s)      (SB_JOURNAL(s)->s_journal_trans_max)
503 #define SB_JOURNAL_MAX_BATCH(s)      (SB_JOURNAL(s)->s_journal_max_batch)
504 #define SB_JOURNAL_MAX_COMMIT_AGE(s) (SB_JOURNAL(s)->s_journal_max_commit_age)
505 #define SB_JOURNAL_MAX_TRANS_AGE(s)  (SB_JOURNAL(s)->s_journal_max_trans_age)
506 #define SB_JOURNAL_DEV(s)            (SB_JOURNAL(s)->j_dev)
507 
508 
509 #endif	/* _LINUX_REISER_FS_SB */
510