xref: /openbmc/linux/fs/reiserfs/reiserfs.h (revision 4cf5f7ad)
1f466c6fdSAl Viro /*
2f466c6fdSAl Viro  * Copyright 1996, 1997, 1998 Hans Reiser, see reiserfs/README for licensing and copyright details
3f466c6fdSAl Viro  */
4f466c6fdSAl Viro 
5f466c6fdSAl Viro #include <linux/reiserfs_fs.h>
6f466c6fdSAl Viro 
7f466c6fdSAl Viro #include <linux/slab.h>
8f466c6fdSAl Viro #include <linux/interrupt.h>
9f466c6fdSAl Viro #include <linux/sched.h>
10ed2d265dSLinus Torvalds #include <linux/bug.h>
11f466c6fdSAl Viro #include <linux/workqueue.h>
12f466c6fdSAl Viro #include <asm/unaligned.h>
13f466c6fdSAl Viro #include <linux/bitops.h>
14f466c6fdSAl Viro #include <linux/proc_fs.h>
15f466c6fdSAl Viro #include <linux/buffer_head.h>
16f466c6fdSAl Viro 
17f466c6fdSAl Viro /* the 32 bit compat definitions with int argument */
18f466c6fdSAl Viro #define REISERFS_IOC32_UNPACK		_IOW(0xCD, 1, int)
19f466c6fdSAl Viro #define REISERFS_IOC32_GETFLAGS		FS_IOC32_GETFLAGS
20f466c6fdSAl Viro #define REISERFS_IOC32_SETFLAGS		FS_IOC32_SETFLAGS
21f466c6fdSAl Viro #define REISERFS_IOC32_GETVERSION	FS_IOC32_GETVERSION
22f466c6fdSAl Viro #define REISERFS_IOC32_SETVERSION	FS_IOC32_SETVERSION
23f466c6fdSAl Viro 
24765fd6b2SAl Viro struct reiserfs_journal_list;
25765fd6b2SAl Viro 
26765fd6b2SAl Viro /** bitmasks for i_flags field in reiserfs-specific part of inode */
27765fd6b2SAl Viro typedef enum {
28765fd6b2SAl Viro     /** this says what format of key do all items (but stat data) of
29765fd6b2SAl Viro       an object have.  If this is set, that format is 3.6 otherwise
30765fd6b2SAl Viro       - 3.5 */
31765fd6b2SAl Viro 	i_item_key_version_mask = 0x0001,
32765fd6b2SAl Viro     /** If this is unset, object has 3.5 stat data, otherwise, it has
33765fd6b2SAl Viro       3.6 stat data with 64bit size, 32bit nlink etc. */
34765fd6b2SAl Viro 	i_stat_data_version_mask = 0x0002,
35765fd6b2SAl Viro     /** file might need tail packing on close */
36765fd6b2SAl Viro 	i_pack_on_close_mask = 0x0004,
37765fd6b2SAl Viro     /** don't pack tail of file */
38765fd6b2SAl Viro 	i_nopack_mask = 0x0008,
39765fd6b2SAl Viro     /** If those is set, "safe link" was created for this file during
40765fd6b2SAl Viro       truncate or unlink. Safe link is used to avoid leakage of disk
41765fd6b2SAl Viro       space on crash with some files open, but unlinked. */
42765fd6b2SAl Viro 	i_link_saved_unlink_mask = 0x0010,
43765fd6b2SAl Viro 	i_link_saved_truncate_mask = 0x0020,
44765fd6b2SAl Viro 	i_has_xattr_dir = 0x0040,
45765fd6b2SAl Viro 	i_data_log = 0x0080,
46765fd6b2SAl Viro } reiserfs_inode_flags;
47765fd6b2SAl Viro 
48765fd6b2SAl Viro struct reiserfs_inode_info {
49765fd6b2SAl Viro 	__u32 i_key[4];		/* key is still 4 32 bit integers */
50765fd6b2SAl Viro     /** transient inode flags that are never stored on disk. Bitmasks
51765fd6b2SAl Viro       for this field are defined above. */
52765fd6b2SAl Viro 	__u32 i_flags;
53765fd6b2SAl Viro 
54765fd6b2SAl Viro 	__u32 i_first_direct_byte;	// offset of first byte stored in direct item.
55765fd6b2SAl Viro 
56765fd6b2SAl Viro 	/* copy of persistent inode flags read from sd_attrs. */
57765fd6b2SAl Viro 	__u32 i_attrs;
58765fd6b2SAl Viro 
59765fd6b2SAl Viro 	int i_prealloc_block;	/* first unused block of a sequence of unused blocks */
60765fd6b2SAl Viro 	int i_prealloc_count;	/* length of that sequence */
61765fd6b2SAl Viro 	struct list_head i_prealloc_list;	/* per-transaction list of inodes which
62765fd6b2SAl Viro 						 * have preallocated blocks */
63765fd6b2SAl Viro 
64765fd6b2SAl Viro 	unsigned new_packing_locality:1;	/* new_packig_locality is created; new blocks
65765fd6b2SAl Viro 						 * for the contents of this directory should be
66765fd6b2SAl Viro 						 * displaced */
67765fd6b2SAl Viro 
68765fd6b2SAl Viro 	/* we use these for fsync or O_SYNC to decide which transaction
69765fd6b2SAl Viro 	 ** needs to be committed in order for this inode to be properly
70765fd6b2SAl Viro 	 ** flushed */
71765fd6b2SAl Viro 	unsigned int i_trans_id;
72765fd6b2SAl Viro 	struct reiserfs_journal_list *i_jl;
73765fd6b2SAl Viro 	atomic_t openers;
74765fd6b2SAl Viro 	struct mutex tailpack;
75765fd6b2SAl Viro #ifdef CONFIG_REISERFS_FS_XATTR
76765fd6b2SAl Viro 	struct rw_semaphore i_xattr_sem;
77765fd6b2SAl Viro #endif
78765fd6b2SAl Viro 	struct inode vfs_inode;
79765fd6b2SAl Viro };
80765fd6b2SAl Viro 
81765fd6b2SAl Viro typedef enum {
82765fd6b2SAl Viro 	reiserfs_attrs_cleared = 0x00000001,
83765fd6b2SAl Viro } reiserfs_super_block_flags;
84765fd6b2SAl Viro 
85765fd6b2SAl Viro /* struct reiserfs_super_block accessors/mutators
86765fd6b2SAl Viro  * since this is a disk structure, it will always be in
87765fd6b2SAl Viro  * little endian format. */
88765fd6b2SAl Viro #define sb_block_count(sbp)         (le32_to_cpu((sbp)->s_v1.s_block_count))
89765fd6b2SAl Viro #define set_sb_block_count(sbp,v)   ((sbp)->s_v1.s_block_count = cpu_to_le32(v))
90765fd6b2SAl Viro #define sb_free_blocks(sbp)         (le32_to_cpu((sbp)->s_v1.s_free_blocks))
91765fd6b2SAl Viro #define set_sb_free_blocks(sbp,v)   ((sbp)->s_v1.s_free_blocks = cpu_to_le32(v))
92765fd6b2SAl Viro #define sb_root_block(sbp)          (le32_to_cpu((sbp)->s_v1.s_root_block))
93765fd6b2SAl Viro #define set_sb_root_block(sbp,v)    ((sbp)->s_v1.s_root_block = cpu_to_le32(v))
94765fd6b2SAl Viro 
95765fd6b2SAl Viro #define sb_jp_journal_1st_block(sbp)  \
96765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_1st_block))
97765fd6b2SAl Viro #define set_sb_jp_journal_1st_block(sbp,v) \
98765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_1st_block = cpu_to_le32(v))
99765fd6b2SAl Viro #define sb_jp_journal_dev(sbp) \
100765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_dev))
101765fd6b2SAl Viro #define set_sb_jp_journal_dev(sbp,v) \
102765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_dev = cpu_to_le32(v))
103765fd6b2SAl Viro #define sb_jp_journal_size(sbp) \
104765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_size))
105765fd6b2SAl Viro #define set_sb_jp_journal_size(sbp,v) \
106765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_size = cpu_to_le32(v))
107765fd6b2SAl Viro #define sb_jp_journal_trans_max(sbp) \
108765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_trans_max))
109765fd6b2SAl Viro #define set_sb_jp_journal_trans_max(sbp,v) \
110765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_trans_max = cpu_to_le32(v))
111765fd6b2SAl Viro #define sb_jp_journal_magic(sbp) \
112765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_magic))
113765fd6b2SAl Viro #define set_sb_jp_journal_magic(sbp,v) \
114765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_magic = cpu_to_le32(v))
115765fd6b2SAl Viro #define sb_jp_journal_max_batch(sbp) \
116765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_max_batch))
117765fd6b2SAl Viro #define set_sb_jp_journal_max_batch(sbp,v) \
118765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_max_batch = cpu_to_le32(v))
119765fd6b2SAl Viro #define sb_jp_jourmal_max_commit_age(sbp) \
120765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_journal.jp_journal_max_commit_age))
121765fd6b2SAl Viro #define set_sb_jp_journal_max_commit_age(sbp,v) \
122765fd6b2SAl Viro               ((sbp)->s_v1.s_journal.jp_journal_max_commit_age = cpu_to_le32(v))
123765fd6b2SAl Viro 
124765fd6b2SAl Viro #define sb_blocksize(sbp)          (le16_to_cpu((sbp)->s_v1.s_blocksize))
125765fd6b2SAl Viro #define set_sb_blocksize(sbp,v)    ((sbp)->s_v1.s_blocksize = cpu_to_le16(v))
126765fd6b2SAl Viro #define sb_oid_maxsize(sbp)        (le16_to_cpu((sbp)->s_v1.s_oid_maxsize))
127765fd6b2SAl Viro #define set_sb_oid_maxsize(sbp,v)  ((sbp)->s_v1.s_oid_maxsize = cpu_to_le16(v))
128765fd6b2SAl Viro #define sb_oid_cursize(sbp)        (le16_to_cpu((sbp)->s_v1.s_oid_cursize))
129765fd6b2SAl Viro #define set_sb_oid_cursize(sbp,v)  ((sbp)->s_v1.s_oid_cursize = cpu_to_le16(v))
130765fd6b2SAl Viro #define sb_umount_state(sbp)       (le16_to_cpu((sbp)->s_v1.s_umount_state))
131765fd6b2SAl Viro #define set_sb_umount_state(sbp,v) ((sbp)->s_v1.s_umount_state = cpu_to_le16(v))
132765fd6b2SAl Viro #define sb_fs_state(sbp)           (le16_to_cpu((sbp)->s_v1.s_fs_state))
133765fd6b2SAl Viro #define set_sb_fs_state(sbp,v)     ((sbp)->s_v1.s_fs_state = cpu_to_le16(v))
134765fd6b2SAl Viro #define sb_hash_function_code(sbp) \
135765fd6b2SAl Viro               (le32_to_cpu((sbp)->s_v1.s_hash_function_code))
136765fd6b2SAl Viro #define set_sb_hash_function_code(sbp,v) \
137765fd6b2SAl Viro               ((sbp)->s_v1.s_hash_function_code = cpu_to_le32(v))
138765fd6b2SAl Viro #define sb_tree_height(sbp)        (le16_to_cpu((sbp)->s_v1.s_tree_height))
139765fd6b2SAl Viro #define set_sb_tree_height(sbp,v)  ((sbp)->s_v1.s_tree_height = cpu_to_le16(v))
140765fd6b2SAl Viro #define sb_bmap_nr(sbp)            (le16_to_cpu((sbp)->s_v1.s_bmap_nr))
141765fd6b2SAl Viro #define set_sb_bmap_nr(sbp,v)      ((sbp)->s_v1.s_bmap_nr = cpu_to_le16(v))
142765fd6b2SAl Viro #define sb_version(sbp)            (le16_to_cpu((sbp)->s_v1.s_version))
143765fd6b2SAl Viro #define set_sb_version(sbp,v)      ((sbp)->s_v1.s_version = cpu_to_le16(v))
144765fd6b2SAl Viro 
145765fd6b2SAl Viro #define sb_mnt_count(sbp)	   (le16_to_cpu((sbp)->s_mnt_count))
146765fd6b2SAl Viro #define set_sb_mnt_count(sbp, v)   ((sbp)->s_mnt_count = cpu_to_le16(v))
147765fd6b2SAl Viro 
148765fd6b2SAl Viro #define sb_reserved_for_journal(sbp) \
149765fd6b2SAl Viro               (le16_to_cpu((sbp)->s_v1.s_reserved_for_journal))
150765fd6b2SAl Viro #define set_sb_reserved_for_journal(sbp,v) \
151765fd6b2SAl Viro               ((sbp)->s_v1.s_reserved_for_journal = cpu_to_le16(v))
152765fd6b2SAl Viro 
153765fd6b2SAl Viro /* LOGGING -- */
154765fd6b2SAl Viro 
155765fd6b2SAl Viro /* These all interelate for performance.
156765fd6b2SAl Viro **
157765fd6b2SAl Viro ** If the journal block count is smaller than n transactions, you lose speed.
158765fd6b2SAl Viro ** I don't know what n is yet, I'm guessing 8-16.
159765fd6b2SAl Viro **
160765fd6b2SAl Viro ** typical transaction size depends on the application, how often fsync is
161765fd6b2SAl Viro ** called, and how many metadata blocks you dirty in a 30 second period.
162765fd6b2SAl Viro ** The more small files (<16k) you use, the larger your transactions will
163765fd6b2SAl Viro ** be.
164765fd6b2SAl Viro **
165765fd6b2SAl Viro ** If your journal fills faster than dirty buffers get flushed to disk, it must flush them before allowing the journal
166765fd6b2SAl Viro ** to wrap, which slows things down.  If you need high speed meta data updates, the journal should be big enough
167765fd6b2SAl Viro ** to prevent wrapping before dirty meta blocks get to disk.
168765fd6b2SAl Viro **
169765fd6b2SAl Viro ** If the batch max is smaller than the transaction max, you'll waste space at the end of the journal
170765fd6b2SAl Viro ** because journal_end sets the next transaction to start at 0 if the next transaction has any chance of wrapping.
171765fd6b2SAl Viro **
172765fd6b2SAl Viro ** The large the batch max age, the better the speed, and the more meta data changes you'll lose after a crash.
173765fd6b2SAl Viro **
174765fd6b2SAl Viro */
175765fd6b2SAl Viro 
176765fd6b2SAl Viro /* don't mess with these for a while */
177765fd6b2SAl Viro 				/* we have a node size define somewhere in reiserfs_fs.h. -Hans */
178765fd6b2SAl Viro #define JOURNAL_BLOCK_SIZE  4096	/* BUG gotta get rid of this */
179765fd6b2SAl Viro #define JOURNAL_MAX_CNODE   1500	/* max cnodes to allocate. */
180765fd6b2SAl Viro #define JOURNAL_HASH_SIZE 8192
181765fd6b2SAl Viro #define JOURNAL_NUM_BITMAPS 5	/* number of copies of the bitmaps to have floating.  Must be >= 2 */
182765fd6b2SAl Viro 
183765fd6b2SAl Viro /* One of these for every block in every transaction
184765fd6b2SAl Viro ** Each one is in two hash tables.  First, a hash of the current transaction, and after journal_end, a
185765fd6b2SAl Viro ** hash of all the in memory transactions.
186765fd6b2SAl Viro ** next and prev are used by the current transaction (journal_hash).
187765fd6b2SAl Viro ** hnext and hprev are used by journal_list_hash.  If a block is in more than one transaction, the journal_list_hash
188765fd6b2SAl Viro ** links it in multiple times.  This allows flush_journal_list to remove just the cnode belonging
189765fd6b2SAl Viro ** to a given transaction.
190765fd6b2SAl Viro */
191765fd6b2SAl Viro struct reiserfs_journal_cnode {
192765fd6b2SAl Viro 	struct buffer_head *bh;	/* real buffer head */
193765fd6b2SAl Viro 	struct super_block *sb;	/* dev of real buffer head */
194765fd6b2SAl Viro 	__u32 blocknr;		/* block number of real buffer head, == 0 when buffer on disk */
195765fd6b2SAl Viro 	unsigned long state;
196765fd6b2SAl Viro 	struct reiserfs_journal_list *jlist;	/* journal list this cnode lives in */
197765fd6b2SAl Viro 	struct reiserfs_journal_cnode *next;	/* next in transaction list */
198765fd6b2SAl Viro 	struct reiserfs_journal_cnode *prev;	/* prev in transaction list */
199765fd6b2SAl Viro 	struct reiserfs_journal_cnode *hprev;	/* prev in hash list */
200765fd6b2SAl Viro 	struct reiserfs_journal_cnode *hnext;	/* next in hash list */
201765fd6b2SAl Viro };
202765fd6b2SAl Viro 
203765fd6b2SAl Viro struct reiserfs_bitmap_node {
204765fd6b2SAl Viro 	int id;
205765fd6b2SAl Viro 	char *data;
206765fd6b2SAl Viro 	struct list_head list;
207765fd6b2SAl Viro };
208765fd6b2SAl Viro 
209765fd6b2SAl Viro struct reiserfs_list_bitmap {
210765fd6b2SAl Viro 	struct reiserfs_journal_list *journal_list;
211765fd6b2SAl Viro 	struct reiserfs_bitmap_node **bitmaps;
212765fd6b2SAl Viro };
213765fd6b2SAl Viro 
214765fd6b2SAl Viro /*
215765fd6b2SAl Viro ** one of these for each transaction.  The most important part here is the j_realblock.
216765fd6b2SAl Viro ** this list of cnodes is used to hash all the blocks in all the commits, to mark all the
217765fd6b2SAl Viro ** real buffer heads dirty once all the commits hit the disk,
218765fd6b2SAl Viro ** and to make sure every real block in a transaction is on disk before allowing the log area
219765fd6b2SAl Viro ** to be overwritten */
220765fd6b2SAl Viro struct reiserfs_journal_list {
221765fd6b2SAl Viro 	unsigned long j_start;
222765fd6b2SAl Viro 	unsigned long j_state;
223765fd6b2SAl Viro 	unsigned long j_len;
224765fd6b2SAl Viro 	atomic_t j_nonzerolen;
225765fd6b2SAl Viro 	atomic_t j_commit_left;
226765fd6b2SAl Viro 	atomic_t j_older_commits_done;	/* all commits older than this on disk */
227765fd6b2SAl Viro 	struct mutex j_commit_mutex;
228765fd6b2SAl Viro 	unsigned int j_trans_id;
229765fd6b2SAl Viro 	time_t j_timestamp;
230765fd6b2SAl Viro 	struct reiserfs_list_bitmap *j_list_bitmap;
231765fd6b2SAl Viro 	struct buffer_head *j_commit_bh;	/* commit buffer head */
232765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_realblock;
233765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_freedlist;	/* list of buffers that were freed during this trans.  free each of these on flush */
234765fd6b2SAl Viro 	/* time ordered list of all active transactions */
235765fd6b2SAl Viro 	struct list_head j_list;
236765fd6b2SAl Viro 
237765fd6b2SAl Viro 	/* time ordered list of all transactions we haven't tried to flush yet */
238765fd6b2SAl Viro 	struct list_head j_working_list;
239765fd6b2SAl Viro 
240765fd6b2SAl Viro 	/* list of tail conversion targets in need of flush before commit */
241765fd6b2SAl Viro 	struct list_head j_tail_bh_list;
242765fd6b2SAl Viro 	/* list of data=ordered buffers in need of flush before commit */
243765fd6b2SAl Viro 	struct list_head j_bh_list;
244765fd6b2SAl Viro 	int j_refcount;
245765fd6b2SAl Viro };
246765fd6b2SAl Viro 
247765fd6b2SAl Viro struct reiserfs_journal {
248765fd6b2SAl Viro 	struct buffer_head **j_ap_blocks;	/* journal blocks on disk */
249765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_last;	/* newest journal block */
250765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_first;	/*  oldest journal block.  start here for traverse */
251765fd6b2SAl Viro 
252765fd6b2SAl Viro 	struct block_device *j_dev_bd;
253765fd6b2SAl Viro 	fmode_t j_dev_mode;
254765fd6b2SAl Viro 	int j_1st_reserved_block;	/* first block on s_dev of reserved area journal */
255765fd6b2SAl Viro 
256765fd6b2SAl Viro 	unsigned long j_state;
257765fd6b2SAl Viro 	unsigned int j_trans_id;
258765fd6b2SAl Viro 	unsigned long j_mount_id;
259765fd6b2SAl Viro 	unsigned long j_start;	/* start of current waiting commit (index into j_ap_blocks) */
260765fd6b2SAl Viro 	unsigned long j_len;	/* length of current waiting commit */
261765fd6b2SAl Viro 	unsigned long j_len_alloc;	/* number of buffers requested by journal_begin() */
262765fd6b2SAl Viro 	atomic_t j_wcount;	/* count of writers for current commit */
263765fd6b2SAl Viro 	unsigned long j_bcount;	/* batch count. allows turning X transactions into 1 */
264765fd6b2SAl Viro 	unsigned long j_first_unflushed_offset;	/* first unflushed transactions offset */
265765fd6b2SAl Viro 	unsigned j_last_flush_trans_id;	/* last fully flushed journal timestamp */
266765fd6b2SAl Viro 	struct buffer_head *j_header_bh;
267765fd6b2SAl Viro 
268765fd6b2SAl Viro 	time_t j_trans_start_time;	/* time this transaction started */
269765fd6b2SAl Viro 	struct mutex j_mutex;
270765fd6b2SAl Viro 	struct mutex j_flush_mutex;
271765fd6b2SAl Viro 	wait_queue_head_t j_join_wait;	/* wait for current transaction to finish before starting new one */
272765fd6b2SAl Viro 	atomic_t j_jlock;	/* lock for j_join_wait */
273765fd6b2SAl Viro 	int j_list_bitmap_index;	/* number of next list bitmap to use */
274765fd6b2SAl Viro 	int j_must_wait;	/* no more journal begins allowed. MUST sleep on j_join_wait */
275765fd6b2SAl Viro 	int j_next_full_flush;	/* next journal_end will flush all journal list */
276765fd6b2SAl Viro 	int j_next_async_flush;	/* next journal_end will flush all async commits */
277765fd6b2SAl Viro 
278765fd6b2SAl Viro 	int j_cnode_used;	/* number of cnodes on the used list */
279765fd6b2SAl Viro 	int j_cnode_free;	/* number of cnodes on the free list */
280765fd6b2SAl Viro 
281765fd6b2SAl Viro 	unsigned int j_trans_max;	/* max number of blocks in a transaction.  */
282765fd6b2SAl Viro 	unsigned int j_max_batch;	/* max number of blocks to batch into a trans */
283765fd6b2SAl Viro 	unsigned int j_max_commit_age;	/* in seconds, how old can an async commit be */
284765fd6b2SAl Viro 	unsigned int j_max_trans_age;	/* in seconds, how old can a transaction be */
285765fd6b2SAl Viro 	unsigned int j_default_max_commit_age;	/* the default for the max commit age */
286765fd6b2SAl Viro 
287765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_cnode_free_list;
288765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_cnode_free_orig;	/* orig pointer returned from vmalloc */
289765fd6b2SAl Viro 
290765fd6b2SAl Viro 	struct reiserfs_journal_list *j_current_jl;
291765fd6b2SAl Viro 	int j_free_bitmap_nodes;
292765fd6b2SAl Viro 	int j_used_bitmap_nodes;
293765fd6b2SAl Viro 
294765fd6b2SAl Viro 	int j_num_lists;	/* total number of active transactions */
295765fd6b2SAl Viro 	int j_num_work_lists;	/* number that need attention from kreiserfsd */
296765fd6b2SAl Viro 
297765fd6b2SAl Viro 	/* debugging to make sure things are flushed in order */
298765fd6b2SAl Viro 	unsigned int j_last_flush_id;
299765fd6b2SAl Viro 
300765fd6b2SAl Viro 	/* debugging to make sure things are committed in order */
301765fd6b2SAl Viro 	unsigned int j_last_commit_id;
302765fd6b2SAl Viro 
303765fd6b2SAl Viro 	struct list_head j_bitmap_nodes;
304765fd6b2SAl Viro 	struct list_head j_dirty_buffers;
305765fd6b2SAl Viro 	spinlock_t j_dirty_buffers_lock;	/* protects j_dirty_buffers */
306765fd6b2SAl Viro 
307765fd6b2SAl Viro 	/* list of all active transactions */
308765fd6b2SAl Viro 	struct list_head j_journal_list;
309765fd6b2SAl Viro 	/* lists that haven't been touched by writeback attempts */
310765fd6b2SAl Viro 	struct list_head j_working_list;
311765fd6b2SAl Viro 
312765fd6b2SAl Viro 	struct reiserfs_list_bitmap j_list_bitmap[JOURNAL_NUM_BITMAPS];	/* array of bitmaps to record the deleted blocks */
313765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_hash_table[JOURNAL_HASH_SIZE];	/* hash table for real buffer heads in current trans */
314765fd6b2SAl Viro 	struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE];	/* hash table for all the real buffer heads in all
315765fd6b2SAl Viro 										   the transactions */
316765fd6b2SAl Viro 	struct list_head j_prealloc_list;	/* list of inodes which have preallocated blocks */
317765fd6b2SAl Viro 	int j_persistent_trans;
318765fd6b2SAl Viro 	unsigned long j_max_trans_size;
319765fd6b2SAl Viro 	unsigned long j_max_batch_size;
320765fd6b2SAl Viro 
321765fd6b2SAl Viro 	int j_errno;
322765fd6b2SAl Viro 
323765fd6b2SAl Viro 	/* when flushing ordered buffers, throttle new ordered writers */
324765fd6b2SAl Viro 	struct delayed_work j_work;
325765fd6b2SAl Viro 	struct super_block *j_work_sb;
326765fd6b2SAl Viro 	atomic_t j_async_throttle;
327765fd6b2SAl Viro };
328765fd6b2SAl Viro 
329765fd6b2SAl Viro enum journal_state_bits {
330765fd6b2SAl Viro 	J_WRITERS_BLOCKED = 1,	/* set when new writers not allowed */
331765fd6b2SAl Viro 	J_WRITERS_QUEUED,	/* set when log is full due to too many writers */
332765fd6b2SAl Viro 	J_ABORTED,		/* set when log is aborted */
333765fd6b2SAl Viro };
334765fd6b2SAl Viro 
335765fd6b2SAl Viro #define JOURNAL_DESC_MAGIC "ReIsErLB"	/* ick.  magic string to find desc blocks in the journal */
336765fd6b2SAl Viro 
337765fd6b2SAl Viro typedef __u32(*hashf_t) (const signed char *, int);
338765fd6b2SAl Viro 
339765fd6b2SAl Viro struct reiserfs_bitmap_info {
340765fd6b2SAl Viro 	__u32 free_count;
341765fd6b2SAl Viro };
342765fd6b2SAl Viro 
343765fd6b2SAl Viro struct proc_dir_entry;
344765fd6b2SAl Viro 
345765fd6b2SAl Viro #if defined( CONFIG_PROC_FS ) && defined( CONFIG_REISERFS_PROC_INFO )
346765fd6b2SAl Viro typedef unsigned long int stat_cnt_t;
347765fd6b2SAl Viro typedef struct reiserfs_proc_info_data {
348765fd6b2SAl Viro 	spinlock_t lock;
349765fd6b2SAl Viro 	int exiting;
350765fd6b2SAl Viro 	int max_hash_collisions;
351765fd6b2SAl Viro 
352765fd6b2SAl Viro 	stat_cnt_t breads;
353765fd6b2SAl Viro 	stat_cnt_t bread_miss;
354765fd6b2SAl Viro 	stat_cnt_t search_by_key;
355765fd6b2SAl Viro 	stat_cnt_t search_by_key_fs_changed;
356765fd6b2SAl Viro 	stat_cnt_t search_by_key_restarted;
357765fd6b2SAl Viro 
358765fd6b2SAl Viro 	stat_cnt_t insert_item_restarted;
359765fd6b2SAl Viro 	stat_cnt_t paste_into_item_restarted;
360765fd6b2SAl Viro 	stat_cnt_t cut_from_item_restarted;
361765fd6b2SAl Viro 	stat_cnt_t delete_solid_item_restarted;
362765fd6b2SAl Viro 	stat_cnt_t delete_item_restarted;
363765fd6b2SAl Viro 
364765fd6b2SAl Viro 	stat_cnt_t leaked_oid;
365765fd6b2SAl Viro 	stat_cnt_t leaves_removable;
366765fd6b2SAl Viro 
367765fd6b2SAl Viro 	/* balances per level. Use explicit 5 as MAX_HEIGHT is not visible yet. */
368765fd6b2SAl Viro 	stat_cnt_t balance_at[5];	/* XXX */
369765fd6b2SAl Viro 	/* sbk == search_by_key */
370765fd6b2SAl Viro 	stat_cnt_t sbk_read_at[5];	/* XXX */
371765fd6b2SAl Viro 	stat_cnt_t sbk_fs_changed[5];
372765fd6b2SAl Viro 	stat_cnt_t sbk_restarted[5];
373765fd6b2SAl Viro 	stat_cnt_t items_at[5];	/* XXX */
374765fd6b2SAl Viro 	stat_cnt_t free_at[5];	/* XXX */
375765fd6b2SAl Viro 	stat_cnt_t can_node_be_removed[5];	/* XXX */
376765fd6b2SAl Viro 	long int lnum[5];	/* XXX */
377765fd6b2SAl Viro 	long int rnum[5];	/* XXX */
378765fd6b2SAl Viro 	long int lbytes[5];	/* XXX */
379765fd6b2SAl Viro 	long int rbytes[5];	/* XXX */
380765fd6b2SAl Viro 	stat_cnt_t get_neighbors[5];
381765fd6b2SAl Viro 	stat_cnt_t get_neighbors_restart[5];
382765fd6b2SAl Viro 	stat_cnt_t need_l_neighbor[5];
383765fd6b2SAl Viro 	stat_cnt_t need_r_neighbor[5];
384765fd6b2SAl Viro 
385765fd6b2SAl Viro 	stat_cnt_t free_block;
386765fd6b2SAl Viro 	struct __scan_bitmap_stats {
387765fd6b2SAl Viro 		stat_cnt_t call;
388765fd6b2SAl Viro 		stat_cnt_t wait;
389765fd6b2SAl Viro 		stat_cnt_t bmap;
390765fd6b2SAl Viro 		stat_cnt_t retry;
391765fd6b2SAl Viro 		stat_cnt_t in_journal_hint;
392765fd6b2SAl Viro 		stat_cnt_t in_journal_nohint;
393765fd6b2SAl Viro 		stat_cnt_t stolen;
394765fd6b2SAl Viro 	} scan_bitmap;
395765fd6b2SAl Viro 	struct __journal_stats {
396765fd6b2SAl Viro 		stat_cnt_t in_journal;
397765fd6b2SAl Viro 		stat_cnt_t in_journal_bitmap;
398765fd6b2SAl Viro 		stat_cnt_t in_journal_reusable;
399765fd6b2SAl Viro 		stat_cnt_t lock_journal;
400765fd6b2SAl Viro 		stat_cnt_t lock_journal_wait;
401765fd6b2SAl Viro 		stat_cnt_t journal_being;
402765fd6b2SAl Viro 		stat_cnt_t journal_relock_writers;
403765fd6b2SAl Viro 		stat_cnt_t journal_relock_wcount;
404765fd6b2SAl Viro 		stat_cnt_t mark_dirty;
405765fd6b2SAl Viro 		stat_cnt_t mark_dirty_already;
406765fd6b2SAl Viro 		stat_cnt_t mark_dirty_notjournal;
407765fd6b2SAl Viro 		stat_cnt_t restore_prepared;
408765fd6b2SAl Viro 		stat_cnt_t prepare;
409765fd6b2SAl Viro 		stat_cnt_t prepare_retry;
410765fd6b2SAl Viro 	} journal;
411765fd6b2SAl Viro } reiserfs_proc_info_data_t;
412765fd6b2SAl Viro #else
413765fd6b2SAl Viro typedef struct reiserfs_proc_info_data {
414765fd6b2SAl Viro } reiserfs_proc_info_data_t;
415765fd6b2SAl Viro #endif
416765fd6b2SAl Viro 
417765fd6b2SAl Viro /* reiserfs union of in-core super block data */
418765fd6b2SAl Viro struct reiserfs_sb_info {
419765fd6b2SAl Viro 	struct buffer_head *s_sbh;	/* Buffer containing the super block */
420765fd6b2SAl Viro 	/* both the comment and the choice of
421765fd6b2SAl Viro 	   name are unclear for s_rs -Hans */
422765fd6b2SAl Viro 	struct reiserfs_super_block *s_rs;	/* Pointer to the super block in the buffer */
423765fd6b2SAl Viro 	struct reiserfs_bitmap_info *s_ap_bitmap;
424765fd6b2SAl Viro 	struct reiserfs_journal *s_journal;	/* pointer to journal information */
425765fd6b2SAl Viro 	unsigned short s_mount_state;	/* reiserfs state (valid, invalid) */
426765fd6b2SAl Viro 
427765fd6b2SAl Viro 	/* Serialize writers access, replace the old bkl */
428765fd6b2SAl Viro 	struct mutex lock;
429765fd6b2SAl Viro 	/* Owner of the lock (can be recursive) */
430765fd6b2SAl Viro 	struct task_struct *lock_owner;
431765fd6b2SAl Viro 	/* Depth of the lock, start from -1 like the bkl */
432765fd6b2SAl Viro 	int lock_depth;
433765fd6b2SAl Viro 
434797d9016SJeff Mahoney 	struct workqueue_struct *commit_wq;
435797d9016SJeff Mahoney 
436765fd6b2SAl Viro 	/* Comment? -Hans */
437765fd6b2SAl Viro 	void (*end_io_handler) (struct buffer_head *, int);
438765fd6b2SAl Viro 	hashf_t s_hash_function;	/* pointer to function which is used
439765fd6b2SAl Viro 					   to sort names in directory. Set on
440765fd6b2SAl Viro 					   mount */
441765fd6b2SAl Viro 	unsigned long s_mount_opt;	/* reiserfs's mount options are set
442765fd6b2SAl Viro 					   here (currently - NOTAIL, NOLOG,
443765fd6b2SAl Viro 					   REPLAYONLY) */
444765fd6b2SAl Viro 
445765fd6b2SAl Viro 	struct {		/* This is a structure that describes block allocator options */
446765fd6b2SAl Viro 		unsigned long bits;	/* Bitfield for enable/disable kind of options */
447765fd6b2SAl Viro 		unsigned long large_file_size;	/* size started from which we consider file to be a large one(in blocks) */
448765fd6b2SAl Viro 		int border;	/* percentage of disk, border takes */
449765fd6b2SAl Viro 		int preallocmin;	/* Minimal file size (in blocks) starting from which we do preallocations */
450765fd6b2SAl Viro 		int preallocsize;	/* Number of blocks we try to prealloc when file
451765fd6b2SAl Viro 					   reaches preallocmin size (in blocks) or
452765fd6b2SAl Viro 					   prealloc_list is empty. */
453765fd6b2SAl Viro 	} s_alloc_options;
454765fd6b2SAl Viro 
455765fd6b2SAl Viro 	/* Comment? -Hans */
456765fd6b2SAl Viro 	wait_queue_head_t s_wait;
457765fd6b2SAl Viro 	/* To be obsoleted soon by per buffer seals.. -Hans */
458765fd6b2SAl Viro 	atomic_t s_generation_counter;	// increased by one every time the
459765fd6b2SAl Viro 	// tree gets re-balanced
460765fd6b2SAl Viro 	unsigned long s_properties;	/* File system properties. Currently holds
461765fd6b2SAl Viro 					   on-disk FS format */
462765fd6b2SAl Viro 
463765fd6b2SAl Viro 	/* session statistics */
464765fd6b2SAl Viro 	int s_disk_reads;
465765fd6b2SAl Viro 	int s_disk_writes;
466765fd6b2SAl Viro 	int s_fix_nodes;
467765fd6b2SAl Viro 	int s_do_balance;
468765fd6b2SAl Viro 	int s_unneeded_left_neighbor;
469765fd6b2SAl Viro 	int s_good_search_by_key_reada;
470765fd6b2SAl Viro 	int s_bmaps;
471765fd6b2SAl Viro 	int s_bmaps_without_search;
472765fd6b2SAl Viro 	int s_direct2indirect;
473765fd6b2SAl Viro 	int s_indirect2direct;
474765fd6b2SAl Viro 	/* set up when it's ok for reiserfs_read_inode2() to read from
475765fd6b2SAl Viro 	   disk inode with nlink==0. Currently this is only used during
476765fd6b2SAl Viro 	   finish_unfinished() processing at mount time */
477765fd6b2SAl Viro 	int s_is_unlinked_ok;
478765fd6b2SAl Viro 	reiserfs_proc_info_data_t s_proc_info_data;
479765fd6b2SAl Viro 	struct proc_dir_entry *procdir;
480765fd6b2SAl Viro 	int reserved_blocks;	/* amount of blocks reserved for further allocations */
481765fd6b2SAl Viro 	spinlock_t bitmap_lock;	/* this lock on now only used to protect reserved_blocks variable */
482765fd6b2SAl Viro 	struct dentry *priv_root;	/* root of /.reiserfs_priv */
483765fd6b2SAl Viro 	struct dentry *xattr_root;	/* root of /.reiserfs_priv/xattrs */
484765fd6b2SAl Viro 	int j_errno;
485033369d1SArtem Bityutskiy 
486033369d1SArtem Bityutskiy 	int work_queued;              /* non-zero delayed work is queued */
487033369d1SArtem Bityutskiy 	struct delayed_work old_work; /* old transactions flush delayed work */
488033369d1SArtem Bityutskiy 	spinlock_t old_work_lock;     /* protects old_work and work_queued */
489033369d1SArtem Bityutskiy 
490765fd6b2SAl Viro #ifdef CONFIG_QUOTA
491765fd6b2SAl Viro 	char *s_qf_names[MAXQUOTAS];
492765fd6b2SAl Viro 	int s_jquota_fmt;
493765fd6b2SAl Viro #endif
494765fd6b2SAl Viro 	char *s_jdev;		/* Stored jdev for mount option showing */
495765fd6b2SAl Viro #ifdef CONFIG_REISERFS_CHECK
496765fd6b2SAl Viro 
497765fd6b2SAl Viro 	struct tree_balance *cur_tb;	/*
498765fd6b2SAl Viro 					 * Detects whether more than one
499765fd6b2SAl Viro 					 * copy of tb exists per superblock
500765fd6b2SAl Viro 					 * as a means of checking whether
501765fd6b2SAl Viro 					 * do_balance is executing concurrently
502765fd6b2SAl Viro 					 * against another tree reader/writer
503765fd6b2SAl Viro 					 * on a same mount point.
504765fd6b2SAl Viro 					 */
505765fd6b2SAl Viro #endif
506765fd6b2SAl Viro };
507765fd6b2SAl Viro 
508765fd6b2SAl Viro /* Definitions of reiserfs on-disk properties: */
509765fd6b2SAl Viro #define REISERFS_3_5 0
510765fd6b2SAl Viro #define REISERFS_3_6 1
511765fd6b2SAl Viro #define REISERFS_OLD_FORMAT 2
512765fd6b2SAl Viro 
513765fd6b2SAl Viro enum reiserfs_mount_options {
514765fd6b2SAl Viro /* Mount options */
515765fd6b2SAl Viro 	REISERFS_LARGETAIL,	/* large tails will be created in a session */
516765fd6b2SAl Viro 	REISERFS_SMALLTAIL,	/* small (for files less than block size) tails will be created in a session */
517765fd6b2SAl Viro 	REPLAYONLY,		/* replay journal and return 0. Use by fsck */
518765fd6b2SAl Viro 	REISERFS_CONVERT,	/* -o conv: causes conversion of old
519765fd6b2SAl Viro 				   format super block to the new
520765fd6b2SAl Viro 				   format. If not specified - old
521765fd6b2SAl Viro 				   partition will be dealt with in a
522765fd6b2SAl Viro 				   manner of 3.5.x */
523765fd6b2SAl Viro 
524765fd6b2SAl Viro /* -o hash={tea, rupasov, r5, detect} is meant for properly mounting
525765fd6b2SAl Viro ** reiserfs disks from 3.5.19 or earlier.  99% of the time, this option
526765fd6b2SAl Viro ** is not required.  If the normal autodection code can't determine which
527765fd6b2SAl Viro ** hash to use (because both hashes had the same value for a file)
528765fd6b2SAl Viro ** use this option to force a specific hash.  It won't allow you to override
529765fd6b2SAl Viro ** the existing hash on the FS, so if you have a tea hash disk, and mount
530765fd6b2SAl Viro ** with -o hash=rupasov, the mount will fail.
531765fd6b2SAl Viro */
532765fd6b2SAl Viro 	FORCE_TEA_HASH,		/* try to force tea hash on mount */
533765fd6b2SAl Viro 	FORCE_RUPASOV_HASH,	/* try to force rupasov hash on mount */
534765fd6b2SAl Viro 	FORCE_R5_HASH,		/* try to force rupasov hash on mount */
535765fd6b2SAl Viro 	FORCE_HASH_DETECT,	/* try to detect hash function on mount */
536765fd6b2SAl Viro 
537765fd6b2SAl Viro 	REISERFS_DATA_LOG,
538765fd6b2SAl Viro 	REISERFS_DATA_ORDERED,
539765fd6b2SAl Viro 	REISERFS_DATA_WRITEBACK,
540765fd6b2SAl Viro 
541765fd6b2SAl Viro /* used for testing experimental features, makes benchmarking new
542765fd6b2SAl Viro    features with and without more convenient, should never be used by
543765fd6b2SAl Viro    users in any code shipped to users (ideally) */
544765fd6b2SAl Viro 
545765fd6b2SAl Viro 	REISERFS_NO_BORDER,
546765fd6b2SAl Viro 	REISERFS_NO_UNHASHED_RELOCATION,
547765fd6b2SAl Viro 	REISERFS_HASHED_RELOCATION,
548765fd6b2SAl Viro 	REISERFS_ATTRS,
549765fd6b2SAl Viro 	REISERFS_XATTRS_USER,
550765fd6b2SAl Viro 	REISERFS_POSIXACL,
551765fd6b2SAl Viro 	REISERFS_EXPOSE_PRIVROOT,
552765fd6b2SAl Viro 	REISERFS_BARRIER_NONE,
553765fd6b2SAl Viro 	REISERFS_BARRIER_FLUSH,
554765fd6b2SAl Viro 
555765fd6b2SAl Viro 	/* Actions on error */
556765fd6b2SAl Viro 	REISERFS_ERROR_PANIC,
557765fd6b2SAl Viro 	REISERFS_ERROR_RO,
558765fd6b2SAl Viro 	REISERFS_ERROR_CONTINUE,
559765fd6b2SAl Viro 
560765fd6b2SAl Viro 	REISERFS_USRQUOTA,	/* User quota option specified */
561765fd6b2SAl Viro 	REISERFS_GRPQUOTA,	/* Group quota option specified */
562765fd6b2SAl Viro 
563765fd6b2SAl Viro 	REISERFS_TEST1,
564765fd6b2SAl Viro 	REISERFS_TEST2,
565765fd6b2SAl Viro 	REISERFS_TEST3,
566765fd6b2SAl Viro 	REISERFS_TEST4,
567765fd6b2SAl Viro 	REISERFS_UNSUPPORTED_OPT,
568765fd6b2SAl Viro };
569765fd6b2SAl Viro 
570765fd6b2SAl Viro #define reiserfs_r5_hash(s) (REISERFS_SB(s)->s_mount_opt & (1 << FORCE_R5_HASH))
571765fd6b2SAl Viro #define reiserfs_rupasov_hash(s) (REISERFS_SB(s)->s_mount_opt & (1 << FORCE_RUPASOV_HASH))
572765fd6b2SAl Viro #define reiserfs_tea_hash(s) (REISERFS_SB(s)->s_mount_opt & (1 << FORCE_TEA_HASH))
573765fd6b2SAl Viro #define reiserfs_hash_detect(s) (REISERFS_SB(s)->s_mount_opt & (1 << FORCE_HASH_DETECT))
574765fd6b2SAl Viro #define reiserfs_no_border(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_NO_BORDER))
575765fd6b2SAl Viro #define reiserfs_no_unhashed_relocation(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_NO_UNHASHED_RELOCATION))
576765fd6b2SAl Viro #define reiserfs_hashed_relocation(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_HASHED_RELOCATION))
577765fd6b2SAl Viro #define reiserfs_test4(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_TEST4))
578765fd6b2SAl Viro 
579765fd6b2SAl Viro #define have_large_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_LARGETAIL))
580765fd6b2SAl Viro #define have_small_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_SMALLTAIL))
581765fd6b2SAl Viro #define replay_only(s) (REISERFS_SB(s)->s_mount_opt & (1 << REPLAYONLY))
582765fd6b2SAl Viro #define reiserfs_attrs(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_ATTRS))
583765fd6b2SAl Viro #define old_format_only(s) (REISERFS_SB(s)->s_properties & (1 << REISERFS_3_5))
584765fd6b2SAl Viro #define convert_reiserfs(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_CONVERT))
585765fd6b2SAl Viro #define reiserfs_data_log(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_LOG))
586765fd6b2SAl Viro #define reiserfs_data_ordered(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_ORDERED))
587765fd6b2SAl Viro #define reiserfs_data_writeback(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_WRITEBACK))
588765fd6b2SAl Viro #define reiserfs_xattrs_user(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_XATTRS_USER))
589765fd6b2SAl Viro #define reiserfs_posixacl(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_POSIXACL))
590765fd6b2SAl Viro #define reiserfs_expose_privroot(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_EXPOSE_PRIVROOT))
591765fd6b2SAl Viro #define reiserfs_xattrs_optional(s) (reiserfs_xattrs_user(s) || reiserfs_posixacl(s))
592765fd6b2SAl Viro #define reiserfs_barrier_none(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_BARRIER_NONE))
593765fd6b2SAl Viro #define reiserfs_barrier_flush(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_BARRIER_FLUSH))
594765fd6b2SAl Viro 
595765fd6b2SAl Viro #define reiserfs_error_panic(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_ERROR_PANIC))
596765fd6b2SAl Viro #define reiserfs_error_ro(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_ERROR_RO))
597765fd6b2SAl Viro 
598765fd6b2SAl Viro void reiserfs_file_buffer(struct buffer_head *bh, int list);
599765fd6b2SAl Viro extern struct file_system_type reiserfs_fs_type;
600765fd6b2SAl Viro int reiserfs_resize(struct super_block *, unsigned long);
601765fd6b2SAl Viro 
602765fd6b2SAl Viro #define CARRY_ON                0
603765fd6b2SAl Viro #define SCHEDULE_OCCURRED       1
604765fd6b2SAl Viro 
605765fd6b2SAl Viro #define SB_BUFFER_WITH_SB(s) (REISERFS_SB(s)->s_sbh)
606765fd6b2SAl Viro #define SB_JOURNAL(s) (REISERFS_SB(s)->s_journal)
607765fd6b2SAl Viro #define SB_JOURNAL_1st_RESERVED_BLOCK(s) (SB_JOURNAL(s)->j_1st_reserved_block)
608765fd6b2SAl Viro #define SB_JOURNAL_LEN_FREE(s) (SB_JOURNAL(s)->j_journal_len_free)
609765fd6b2SAl Viro #define SB_AP_BITMAP(s) (REISERFS_SB(s)->s_ap_bitmap)
610765fd6b2SAl Viro 
611765fd6b2SAl Viro #define SB_DISK_JOURNAL_HEAD(s) (SB_JOURNAL(s)->j_header_bh->)
612765fd6b2SAl Viro 
613765fd6b2SAl Viro #define reiserfs_is_journal_aborted(journal) (unlikely (__reiserfs_is_journal_aborted (journal)))
614765fd6b2SAl Viro static inline int __reiserfs_is_journal_aborted(struct reiserfs_journal
615765fd6b2SAl Viro 						*journal)
616765fd6b2SAl Viro {
617765fd6b2SAl Viro 	return test_bit(J_ABORTED, &journal->j_state);
618765fd6b2SAl Viro }
619765fd6b2SAl Viro 
620f466c6fdSAl Viro /*
621f466c6fdSAl Viro  * Locking primitives. The write lock is a per superblock
622f466c6fdSAl Viro  * special mutex that has properties close to the Big Kernel Lock
623f466c6fdSAl Viro  * which was used in the previous locking scheme.
624f466c6fdSAl Viro  */
625f466c6fdSAl Viro void reiserfs_write_lock(struct super_block *s);
626f466c6fdSAl Viro void reiserfs_write_unlock(struct super_block *s);
627278f6679SJeff Mahoney int __must_check reiserfs_write_unlock_nested(struct super_block *s);
628278f6679SJeff Mahoney void reiserfs_write_lock_nested(struct super_block *s, int depth);
629f466c6fdSAl Viro 
630f466c6fdSAl Viro #ifdef CONFIG_REISERFS_CHECK
631f466c6fdSAl Viro void reiserfs_lock_check_recursive(struct super_block *s);
632f466c6fdSAl Viro #else
633f466c6fdSAl Viro static inline void reiserfs_lock_check_recursive(struct super_block *s) { }
634f466c6fdSAl Viro #endif
635f466c6fdSAl Viro 
636f466c6fdSAl Viro /*
637f466c6fdSAl Viro  * Several mutexes depend on the write lock.
638f466c6fdSAl Viro  * However sometimes we want to relax the write lock while we hold
639f466c6fdSAl Viro  * these mutexes, according to the release/reacquire on schedule()
640f466c6fdSAl Viro  * properties of the Bkl that were used.
641f466c6fdSAl Viro  * Reiserfs performances and locking were based on this scheme.
642f466c6fdSAl Viro  * Now that the write lock is a mutex and not the bkl anymore, doing so
643f466c6fdSAl Viro  * may result in a deadlock:
644f466c6fdSAl Viro  *
645f466c6fdSAl Viro  * A acquire write_lock
646f466c6fdSAl Viro  * A acquire j_commit_mutex
647f466c6fdSAl Viro  * A release write_lock and wait for something
648f466c6fdSAl Viro  * B acquire write_lock
649f466c6fdSAl Viro  * B can't acquire j_commit_mutex and sleep
650f466c6fdSAl Viro  * A can't acquire write lock anymore
651f466c6fdSAl Viro  * deadlock
652f466c6fdSAl Viro  *
653f466c6fdSAl Viro  * What we do here is avoiding such deadlock by playing the same game
654f466c6fdSAl Viro  * than the Bkl: if we can't acquire a mutex that depends on the write lock,
655f466c6fdSAl Viro  * we release the write lock, wait a bit and then retry.
656f466c6fdSAl Viro  *
657f466c6fdSAl Viro  * The mutexes concerned by this hack are:
658f466c6fdSAl Viro  * - The commit mutex of a journal list
659f466c6fdSAl Viro  * - The flush mutex
660f466c6fdSAl Viro  * - The journal lock
661f466c6fdSAl Viro  * - The inode mutex
662f466c6fdSAl Viro  */
663f466c6fdSAl Viro static inline void reiserfs_mutex_lock_safe(struct mutex *m,
664f466c6fdSAl Viro 					    struct super_block *s)
665f466c6fdSAl Viro {
666278f6679SJeff Mahoney 	int depth;
667278f6679SJeff Mahoney 
668278f6679SJeff Mahoney 	depth = reiserfs_write_unlock_nested(s);
669f466c6fdSAl Viro 	mutex_lock(m);
670278f6679SJeff Mahoney 	reiserfs_write_lock_nested(s, depth);
671f466c6fdSAl Viro }
672f466c6fdSAl Viro 
673f466c6fdSAl Viro static inline void
674f466c6fdSAl Viro reiserfs_mutex_lock_nested_safe(struct mutex *m, unsigned int subclass,
675f466c6fdSAl Viro 				struct super_block *s)
676f466c6fdSAl Viro {
677278f6679SJeff Mahoney 	int depth;
678278f6679SJeff Mahoney 
679278f6679SJeff Mahoney 	depth = reiserfs_write_unlock_nested(s);
680f466c6fdSAl Viro 	mutex_lock_nested(m, subclass);
681278f6679SJeff Mahoney 	reiserfs_write_lock_nested(s, depth);
682f466c6fdSAl Viro }
683f466c6fdSAl Viro 
684f466c6fdSAl Viro static inline void
685f466c6fdSAl Viro reiserfs_down_read_safe(struct rw_semaphore *sem, struct super_block *s)
686f466c6fdSAl Viro {
687278f6679SJeff Mahoney        int depth;
688278f6679SJeff Mahoney        depth = reiserfs_write_unlock_nested(s);
689f466c6fdSAl Viro        down_read(sem);
690278f6679SJeff Mahoney        reiserfs_write_lock_nested(s, depth);
691f466c6fdSAl Viro }
692f466c6fdSAl Viro 
693f466c6fdSAl Viro /*
694f466c6fdSAl Viro  * When we schedule, we usually want to also release the write lock,
695f466c6fdSAl Viro  * according to the previous bkl based locking scheme of reiserfs.
696f466c6fdSAl Viro  */
697f466c6fdSAl Viro static inline void reiserfs_cond_resched(struct super_block *s)
698f466c6fdSAl Viro {
699f466c6fdSAl Viro 	if (need_resched()) {
700278f6679SJeff Mahoney 		int depth;
701278f6679SJeff Mahoney 
702278f6679SJeff Mahoney 		depth = reiserfs_write_unlock_nested(s);
703f466c6fdSAl Viro 		schedule();
704278f6679SJeff Mahoney 		reiserfs_write_lock_nested(s, depth);
705f466c6fdSAl Viro 	}
706f466c6fdSAl Viro }
707f466c6fdSAl Viro 
708f466c6fdSAl Viro struct fid;
709f466c6fdSAl Viro 
710f466c6fdSAl Viro /* in reading the #defines, it may help to understand that they employ
711f466c6fdSAl Viro    the following abbreviations:
712f466c6fdSAl Viro 
713f466c6fdSAl Viro    B = Buffer
714f466c6fdSAl Viro    I = Item header
715f466c6fdSAl Viro    H = Height within the tree (should be changed to LEV)
716f466c6fdSAl Viro    N = Number of the item in the node
717f466c6fdSAl Viro    STAT = stat data
718f466c6fdSAl Viro    DEH = Directory Entry Header
719f466c6fdSAl Viro    EC = Entry Count
720f466c6fdSAl Viro    E = Entry number
721f466c6fdSAl Viro    UL = Unsigned Long
722f466c6fdSAl Viro    BLKH = BLocK Header
723f466c6fdSAl Viro    UNFM = UNForMatted node
724f466c6fdSAl Viro    DC = Disk Child
725f466c6fdSAl Viro    P = Path
726f466c6fdSAl Viro 
727f466c6fdSAl Viro    These #defines are named by concatenating these abbreviations,
728f466c6fdSAl Viro    where first comes the arguments, and last comes the return value,
729f466c6fdSAl Viro    of the macro.
730f466c6fdSAl Viro 
731f466c6fdSAl Viro */
732f466c6fdSAl Viro 
733f466c6fdSAl Viro #define USE_INODE_GENERATION_COUNTER
734f466c6fdSAl Viro 
735f466c6fdSAl Viro #define REISERFS_PREALLOCATE
736f466c6fdSAl Viro #define DISPLACE_NEW_PACKING_LOCALITIES
737f466c6fdSAl Viro #define PREALLOCATION_SIZE 9
738f466c6fdSAl Viro 
739f466c6fdSAl Viro /* n must be power of 2 */
740f466c6fdSAl Viro #define _ROUND_UP(x,n) (((x)+(n)-1u) & ~((n)-1u))
741f466c6fdSAl Viro 
742f466c6fdSAl Viro // to be ok for alpha and others we have to align structures to 8 byte
743f466c6fdSAl Viro // boundary.
744f466c6fdSAl Viro // FIXME: do not change 4 by anything else: there is code which relies on that
745f466c6fdSAl Viro #define ROUND_UP(x) _ROUND_UP(x,8LL)
746f466c6fdSAl Viro 
747f466c6fdSAl Viro /* debug levels.  Right now, CONFIG_REISERFS_CHECK means print all debug
748f466c6fdSAl Viro ** messages.
749f466c6fdSAl Viro */
750f466c6fdSAl Viro #define REISERFS_DEBUG_CODE 5	/* extra messages to help find/debug errors */
751f466c6fdSAl Viro 
752f466c6fdSAl Viro void __reiserfs_warning(struct super_block *s, const char *id,
753f466c6fdSAl Viro 			 const char *func, const char *fmt, ...);
754f466c6fdSAl Viro #define reiserfs_warning(s, id, fmt, args...) \
755f466c6fdSAl Viro 	 __reiserfs_warning(s, id, __func__, fmt, ##args)
756f466c6fdSAl Viro /* assertions handling */
757f466c6fdSAl Viro 
758f466c6fdSAl Viro /** always check a condition and panic if it's false. */
759f466c6fdSAl Viro #define __RASSERT(cond, scond, format, args...)			\
760f466c6fdSAl Viro do {									\
761f466c6fdSAl Viro 	if (!(cond))							\
762f466c6fdSAl Viro 		reiserfs_panic(NULL, "assertion failure", "(" #cond ") at " \
763f466c6fdSAl Viro 			       __FILE__ ":%i:%s: " format "\n",		\
764f466c6fdSAl Viro 			       in_interrupt() ? -1 : task_pid_nr(current), \
765f466c6fdSAl Viro 			       __LINE__, __func__ , ##args);		\
766f466c6fdSAl Viro } while (0)
767f466c6fdSAl Viro 
768f466c6fdSAl Viro #define RASSERT(cond, format, args...) __RASSERT(cond, #cond, format, ##args)
769f466c6fdSAl Viro 
770f466c6fdSAl Viro #if defined( CONFIG_REISERFS_CHECK )
771f466c6fdSAl Viro #define RFALSE(cond, format, args...) __RASSERT(!(cond), "!(" #cond ")", format, ##args)
772f466c6fdSAl Viro #else
773f466c6fdSAl Viro #define RFALSE( cond, format, args... ) do {;} while( 0 )
774f466c6fdSAl Viro #endif
775f466c6fdSAl Viro 
776f466c6fdSAl Viro #define CONSTF __attribute_const__
777f466c6fdSAl Viro /*
778f466c6fdSAl Viro  * Disk Data Structures
779f466c6fdSAl Viro  */
780f466c6fdSAl Viro 
781f466c6fdSAl Viro /***************************************************************************/
782f466c6fdSAl Viro /*                             SUPER BLOCK                                 */
783f466c6fdSAl Viro /***************************************************************************/
784f466c6fdSAl Viro 
785f466c6fdSAl Viro /*
786f466c6fdSAl Viro  * Structure of super block on disk, a version of which in RAM is often accessed as REISERFS_SB(s)->s_rs
787f466c6fdSAl Viro  * the version in RAM is part of a larger structure containing fields never written to disk.
788f466c6fdSAl Viro  */
789f466c6fdSAl Viro #define UNSET_HASH 0		// read_super will guess about, what hash names
790f466c6fdSAl Viro 		     // in directories were sorted with
791f466c6fdSAl Viro #define TEA_HASH  1
792f466c6fdSAl Viro #define YURA_HASH 2
793f466c6fdSAl Viro #define R5_HASH   3
794f466c6fdSAl Viro #define DEFAULT_HASH R5_HASH
795f466c6fdSAl Viro 
796f466c6fdSAl Viro struct journal_params {
797f466c6fdSAl Viro 	__le32 jp_journal_1st_block;	/* where does journal start from on its
798f466c6fdSAl Viro 					 * device */
799f466c6fdSAl Viro 	__le32 jp_journal_dev;	/* journal device st_rdev */
800f466c6fdSAl Viro 	__le32 jp_journal_size;	/* size of the journal */
801f466c6fdSAl Viro 	__le32 jp_journal_trans_max;	/* max number of blocks in a transaction. */
802f466c6fdSAl Viro 	__le32 jp_journal_magic;	/* random value made on fs creation (this
803f466c6fdSAl Viro 					 * was sb_journal_block_count) */
804f466c6fdSAl Viro 	__le32 jp_journal_max_batch;	/* max number of blocks to batch into a
805f466c6fdSAl Viro 					 * trans */
806f466c6fdSAl Viro 	__le32 jp_journal_max_commit_age;	/* in seconds, how old can an async
807f466c6fdSAl Viro 						 * commit be */
808f466c6fdSAl Viro 	__le32 jp_journal_max_trans_age;	/* in seconds, how old can a transaction
809f466c6fdSAl Viro 						 * be */
810f466c6fdSAl Viro };
811f466c6fdSAl Viro 
812f466c6fdSAl Viro /* this is the super from 3.5.X, where X >= 10 */
813f466c6fdSAl Viro struct reiserfs_super_block_v1 {
814f466c6fdSAl Viro 	__le32 s_block_count;	/* blocks count         */
815f466c6fdSAl Viro 	__le32 s_free_blocks;	/* free blocks count    */
816f466c6fdSAl Viro 	__le32 s_root_block;	/* root block number    */
817f466c6fdSAl Viro 	struct journal_params s_journal;
818f466c6fdSAl Viro 	__le16 s_blocksize;	/* block size */
819f466c6fdSAl Viro 	__le16 s_oid_maxsize;	/* max size of object id array, see
820f466c6fdSAl Viro 				 * get_objectid() commentary  */
821f466c6fdSAl Viro 	__le16 s_oid_cursize;	/* current size of object id array */
822f466c6fdSAl Viro 	__le16 s_umount_state;	/* this is set to 1 when filesystem was
823f466c6fdSAl Viro 				 * umounted, to 2 - when not */
824f466c6fdSAl Viro 	char s_magic[10];	/* reiserfs magic string indicates that
825f466c6fdSAl Viro 				 * file system is reiserfs:
826f466c6fdSAl Viro 				 * "ReIsErFs" or "ReIsEr2Fs" or "ReIsEr3Fs" */
827f466c6fdSAl Viro 	__le16 s_fs_state;	/* it is set to used by fsck to mark which
828f466c6fdSAl Viro 				 * phase of rebuilding is done */
829f466c6fdSAl Viro 	__le32 s_hash_function_code;	/* indicate, what hash function is being use
830f466c6fdSAl Viro 					 * to sort names in a directory*/
831f466c6fdSAl Viro 	__le16 s_tree_height;	/* height of disk tree */
832f466c6fdSAl Viro 	__le16 s_bmap_nr;	/* amount of bitmap blocks needed to address
833f466c6fdSAl Viro 				 * each block of file system */
834f466c6fdSAl Viro 	__le16 s_version;	/* this field is only reliable on filesystem
835f466c6fdSAl Viro 				 * with non-standard journal */
836f466c6fdSAl Viro 	__le16 s_reserved_for_journal;	/* size in blocks of journal area on main
837f466c6fdSAl Viro 					 * device, we need to keep after
838f466c6fdSAl Viro 					 * making fs with non-standard journal */
839f466c6fdSAl Viro } __attribute__ ((__packed__));
840f466c6fdSAl Viro 
841f466c6fdSAl Viro #define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1))
842f466c6fdSAl Viro 
843f466c6fdSAl Viro /* this is the on disk super block */
844f466c6fdSAl Viro struct reiserfs_super_block {
845f466c6fdSAl Viro 	struct reiserfs_super_block_v1 s_v1;
846f466c6fdSAl Viro 	__le32 s_inode_generation;
847f466c6fdSAl Viro 	__le32 s_flags;		/* Right now used only by inode-attributes, if enabled */
848f466c6fdSAl Viro 	unsigned char s_uuid[16];	/* filesystem unique identifier */
849f466c6fdSAl Viro 	unsigned char s_label[16];	/* filesystem volume label */
850f466c6fdSAl Viro 	__le16 s_mnt_count;		/* Count of mounts since last fsck */
851f466c6fdSAl Viro 	__le16 s_max_mnt_count;		/* Maximum mounts before check */
852f466c6fdSAl Viro 	__le32 s_lastcheck;		/* Timestamp of last fsck */
853f466c6fdSAl Viro 	__le32 s_check_interval;	/* Interval between checks */
854f466c6fdSAl Viro 	char s_unused[76];	/* zero filled by mkreiserfs and
855f466c6fdSAl Viro 				 * reiserfs_convert_objectid_map_v1()
856f466c6fdSAl Viro 				 * so any additions must be updated
857f466c6fdSAl Viro 				 * there as well. */
858f466c6fdSAl Viro } __attribute__ ((__packed__));
859f466c6fdSAl Viro 
860f466c6fdSAl Viro #define SB_SIZE (sizeof(struct reiserfs_super_block))
861f466c6fdSAl Viro 
862f466c6fdSAl Viro #define REISERFS_VERSION_1 0
863f466c6fdSAl Viro #define REISERFS_VERSION_2 2
864f466c6fdSAl Viro 
865f466c6fdSAl Viro // on-disk super block fields converted to cpu form
866f466c6fdSAl Viro #define SB_DISK_SUPER_BLOCK(s) (REISERFS_SB(s)->s_rs)
867f466c6fdSAl Viro #define SB_V1_DISK_SUPER_BLOCK(s) (&(SB_DISK_SUPER_BLOCK(s)->s_v1))
868f466c6fdSAl Viro #define SB_BLOCKSIZE(s) \
869f466c6fdSAl Viro         le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_blocksize))
870f466c6fdSAl Viro #define SB_BLOCK_COUNT(s) \
871f466c6fdSAl Viro         le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_block_count))
872f466c6fdSAl Viro #define SB_FREE_BLOCKS(s) \
873f466c6fdSAl Viro         le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks))
874f466c6fdSAl Viro #define SB_REISERFS_MAGIC(s) \
875f466c6fdSAl Viro         (SB_V1_DISK_SUPER_BLOCK(s)->s_magic)
876f466c6fdSAl Viro #define SB_ROOT_BLOCK(s) \
877f466c6fdSAl Viro         le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_root_block))
878f466c6fdSAl Viro #define SB_TREE_HEIGHT(s) \
879f466c6fdSAl Viro         le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height))
880f466c6fdSAl Viro #define SB_REISERFS_STATE(s) \
881f466c6fdSAl Viro         le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state))
882f466c6fdSAl Viro #define SB_VERSION(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_version))
883f466c6fdSAl Viro #define SB_BMAP_NR(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr))
884f466c6fdSAl Viro 
885f466c6fdSAl Viro #define PUT_SB_BLOCK_COUNT(s, val) \
886f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_block_count = cpu_to_le32(val); } while (0)
887f466c6fdSAl Viro #define PUT_SB_FREE_BLOCKS(s, val) \
888f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks = cpu_to_le32(val); } while (0)
889f466c6fdSAl Viro #define PUT_SB_ROOT_BLOCK(s, val) \
890f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_root_block = cpu_to_le32(val); } while (0)
891f466c6fdSAl Viro #define PUT_SB_TREE_HEIGHT(s, val) \
892f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height = cpu_to_le16(val); } while (0)
893f466c6fdSAl Viro #define PUT_SB_REISERFS_STATE(s, val) \
894f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state = cpu_to_le16(val); } while (0)
895f466c6fdSAl Viro #define PUT_SB_VERSION(s, val) \
896f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_version = cpu_to_le16(val); } while (0)
897f466c6fdSAl Viro #define PUT_SB_BMAP_NR(s, val) \
898f466c6fdSAl Viro    do { SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr = cpu_to_le16 (val); } while (0)
899f466c6fdSAl Viro 
900f466c6fdSAl Viro #define SB_ONDISK_JP(s) (&SB_V1_DISK_SUPER_BLOCK(s)->s_journal)
901f466c6fdSAl Viro #define SB_ONDISK_JOURNAL_SIZE(s) \
902f466c6fdSAl Viro          le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_size))
903f466c6fdSAl Viro #define SB_ONDISK_JOURNAL_1st_BLOCK(s) \
904f466c6fdSAl Viro          le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_1st_block))
905f466c6fdSAl Viro #define SB_ONDISK_JOURNAL_DEVICE(s) \
906f466c6fdSAl Viro          le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_dev))
907f466c6fdSAl Viro #define SB_ONDISK_RESERVED_FOR_JOURNAL(s) \
908f466c6fdSAl Viro          le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_reserved_for_journal))
909f466c6fdSAl Viro 
910f466c6fdSAl Viro #define is_block_in_log_or_reserved_area(s, block) \
911f466c6fdSAl Viro          block >= SB_JOURNAL_1st_RESERVED_BLOCK(s) \
912f466c6fdSAl Viro          && block < SB_JOURNAL_1st_RESERVED_BLOCK(s) +  \
913f466c6fdSAl Viro          ((!is_reiserfs_jr(SB_DISK_SUPER_BLOCK(s)) ? \
914f466c6fdSAl Viro          SB_ONDISK_JOURNAL_SIZE(s) + 1 : SB_ONDISK_RESERVED_FOR_JOURNAL(s)))
915f466c6fdSAl Viro 
916f466c6fdSAl Viro int is_reiserfs_3_5(struct reiserfs_super_block *rs);
917f466c6fdSAl Viro int is_reiserfs_3_6(struct reiserfs_super_block *rs);
918f466c6fdSAl Viro int is_reiserfs_jr(struct reiserfs_super_block *rs);
919f466c6fdSAl Viro 
920f466c6fdSAl Viro /* ReiserFS leaves the first 64k unused, so that partition labels have
921f466c6fdSAl Viro    enough space.  If someone wants to write a fancy bootloader that
922f466c6fdSAl Viro    needs more than 64k, let us know, and this will be increased in size.
923f466c6fdSAl Viro    This number must be larger than than the largest block size on any
924f466c6fdSAl Viro    platform, or code will break.  -Hans */
925f466c6fdSAl Viro #define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)
926f466c6fdSAl Viro #define REISERFS_FIRST_BLOCK unused_define
927f466c6fdSAl Viro #define REISERFS_JOURNAL_OFFSET_IN_BYTES REISERFS_DISK_OFFSET_IN_BYTES
928f466c6fdSAl Viro 
929f466c6fdSAl Viro /* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */
930f466c6fdSAl Viro #define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)
931f466c6fdSAl Viro 
932f466c6fdSAl Viro /* reiserfs internal error code (used by search_by_key and fix_nodes)) */
933f466c6fdSAl Viro #define CARRY_ON      0
934f466c6fdSAl Viro #define REPEAT_SEARCH -1
935f466c6fdSAl Viro #define IO_ERROR      -2
936f466c6fdSAl Viro #define NO_DISK_SPACE -3
937f466c6fdSAl Viro #define NO_BALANCING_NEEDED  (-4)
938f466c6fdSAl Viro #define NO_MORE_UNUSED_CONTIGUOUS_BLOCKS (-5)
939f466c6fdSAl Viro #define QUOTA_EXCEEDED -6
940f466c6fdSAl Viro 
941f466c6fdSAl Viro typedef __u32 b_blocknr_t;
942f466c6fdSAl Viro typedef __le32 unp_t;
943f466c6fdSAl Viro 
944f466c6fdSAl Viro struct unfm_nodeinfo {
945f466c6fdSAl Viro 	unp_t unfm_nodenum;
946f466c6fdSAl Viro 	unsigned short unfm_freespace;
947f466c6fdSAl Viro };
948f466c6fdSAl Viro 
949f466c6fdSAl Viro /* there are two formats of keys: 3.5 and 3.6
950f466c6fdSAl Viro  */
951f466c6fdSAl Viro #define KEY_FORMAT_3_5 0
952f466c6fdSAl Viro #define KEY_FORMAT_3_6 1
953f466c6fdSAl Viro 
954f466c6fdSAl Viro /* there are two stat datas */
955f466c6fdSAl Viro #define STAT_DATA_V1 0
956f466c6fdSAl Viro #define STAT_DATA_V2 1
957f466c6fdSAl Viro 
958f466c6fdSAl Viro static inline struct reiserfs_inode_info *REISERFS_I(const struct inode *inode)
959f466c6fdSAl Viro {
960f466c6fdSAl Viro 	return container_of(inode, struct reiserfs_inode_info, vfs_inode);
961f466c6fdSAl Viro }
962f466c6fdSAl Viro 
963f466c6fdSAl Viro static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb)
964f466c6fdSAl Viro {
965f466c6fdSAl Viro 	return sb->s_fs_info;
966f466c6fdSAl Viro }
967f466c6fdSAl Viro 
968f466c6fdSAl Viro /* Don't trust REISERFS_SB(sb)->s_bmap_nr, it's a u16
969f466c6fdSAl Viro  * which overflows on large file systems. */
970f466c6fdSAl Viro static inline __u32 reiserfs_bmap_count(struct super_block *sb)
971f466c6fdSAl Viro {
972f466c6fdSAl Viro 	return (SB_BLOCK_COUNT(sb) - 1) / (sb->s_blocksize * 8) + 1;
973f466c6fdSAl Viro }
974f466c6fdSAl Viro 
975f466c6fdSAl Viro static inline int bmap_would_wrap(unsigned bmap_nr)
976f466c6fdSAl Viro {
977f466c6fdSAl Viro 	return bmap_nr > ((1LL << 16) - 1);
978f466c6fdSAl Viro }
979f466c6fdSAl Viro 
980f466c6fdSAl Viro /** this says about version of key of all items (but stat data) the
981f466c6fdSAl Viro     object consists of */
982f466c6fdSAl Viro #define get_inode_item_key_version( inode )                                    \
983f466c6fdSAl Viro     ((REISERFS_I(inode)->i_flags & i_item_key_version_mask) ? KEY_FORMAT_3_6 : KEY_FORMAT_3_5)
984f466c6fdSAl Viro 
985f466c6fdSAl Viro #define set_inode_item_key_version( inode, version )                           \
986f466c6fdSAl Viro          ({ if((version)==KEY_FORMAT_3_6)                                      \
987f466c6fdSAl Viro                 REISERFS_I(inode)->i_flags |= i_item_key_version_mask;      \
988f466c6fdSAl Viro             else                                                               \
989f466c6fdSAl Viro                 REISERFS_I(inode)->i_flags &= ~i_item_key_version_mask; })
990f466c6fdSAl Viro 
991f466c6fdSAl Viro #define get_inode_sd_version(inode)                                            \
992f466c6fdSAl Viro     ((REISERFS_I(inode)->i_flags & i_stat_data_version_mask) ? STAT_DATA_V2 : STAT_DATA_V1)
993f466c6fdSAl Viro 
994f466c6fdSAl Viro #define set_inode_sd_version(inode, version)                                   \
995f466c6fdSAl Viro          ({ if((version)==STAT_DATA_V2)                                        \
996f466c6fdSAl Viro                 REISERFS_I(inode)->i_flags |= i_stat_data_version_mask;     \
997f466c6fdSAl Viro             else                                                               \
998f466c6fdSAl Viro                 REISERFS_I(inode)->i_flags &= ~i_stat_data_version_mask; })
999f466c6fdSAl Viro 
1000f466c6fdSAl Viro /* This is an aggressive tail suppression policy, I am hoping it
1001f466c6fdSAl Viro    improves our benchmarks. The principle behind it is that percentage
1002f466c6fdSAl Viro    space saving is what matters, not absolute space saving.  This is
1003f466c6fdSAl Viro    non-intuitive, but it helps to understand it if you consider that the
1004f466c6fdSAl Viro    cost to access 4 blocks is not much more than the cost to access 1
1005f466c6fdSAl Viro    block, if you have to do a seek and rotate.  A tail risks a
1006f466c6fdSAl Viro    non-linear disk access that is significant as a percentage of total
1007f466c6fdSAl Viro    time cost for a 4 block file and saves an amount of space that is
1008f466c6fdSAl Viro    less significant as a percentage of space, or so goes the hypothesis.
1009f466c6fdSAl Viro    -Hans */
1010f466c6fdSAl Viro #define STORE_TAIL_IN_UNFM_S1(n_file_size,n_tail_size,n_block_size) \
1011f466c6fdSAl Viro (\
1012f466c6fdSAl Viro   (!(n_tail_size)) || \
1013f466c6fdSAl Viro   (((n_tail_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) || \
1014f466c6fdSAl Viro    ( (n_file_size) >= (n_block_size) * 4 ) || \
1015f466c6fdSAl Viro    ( ( (n_file_size) >= (n_block_size) * 3 ) && \
1016f466c6fdSAl Viro      ( (n_tail_size) >=   (MAX_DIRECT_ITEM_LEN(n_block_size))/4) ) || \
1017f466c6fdSAl Viro    ( ( (n_file_size) >= (n_block_size) * 2 ) && \
1018f466c6fdSAl Viro      ( (n_tail_size) >=   (MAX_DIRECT_ITEM_LEN(n_block_size))/2) ) || \
1019f466c6fdSAl Viro    ( ( (n_file_size) >= (n_block_size) ) && \
1020f466c6fdSAl Viro      ( (n_tail_size) >=   (MAX_DIRECT_ITEM_LEN(n_block_size) * 3)/4) ) ) \
1021f466c6fdSAl Viro )
1022f466c6fdSAl Viro 
1023f466c6fdSAl Viro /* Another strategy for tails, this one means only create a tail if all the
1024f466c6fdSAl Viro    file would fit into one DIRECT item.
1025f466c6fdSAl Viro    Primary intention for this one is to increase performance by decreasing
1026f466c6fdSAl Viro    seeking.
1027f466c6fdSAl Viro */
1028f466c6fdSAl Viro #define STORE_TAIL_IN_UNFM_S2(n_file_size,n_tail_size,n_block_size) \
1029f466c6fdSAl Viro (\
1030f466c6fdSAl Viro   (!(n_tail_size)) || \
1031f466c6fdSAl Viro   (((n_file_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) ) \
1032f466c6fdSAl Viro )
1033f466c6fdSAl Viro 
1034f466c6fdSAl Viro /*
1035f466c6fdSAl Viro  * values for s_umount_state field
1036f466c6fdSAl Viro  */
1037f466c6fdSAl Viro #define REISERFS_VALID_FS    1
1038f466c6fdSAl Viro #define REISERFS_ERROR_FS    2
1039f466c6fdSAl Viro 
1040f466c6fdSAl Viro //
1041f466c6fdSAl Viro // there are 5 item types currently
1042f466c6fdSAl Viro //
1043f466c6fdSAl Viro #define TYPE_STAT_DATA 0
1044f466c6fdSAl Viro #define TYPE_INDIRECT 1
1045f466c6fdSAl Viro #define TYPE_DIRECT 2
1046f466c6fdSAl Viro #define TYPE_DIRENTRY 3
1047f466c6fdSAl Viro #define TYPE_MAXTYPE 3
1048f466c6fdSAl Viro #define TYPE_ANY 15		// FIXME: comment is required
1049f466c6fdSAl Viro 
1050f466c6fdSAl Viro /***************************************************************************/
1051f466c6fdSAl Viro /*                       KEY & ITEM HEAD                                   */
1052f466c6fdSAl Viro /***************************************************************************/
1053f466c6fdSAl Viro 
1054f466c6fdSAl Viro //
1055f466c6fdSAl Viro // directories use this key as well as old files
1056f466c6fdSAl Viro //
1057f466c6fdSAl Viro struct offset_v1 {
1058f466c6fdSAl Viro 	__le32 k_offset;
1059f466c6fdSAl Viro 	__le32 k_uniqueness;
1060f466c6fdSAl Viro } __attribute__ ((__packed__));
1061f466c6fdSAl Viro 
1062f466c6fdSAl Viro struct offset_v2 {
1063f466c6fdSAl Viro 	__le64 v;
1064f466c6fdSAl Viro } __attribute__ ((__packed__));
1065f466c6fdSAl Viro 
1066f466c6fdSAl Viro static inline __u16 offset_v2_k_type(const struct offset_v2 *v2)
1067f466c6fdSAl Viro {
1068f466c6fdSAl Viro 	__u8 type = le64_to_cpu(v2->v) >> 60;
1069f466c6fdSAl Viro 	return (type <= TYPE_MAXTYPE) ? type : TYPE_ANY;
1070f466c6fdSAl Viro }
1071f466c6fdSAl Viro 
1072f466c6fdSAl Viro static inline void set_offset_v2_k_type(struct offset_v2 *v2, int type)
1073f466c6fdSAl Viro {
1074f466c6fdSAl Viro 	v2->v =
1075f466c6fdSAl Viro 	    (v2->v & cpu_to_le64(~0ULL >> 4)) | cpu_to_le64((__u64) type << 60);
1076f466c6fdSAl Viro }
1077f466c6fdSAl Viro 
1078f466c6fdSAl Viro static inline loff_t offset_v2_k_offset(const struct offset_v2 *v2)
1079f466c6fdSAl Viro {
1080f466c6fdSAl Viro 	return le64_to_cpu(v2->v) & (~0ULL >> 4);
1081f466c6fdSAl Viro }
1082f466c6fdSAl Viro 
1083f466c6fdSAl Viro static inline void set_offset_v2_k_offset(struct offset_v2 *v2, loff_t offset)
1084f466c6fdSAl Viro {
1085f466c6fdSAl Viro 	offset &= (~0ULL >> 4);
1086f466c6fdSAl Viro 	v2->v = (v2->v & cpu_to_le64(15ULL << 60)) | cpu_to_le64(offset);
1087f466c6fdSAl Viro }
1088f466c6fdSAl Viro 
1089f466c6fdSAl Viro /* Key of an item determines its location in the S+tree, and
1090f466c6fdSAl Viro    is composed of 4 components */
1091f466c6fdSAl Viro struct reiserfs_key {
1092f466c6fdSAl Viro 	__le32 k_dir_id;	/* packing locality: by default parent
1093f466c6fdSAl Viro 				   directory object id */
1094f466c6fdSAl Viro 	__le32 k_objectid;	/* object identifier */
1095f466c6fdSAl Viro 	union {
1096f466c6fdSAl Viro 		struct offset_v1 k_offset_v1;
1097f466c6fdSAl Viro 		struct offset_v2 k_offset_v2;
1098f466c6fdSAl Viro 	} __attribute__ ((__packed__)) u;
1099f466c6fdSAl Viro } __attribute__ ((__packed__));
1100f466c6fdSAl Viro 
1101f466c6fdSAl Viro struct in_core_key {
1102f466c6fdSAl Viro 	__u32 k_dir_id;		/* packing locality: by default parent
1103f466c6fdSAl Viro 				   directory object id */
1104f466c6fdSAl Viro 	__u32 k_objectid;	/* object identifier */
1105f466c6fdSAl Viro 	__u64 k_offset;
1106f466c6fdSAl Viro 	__u8 k_type;
1107f466c6fdSAl Viro };
1108f466c6fdSAl Viro 
1109f466c6fdSAl Viro struct cpu_key {
1110f466c6fdSAl Viro 	struct in_core_key on_disk_key;
1111f466c6fdSAl Viro 	int version;
1112f466c6fdSAl Viro 	int key_length;		/* 3 in all cases but direct2indirect and
1113f466c6fdSAl Viro 				   indirect2direct conversion */
1114f466c6fdSAl Viro };
1115f466c6fdSAl Viro 
1116f466c6fdSAl Viro /* Our function for comparing keys can compare keys of different
1117f466c6fdSAl Viro    lengths.  It takes as a parameter the length of the keys it is to
1118f466c6fdSAl Viro    compare.  These defines are used in determining what is to be passed
1119f466c6fdSAl Viro    to it as that parameter. */
1120f466c6fdSAl Viro #define REISERFS_FULL_KEY_LEN     4
1121f466c6fdSAl Viro #define REISERFS_SHORT_KEY_LEN    2
1122f466c6fdSAl Viro 
1123f466c6fdSAl Viro /* The result of the key compare */
1124f466c6fdSAl Viro #define FIRST_GREATER 1
1125f466c6fdSAl Viro #define SECOND_GREATER -1
1126f466c6fdSAl Viro #define KEYS_IDENTICAL 0
1127f466c6fdSAl Viro #define KEY_FOUND 1
1128f466c6fdSAl Viro #define KEY_NOT_FOUND 0
1129f466c6fdSAl Viro 
1130f466c6fdSAl Viro #define KEY_SIZE (sizeof(struct reiserfs_key))
1131f466c6fdSAl Viro #define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32))
1132f466c6fdSAl Viro 
1133f466c6fdSAl Viro /* return values for search_by_key and clones */
1134f466c6fdSAl Viro #define ITEM_FOUND 1
1135f466c6fdSAl Viro #define ITEM_NOT_FOUND 0
1136f466c6fdSAl Viro #define ENTRY_FOUND 1
1137f466c6fdSAl Viro #define ENTRY_NOT_FOUND 0
1138f466c6fdSAl Viro #define DIRECTORY_NOT_FOUND -1
1139f466c6fdSAl Viro #define REGULAR_FILE_FOUND -2
1140f466c6fdSAl Viro #define DIRECTORY_FOUND -3
1141f466c6fdSAl Viro #define BYTE_FOUND 1
1142f466c6fdSAl Viro #define BYTE_NOT_FOUND 0
1143f466c6fdSAl Viro #define FILE_NOT_FOUND -1
1144f466c6fdSAl Viro 
1145f466c6fdSAl Viro #define POSITION_FOUND 1
1146f466c6fdSAl Viro #define POSITION_NOT_FOUND 0
1147f466c6fdSAl Viro 
1148f466c6fdSAl Viro // return values for reiserfs_find_entry and search_by_entry_key
1149f466c6fdSAl Viro #define NAME_FOUND 1
1150f466c6fdSAl Viro #define NAME_NOT_FOUND 0
1151f466c6fdSAl Viro #define GOTO_PREVIOUS_ITEM 2
1152f466c6fdSAl Viro #define NAME_FOUND_INVISIBLE 3
1153f466c6fdSAl Viro 
1154f466c6fdSAl Viro /*  Everything in the filesystem is stored as a set of items.  The
1155f466c6fdSAl Viro     item head contains the key of the item, its free space (for
1156f466c6fdSAl Viro     indirect items) and specifies the location of the item itself
1157f466c6fdSAl Viro     within the block.  */
1158f466c6fdSAl Viro 
1159f466c6fdSAl Viro struct item_head {
1160f466c6fdSAl Viro 	/* Everything in the tree is found by searching for it based on
1161f466c6fdSAl Viro 	 * its key.*/
1162f466c6fdSAl Viro 	struct reiserfs_key ih_key;
1163f466c6fdSAl Viro 	union {
1164f466c6fdSAl Viro 		/* The free space in the last unformatted node of an
1165f466c6fdSAl Viro 		   indirect item if this is an indirect item.  This
1166f466c6fdSAl Viro 		   equals 0xFFFF iff this is a direct item or stat data
1167f466c6fdSAl Viro 		   item. Note that the key, not this field, is used to
1168f466c6fdSAl Viro 		   determine the item type, and thus which field this
1169f466c6fdSAl Viro 		   union contains. */
1170f466c6fdSAl Viro 		__le16 ih_free_space_reserved;
1171f466c6fdSAl Viro 		/* Iff this is a directory item, this field equals the
1172f466c6fdSAl Viro 		   number of directory entries in the directory item. */
1173f466c6fdSAl Viro 		__le16 ih_entry_count;
1174f466c6fdSAl Viro 	} __attribute__ ((__packed__)) u;
1175f466c6fdSAl Viro 	__le16 ih_item_len;	/* total size of the item body */
1176f466c6fdSAl Viro 	__le16 ih_item_location;	/* an offset to the item body
1177f466c6fdSAl Viro 					 * within the block */
1178f466c6fdSAl Viro 	__le16 ih_version;	/* 0 for all old items, 2 for new
1179f466c6fdSAl Viro 				   ones. Highest bit is set by fsck
1180f466c6fdSAl Viro 				   temporary, cleaned after all
1181f466c6fdSAl Viro 				   done */
1182f466c6fdSAl Viro } __attribute__ ((__packed__));
1183f466c6fdSAl Viro /* size of item header     */
1184f466c6fdSAl Viro #define IH_SIZE (sizeof(struct item_head))
1185f466c6fdSAl Viro 
1186f466c6fdSAl Viro #define ih_free_space(ih)            le16_to_cpu((ih)->u.ih_free_space_reserved)
1187f466c6fdSAl Viro #define ih_version(ih)               le16_to_cpu((ih)->ih_version)
1188f466c6fdSAl Viro #define ih_entry_count(ih)           le16_to_cpu((ih)->u.ih_entry_count)
1189f466c6fdSAl Viro #define ih_location(ih)              le16_to_cpu((ih)->ih_item_location)
1190f466c6fdSAl Viro #define ih_item_len(ih)              le16_to_cpu((ih)->ih_item_len)
1191f466c6fdSAl Viro 
1192f466c6fdSAl Viro #define put_ih_free_space(ih, val)   do { (ih)->u.ih_free_space_reserved = cpu_to_le16(val); } while(0)
1193f466c6fdSAl Viro #define put_ih_version(ih, val)      do { (ih)->ih_version = cpu_to_le16(val); } while (0)
1194f466c6fdSAl Viro #define put_ih_entry_count(ih, val)  do { (ih)->u.ih_entry_count = cpu_to_le16(val); } while (0)
1195f466c6fdSAl Viro #define put_ih_location(ih, val)     do { (ih)->ih_item_location = cpu_to_le16(val); } while (0)
1196f466c6fdSAl Viro #define put_ih_item_len(ih, val)     do { (ih)->ih_item_len = cpu_to_le16(val); } while (0)
1197f466c6fdSAl Viro 
1198f466c6fdSAl Viro #define unreachable_item(ih) (ih_version(ih) & (1 << 15))
1199f466c6fdSAl Viro 
1200f466c6fdSAl Viro #define get_ih_free_space(ih) (ih_version (ih) == KEY_FORMAT_3_6 ? 0 : ih_free_space (ih))
1201f466c6fdSAl Viro #define set_ih_free_space(ih,val) put_ih_free_space((ih), ((ih_version(ih) == KEY_FORMAT_3_6) ? 0 : (val)))
1202f466c6fdSAl Viro 
1203f466c6fdSAl Viro /* these operate on indirect items, where you've got an array of ints
1204f466c6fdSAl Viro ** at a possibly unaligned location.  These are a noop on ia32
1205f466c6fdSAl Viro **
1206f466c6fdSAl Viro ** p is the array of __u32, i is the index into the array, v is the value
1207f466c6fdSAl Viro ** to store there.
1208f466c6fdSAl Viro */
1209f466c6fdSAl Viro #define get_block_num(p, i) get_unaligned_le32((p) + (i))
1210f466c6fdSAl Viro #define put_block_num(p, i, v) put_unaligned_le32((v), (p) + (i))
1211f466c6fdSAl Viro 
1212f466c6fdSAl Viro //
1213f466c6fdSAl Viro // in old version uniqueness field shows key type
1214f466c6fdSAl Viro //
1215f466c6fdSAl Viro #define V1_SD_UNIQUENESS 0
1216f466c6fdSAl Viro #define V1_INDIRECT_UNIQUENESS 0xfffffffe
1217f466c6fdSAl Viro #define V1_DIRECT_UNIQUENESS 0xffffffff
1218f466c6fdSAl Viro #define V1_DIRENTRY_UNIQUENESS 500
1219f466c6fdSAl Viro #define V1_ANY_UNIQUENESS 555	// FIXME: comment is required
1220f466c6fdSAl Viro 
1221f466c6fdSAl Viro //
1222f466c6fdSAl Viro // here are conversion routines
1223f466c6fdSAl Viro //
1224f466c6fdSAl Viro static inline int uniqueness2type(__u32 uniqueness) CONSTF;
1225f466c6fdSAl Viro static inline int uniqueness2type(__u32 uniqueness)
1226f466c6fdSAl Viro {
1227f466c6fdSAl Viro 	switch ((int)uniqueness) {
1228f466c6fdSAl Viro 	case V1_SD_UNIQUENESS:
1229f466c6fdSAl Viro 		return TYPE_STAT_DATA;
1230f466c6fdSAl Viro 	case V1_INDIRECT_UNIQUENESS:
1231f466c6fdSAl Viro 		return TYPE_INDIRECT;
1232f466c6fdSAl Viro 	case V1_DIRECT_UNIQUENESS:
1233f466c6fdSAl Viro 		return TYPE_DIRECT;
1234f466c6fdSAl Viro 	case V1_DIRENTRY_UNIQUENESS:
1235f466c6fdSAl Viro 		return TYPE_DIRENTRY;
1236f466c6fdSAl Viro 	case V1_ANY_UNIQUENESS:
1237f466c6fdSAl Viro 	default:
1238f466c6fdSAl Viro 		return TYPE_ANY;
1239f466c6fdSAl Viro 	}
1240f466c6fdSAl Viro }
1241f466c6fdSAl Viro 
1242f466c6fdSAl Viro static inline __u32 type2uniqueness(int type) CONSTF;
1243f466c6fdSAl Viro static inline __u32 type2uniqueness(int type)
1244f466c6fdSAl Viro {
1245f466c6fdSAl Viro 	switch (type) {
1246f466c6fdSAl Viro 	case TYPE_STAT_DATA:
1247f466c6fdSAl Viro 		return V1_SD_UNIQUENESS;
1248f466c6fdSAl Viro 	case TYPE_INDIRECT:
1249f466c6fdSAl Viro 		return V1_INDIRECT_UNIQUENESS;
1250f466c6fdSAl Viro 	case TYPE_DIRECT:
1251f466c6fdSAl Viro 		return V1_DIRECT_UNIQUENESS;
1252f466c6fdSAl Viro 	case TYPE_DIRENTRY:
1253f466c6fdSAl Viro 		return V1_DIRENTRY_UNIQUENESS;
1254f466c6fdSAl Viro 	case TYPE_ANY:
1255f466c6fdSAl Viro 	default:
1256f466c6fdSAl Viro 		return V1_ANY_UNIQUENESS;
1257f466c6fdSAl Viro 	}
1258f466c6fdSAl Viro }
1259f466c6fdSAl Viro 
1260f466c6fdSAl Viro //
1261f466c6fdSAl Viro // key is pointer to on disk key which is stored in le, result is cpu,
1262f466c6fdSAl Viro // there is no way to get version of object from key, so, provide
1263f466c6fdSAl Viro // version to these defines
1264f466c6fdSAl Viro //
1265f466c6fdSAl Viro static inline loff_t le_key_k_offset(int version,
1266f466c6fdSAl Viro 				     const struct reiserfs_key *key)
1267f466c6fdSAl Viro {
1268f466c6fdSAl Viro 	return (version == KEY_FORMAT_3_5) ?
1269f466c6fdSAl Viro 	    le32_to_cpu(key->u.k_offset_v1.k_offset) :
1270f466c6fdSAl Viro 	    offset_v2_k_offset(&(key->u.k_offset_v2));
1271f466c6fdSAl Viro }
1272f466c6fdSAl Viro 
1273f466c6fdSAl Viro static inline loff_t le_ih_k_offset(const struct item_head *ih)
1274f466c6fdSAl Viro {
1275f466c6fdSAl Viro 	return le_key_k_offset(ih_version(ih), &(ih->ih_key));
1276f466c6fdSAl Viro }
1277f466c6fdSAl Viro 
1278f466c6fdSAl Viro static inline loff_t le_key_k_type(int version, const struct reiserfs_key *key)
1279f466c6fdSAl Viro {
12804cf5f7adSJeff Mahoney 	if (version == KEY_FORMAT_3_5) {
12814cf5f7adSJeff Mahoney 		loff_t val = le32_to_cpu(key->u.k_offset_v1.k_uniqueness);
12824cf5f7adSJeff Mahoney 		return uniqueness2type(val);
12834cf5f7adSJeff Mahoney 	} else
12844cf5f7adSJeff Mahoney 		return offset_v2_k_type(&(key->u.k_offset_v2));
1285f466c6fdSAl Viro }
1286f466c6fdSAl Viro 
1287f466c6fdSAl Viro static inline loff_t le_ih_k_type(const struct item_head *ih)
1288f466c6fdSAl Viro {
1289f466c6fdSAl Viro 	return le_key_k_type(ih_version(ih), &(ih->ih_key));
1290f466c6fdSAl Viro }
1291f466c6fdSAl Viro 
1292f466c6fdSAl Viro static inline void set_le_key_k_offset(int version, struct reiserfs_key *key,
1293f466c6fdSAl Viro 				       loff_t offset)
1294f466c6fdSAl Viro {
12954cf5f7adSJeff Mahoney 	if (version == KEY_FORMAT_3_5)
12964cf5f7adSJeff Mahoney 		key->u.k_offset_v1.k_offset = cpu_to_le32(offset);
12974cf5f7adSJeff Mahoney 	else
12984cf5f7adSJeff Mahoney 		set_offset_v2_k_offset(&key->u.k_offset_v2, offset);
12994cf5f7adSJeff Mahoney }
13004cf5f7adSJeff Mahoney 
13014cf5f7adSJeff Mahoney static inline void add_le_key_k_offset(int version, struct reiserfs_key *key,
13024cf5f7adSJeff Mahoney 				       loff_t offset)
13034cf5f7adSJeff Mahoney {
13044cf5f7adSJeff Mahoney 	set_le_key_k_offset(version, key,
13054cf5f7adSJeff Mahoney 			    le_key_k_offset(version, key) + offset);
13064cf5f7adSJeff Mahoney }
13074cf5f7adSJeff Mahoney 
13084cf5f7adSJeff Mahoney static inline void add_le_ih_k_offset(struct item_head *ih, loff_t offset)
13094cf5f7adSJeff Mahoney {
13104cf5f7adSJeff Mahoney 	add_le_key_k_offset(ih_version(ih), &(ih->ih_key), offset);
1311f466c6fdSAl Viro }
1312f466c6fdSAl Viro 
1313f466c6fdSAl Viro static inline void set_le_ih_k_offset(struct item_head *ih, loff_t offset)
1314f466c6fdSAl Viro {
1315f466c6fdSAl Viro 	set_le_key_k_offset(ih_version(ih), &(ih->ih_key), offset);
1316f466c6fdSAl Viro }
1317f466c6fdSAl Viro 
1318f466c6fdSAl Viro static inline void set_le_key_k_type(int version, struct reiserfs_key *key,
1319f466c6fdSAl Viro 				     int type)
1320f466c6fdSAl Viro {
13214cf5f7adSJeff Mahoney 	if (version == KEY_FORMAT_3_5) {
13224cf5f7adSJeff Mahoney 		type = type2uniqueness(type);
13234cf5f7adSJeff Mahoney 		key->u.k_offset_v1.k_uniqueness = cpu_to_le32(type);
13244cf5f7adSJeff Mahoney 	} else
13254cf5f7adSJeff Mahoney 	       set_offset_v2_k_type(&key->u.k_offset_v2, type);
1326f466c6fdSAl Viro }
1327f466c6fdSAl Viro 
1328f466c6fdSAl Viro static inline void set_le_ih_k_type(struct item_head *ih, int type)
1329f466c6fdSAl Viro {
1330f466c6fdSAl Viro 	set_le_key_k_type(ih_version(ih), &(ih->ih_key), type);
1331f466c6fdSAl Viro }
1332f466c6fdSAl Viro 
1333f466c6fdSAl Viro static inline int is_direntry_le_key(int version, struct reiserfs_key *key)
1334f466c6fdSAl Viro {
1335f466c6fdSAl Viro 	return le_key_k_type(version, key) == TYPE_DIRENTRY;
1336f466c6fdSAl Viro }
1337f466c6fdSAl Viro 
1338f466c6fdSAl Viro static inline int is_direct_le_key(int version, struct reiserfs_key *key)
1339f466c6fdSAl Viro {
1340f466c6fdSAl Viro 	return le_key_k_type(version, key) == TYPE_DIRECT;
1341f466c6fdSAl Viro }
1342f466c6fdSAl Viro 
1343f466c6fdSAl Viro static inline int is_indirect_le_key(int version, struct reiserfs_key *key)
1344f466c6fdSAl Viro {
1345f466c6fdSAl Viro 	return le_key_k_type(version, key) == TYPE_INDIRECT;
1346f466c6fdSAl Viro }
1347f466c6fdSAl Viro 
1348f466c6fdSAl Viro static inline int is_statdata_le_key(int version, struct reiserfs_key *key)
1349f466c6fdSAl Viro {
1350f466c6fdSAl Viro 	return le_key_k_type(version, key) == TYPE_STAT_DATA;
1351f466c6fdSAl Viro }
1352f466c6fdSAl Viro 
1353f466c6fdSAl Viro //
1354f466c6fdSAl Viro // item header has version.
1355f466c6fdSAl Viro //
1356f466c6fdSAl Viro static inline int is_direntry_le_ih(struct item_head *ih)
1357f466c6fdSAl Viro {
1358f466c6fdSAl Viro 	return is_direntry_le_key(ih_version(ih), &ih->ih_key);
1359f466c6fdSAl Viro }
1360f466c6fdSAl Viro 
1361f466c6fdSAl Viro static inline int is_direct_le_ih(struct item_head *ih)
1362f466c6fdSAl Viro {
1363f466c6fdSAl Viro 	return is_direct_le_key(ih_version(ih), &ih->ih_key);
1364f466c6fdSAl Viro }
1365f466c6fdSAl Viro 
1366f466c6fdSAl Viro static inline int is_indirect_le_ih(struct item_head *ih)
1367f466c6fdSAl Viro {
1368f466c6fdSAl Viro 	return is_indirect_le_key(ih_version(ih), &ih->ih_key);
1369f466c6fdSAl Viro }
1370f466c6fdSAl Viro 
1371f466c6fdSAl Viro static inline int is_statdata_le_ih(struct item_head *ih)
1372f466c6fdSAl Viro {
1373f466c6fdSAl Viro 	return is_statdata_le_key(ih_version(ih), &ih->ih_key);
1374f466c6fdSAl Viro }
1375f466c6fdSAl Viro 
1376f466c6fdSAl Viro //
1377f466c6fdSAl Viro // key is pointer to cpu key, result is cpu
1378f466c6fdSAl Viro //
1379f466c6fdSAl Viro static inline loff_t cpu_key_k_offset(const struct cpu_key *key)
1380f466c6fdSAl Viro {
1381f466c6fdSAl Viro 	return key->on_disk_key.k_offset;
1382f466c6fdSAl Viro }
1383f466c6fdSAl Viro 
1384f466c6fdSAl Viro static inline loff_t cpu_key_k_type(const struct cpu_key *key)
1385f466c6fdSAl Viro {
1386f466c6fdSAl Viro 	return key->on_disk_key.k_type;
1387f466c6fdSAl Viro }
1388f466c6fdSAl Viro 
1389f466c6fdSAl Viro static inline void set_cpu_key_k_offset(struct cpu_key *key, loff_t offset)
1390f466c6fdSAl Viro {
1391f466c6fdSAl Viro 	key->on_disk_key.k_offset = offset;
1392f466c6fdSAl Viro }
1393f466c6fdSAl Viro 
1394f466c6fdSAl Viro static inline void set_cpu_key_k_type(struct cpu_key *key, int type)
1395f466c6fdSAl Viro {
1396f466c6fdSAl Viro 	key->on_disk_key.k_type = type;
1397f466c6fdSAl Viro }
1398f466c6fdSAl Viro 
1399f466c6fdSAl Viro static inline void cpu_key_k_offset_dec(struct cpu_key *key)
1400f466c6fdSAl Viro {
1401f466c6fdSAl Viro 	key->on_disk_key.k_offset--;
1402f466c6fdSAl Viro }
1403f466c6fdSAl Viro 
1404f466c6fdSAl Viro #define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY)
1405f466c6fdSAl Viro #define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT)
1406f466c6fdSAl Viro #define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT)
1407f466c6fdSAl Viro #define is_statdata_cpu_key(key) (cpu_key_k_type (key) == TYPE_STAT_DATA)
1408f466c6fdSAl Viro 
1409f466c6fdSAl Viro /* are these used ? */
1410f466c6fdSAl Viro #define is_direntry_cpu_ih(ih) (is_direntry_cpu_key (&((ih)->ih_key)))
1411f466c6fdSAl Viro #define is_direct_cpu_ih(ih) (is_direct_cpu_key (&((ih)->ih_key)))
1412f466c6fdSAl Viro #define is_indirect_cpu_ih(ih) (is_indirect_cpu_key (&((ih)->ih_key)))
1413f466c6fdSAl Viro #define is_statdata_cpu_ih(ih) (is_statdata_cpu_key (&((ih)->ih_key)))
1414f466c6fdSAl Viro 
1415f466c6fdSAl Viro #define I_K_KEY_IN_ITEM(ih, key, n_blocksize) \
1416f466c6fdSAl Viro     (!COMP_SHORT_KEYS(ih, key) && \
1417f466c6fdSAl Viro 	  I_OFF_BYTE_IN_ITEM(ih, k_offset(key), n_blocksize))
1418f466c6fdSAl Viro 
1419f466c6fdSAl Viro /* maximal length of item */
1420f466c6fdSAl Viro #define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)
1421f466c6fdSAl Viro #define MIN_ITEM_LEN 1
1422f466c6fdSAl Viro 
1423f466c6fdSAl Viro /* object identifier for root dir */
1424f466c6fdSAl Viro #define REISERFS_ROOT_OBJECTID 2
1425f466c6fdSAl Viro #define REISERFS_ROOT_PARENT_OBJECTID 1
1426f466c6fdSAl Viro 
1427f466c6fdSAl Viro extern struct reiserfs_key root_key;
1428f466c6fdSAl Viro 
1429f466c6fdSAl Viro /*
1430f466c6fdSAl Viro  * Picture represents a leaf of the S+tree
1431f466c6fdSAl Viro  *  ______________________________________________________
1432f466c6fdSAl Viro  * |      |  Array of     |                   |           |
1433f466c6fdSAl Viro  * |Block |  Object-Item  |      F r e e      |  Objects- |
1434f466c6fdSAl Viro  * | head |  Headers      |     S p a c e     |   Items   |
1435f466c6fdSAl Viro  * |______|_______________|___________________|___________|
1436f466c6fdSAl Viro  */
1437f466c6fdSAl Viro 
1438f466c6fdSAl Viro /* Header of a disk block.  More precisely, header of a formatted leaf
1439f466c6fdSAl Viro    or internal node, and not the header of an unformatted node. */
1440f466c6fdSAl Viro struct block_head {
1441f466c6fdSAl Viro 	__le16 blk_level;	/* Level of a block in the tree. */
1442f466c6fdSAl Viro 	__le16 blk_nr_item;	/* Number of keys/items in a block. */
1443f466c6fdSAl Viro 	__le16 blk_free_space;	/* Block free space in bytes. */
1444f466c6fdSAl Viro 	__le16 blk_reserved;
1445f466c6fdSAl Viro 	/* dump this in v4/planA */
1446f466c6fdSAl Viro 	struct reiserfs_key blk_right_delim_key;	/* kept only for compatibility */
1447f466c6fdSAl Viro };
1448f466c6fdSAl Viro 
1449f466c6fdSAl Viro #define BLKH_SIZE                     (sizeof(struct block_head))
1450f466c6fdSAl Viro #define blkh_level(p_blkh)            (le16_to_cpu((p_blkh)->blk_level))
1451f466c6fdSAl Viro #define blkh_nr_item(p_blkh)          (le16_to_cpu((p_blkh)->blk_nr_item))
1452f466c6fdSAl Viro #define blkh_free_space(p_blkh)       (le16_to_cpu((p_blkh)->blk_free_space))
1453f466c6fdSAl Viro #define blkh_reserved(p_blkh)         (le16_to_cpu((p_blkh)->blk_reserved))
1454f466c6fdSAl Viro #define set_blkh_level(p_blkh,val)    ((p_blkh)->blk_level = cpu_to_le16(val))
1455f466c6fdSAl Viro #define set_blkh_nr_item(p_blkh,val)  ((p_blkh)->blk_nr_item = cpu_to_le16(val))
1456f466c6fdSAl Viro #define set_blkh_free_space(p_blkh,val) ((p_blkh)->blk_free_space = cpu_to_le16(val))
1457f466c6fdSAl Viro #define set_blkh_reserved(p_blkh,val) ((p_blkh)->blk_reserved = cpu_to_le16(val))
1458f466c6fdSAl Viro #define blkh_right_delim_key(p_blkh)  ((p_blkh)->blk_right_delim_key)
1459f466c6fdSAl Viro #define set_blkh_right_delim_key(p_blkh,val)  ((p_blkh)->blk_right_delim_key = val)
1460f466c6fdSAl Viro 
1461f466c6fdSAl Viro /*
1462f466c6fdSAl Viro  * values for blk_level field of the struct block_head
1463f466c6fdSAl Viro  */
1464f466c6fdSAl Viro 
1465f466c6fdSAl Viro #define FREE_LEVEL 0		/* when node gets removed from the tree its
1466f466c6fdSAl Viro 				   blk_level is set to FREE_LEVEL. It is then
1467f466c6fdSAl Viro 				   used to see whether the node is still in the
1468f466c6fdSAl Viro 				   tree */
1469f466c6fdSAl Viro 
1470f466c6fdSAl Viro #define DISK_LEAF_NODE_LEVEL  1	/* Leaf node level. */
1471f466c6fdSAl Viro 
1472f466c6fdSAl Viro /* Given the buffer head of a formatted node, resolve to the block head of that node. */
1473f466c6fdSAl Viro #define B_BLK_HEAD(bh)			((struct block_head *)((bh)->b_data))
1474f466c6fdSAl Viro /* Number of items that are in buffer. */
1475f466c6fdSAl Viro #define B_NR_ITEMS(bh)			(blkh_nr_item(B_BLK_HEAD(bh)))
1476f466c6fdSAl Viro #define B_LEVEL(bh)			(blkh_level(B_BLK_HEAD(bh)))
1477f466c6fdSAl Viro #define B_FREE_SPACE(bh)		(blkh_free_space(B_BLK_HEAD(bh)))
1478f466c6fdSAl Viro 
1479f466c6fdSAl Viro #define PUT_B_NR_ITEMS(bh, val)		do { set_blkh_nr_item(B_BLK_HEAD(bh), val); } while (0)
1480f466c6fdSAl Viro #define PUT_B_LEVEL(bh, val)		do { set_blkh_level(B_BLK_HEAD(bh), val); } while (0)
1481f466c6fdSAl Viro #define PUT_B_FREE_SPACE(bh, val)	do { set_blkh_free_space(B_BLK_HEAD(bh), val); } while (0)
1482f466c6fdSAl Viro 
1483f466c6fdSAl Viro /* Get right delimiting key. -- little endian */
1484f466c6fdSAl Viro #define B_PRIGHT_DELIM_KEY(bh)		(&(blk_right_delim_key(B_BLK_HEAD(bh))))
1485f466c6fdSAl Viro 
1486f466c6fdSAl Viro /* Does the buffer contain a disk leaf. */
1487f466c6fdSAl Viro #define B_IS_ITEMS_LEVEL(bh)		(B_LEVEL(bh) == DISK_LEAF_NODE_LEVEL)
1488f466c6fdSAl Viro 
1489f466c6fdSAl Viro /* Does the buffer contain a disk internal node */
1490f466c6fdSAl Viro #define B_IS_KEYS_LEVEL(bh)      (B_LEVEL(bh) > DISK_LEAF_NODE_LEVEL \
1491f466c6fdSAl Viro 					    && B_LEVEL(bh) <= MAX_HEIGHT)
1492f466c6fdSAl Viro 
1493f466c6fdSAl Viro /***************************************************************************/
1494f466c6fdSAl Viro /*                             STAT DATA                                   */
1495f466c6fdSAl Viro /***************************************************************************/
1496f466c6fdSAl Viro 
1497f466c6fdSAl Viro //
1498f466c6fdSAl Viro // old stat data is 32 bytes long. We are going to distinguish new one by
1499f466c6fdSAl Viro // different size
1500f466c6fdSAl Viro //
1501f466c6fdSAl Viro struct stat_data_v1 {
1502f466c6fdSAl Viro 	__le16 sd_mode;		/* file type, permissions */
1503f466c6fdSAl Viro 	__le16 sd_nlink;	/* number of hard links */
1504f466c6fdSAl Viro 	__le16 sd_uid;		/* owner */
1505f466c6fdSAl Viro 	__le16 sd_gid;		/* group */
1506f466c6fdSAl Viro 	__le32 sd_size;		/* file size */
1507f466c6fdSAl Viro 	__le32 sd_atime;	/* time of last access */
1508f466c6fdSAl Viro 	__le32 sd_mtime;	/* time file was last modified  */
1509f466c6fdSAl Viro 	__le32 sd_ctime;	/* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */
1510f466c6fdSAl Viro 	union {
1511f466c6fdSAl Viro 		__le32 sd_rdev;
1512f466c6fdSAl Viro 		__le32 sd_blocks;	/* number of blocks file uses */
1513f466c6fdSAl Viro 	} __attribute__ ((__packed__)) u;
1514f466c6fdSAl Viro 	__le32 sd_first_direct_byte;	/* first byte of file which is stored
1515f466c6fdSAl Viro 					   in a direct item: except that if it
1516f466c6fdSAl Viro 					   equals 1 it is a symlink and if it
1517f466c6fdSAl Viro 					   equals ~(__u32)0 there is no
1518f466c6fdSAl Viro 					   direct item.  The existence of this
1519f466c6fdSAl Viro 					   field really grates on me. Let's
1520f466c6fdSAl Viro 					   replace it with a macro based on
1521f466c6fdSAl Viro 					   sd_size and our tail suppression
1522f466c6fdSAl Viro 					   policy.  Someday.  -Hans */
1523f466c6fdSAl Viro } __attribute__ ((__packed__));
1524f466c6fdSAl Viro 
1525f466c6fdSAl Viro #define SD_V1_SIZE              (sizeof(struct stat_data_v1))
1526f466c6fdSAl Viro #define stat_data_v1(ih)        (ih_version (ih) == KEY_FORMAT_3_5)
1527f466c6fdSAl Viro #define sd_v1_mode(sdp)         (le16_to_cpu((sdp)->sd_mode))
1528f466c6fdSAl Viro #define set_sd_v1_mode(sdp,v)   ((sdp)->sd_mode = cpu_to_le16(v))
1529f466c6fdSAl Viro #define sd_v1_nlink(sdp)        (le16_to_cpu((sdp)->sd_nlink))
1530f466c6fdSAl Viro #define set_sd_v1_nlink(sdp,v)  ((sdp)->sd_nlink = cpu_to_le16(v))
1531f466c6fdSAl Viro #define sd_v1_uid(sdp)          (le16_to_cpu((sdp)->sd_uid))
1532f466c6fdSAl Viro #define set_sd_v1_uid(sdp,v)    ((sdp)->sd_uid = cpu_to_le16(v))
1533f466c6fdSAl Viro #define sd_v1_gid(sdp)          (le16_to_cpu((sdp)->sd_gid))
1534f466c6fdSAl Viro #define set_sd_v1_gid(sdp,v)    ((sdp)->sd_gid = cpu_to_le16(v))
1535f466c6fdSAl Viro #define sd_v1_size(sdp)         (le32_to_cpu((sdp)->sd_size))
1536f466c6fdSAl Viro #define set_sd_v1_size(sdp,v)   ((sdp)->sd_size = cpu_to_le32(v))
1537f466c6fdSAl Viro #define sd_v1_atime(sdp)        (le32_to_cpu((sdp)->sd_atime))
1538f466c6fdSAl Viro #define set_sd_v1_atime(sdp,v)  ((sdp)->sd_atime = cpu_to_le32(v))
1539f466c6fdSAl Viro #define sd_v1_mtime(sdp)        (le32_to_cpu((sdp)->sd_mtime))
1540f466c6fdSAl Viro #define set_sd_v1_mtime(sdp,v)  ((sdp)->sd_mtime = cpu_to_le32(v))
1541f466c6fdSAl Viro #define sd_v1_ctime(sdp)        (le32_to_cpu((sdp)->sd_ctime))
1542f466c6fdSAl Viro #define set_sd_v1_ctime(sdp,v)  ((sdp)->sd_ctime = cpu_to_le32(v))
1543f466c6fdSAl Viro #define sd_v1_rdev(sdp)         (le32_to_cpu((sdp)->u.sd_rdev))
1544f466c6fdSAl Viro #define set_sd_v1_rdev(sdp,v)   ((sdp)->u.sd_rdev = cpu_to_le32(v))
1545f466c6fdSAl Viro #define sd_v1_blocks(sdp)       (le32_to_cpu((sdp)->u.sd_blocks))
1546f466c6fdSAl Viro #define set_sd_v1_blocks(sdp,v) ((sdp)->u.sd_blocks = cpu_to_le32(v))
1547f466c6fdSAl Viro #define sd_v1_first_direct_byte(sdp) \
1548f466c6fdSAl Viro                                 (le32_to_cpu((sdp)->sd_first_direct_byte))
1549f466c6fdSAl Viro #define set_sd_v1_first_direct_byte(sdp,v) \
1550f466c6fdSAl Viro                                 ((sdp)->sd_first_direct_byte = cpu_to_le32(v))
1551f466c6fdSAl Viro 
1552f466c6fdSAl Viro /* inode flags stored in sd_attrs (nee sd_reserved) */
1553f466c6fdSAl Viro 
1554f466c6fdSAl Viro /* we want common flags to have the same values as in ext2,
1555f466c6fdSAl Viro    so chattr(1) will work without problems */
1556f466c6fdSAl Viro #define REISERFS_IMMUTABLE_FL FS_IMMUTABLE_FL
1557f466c6fdSAl Viro #define REISERFS_APPEND_FL    FS_APPEND_FL
1558f466c6fdSAl Viro #define REISERFS_SYNC_FL      FS_SYNC_FL
1559f466c6fdSAl Viro #define REISERFS_NOATIME_FL   FS_NOATIME_FL
1560f466c6fdSAl Viro #define REISERFS_NODUMP_FL    FS_NODUMP_FL
1561f466c6fdSAl Viro #define REISERFS_SECRM_FL     FS_SECRM_FL
1562f466c6fdSAl Viro #define REISERFS_UNRM_FL      FS_UNRM_FL
1563f466c6fdSAl Viro #define REISERFS_COMPR_FL     FS_COMPR_FL
1564f466c6fdSAl Viro #define REISERFS_NOTAIL_FL    FS_NOTAIL_FL
1565f466c6fdSAl Viro 
1566f466c6fdSAl Viro /* persistent flags that file inherits from the parent directory */
1567f466c6fdSAl Viro #define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FL |	\
1568f466c6fdSAl Viro 				REISERFS_SYNC_FL |	\
1569f466c6fdSAl Viro 				REISERFS_NOATIME_FL |	\
1570f466c6fdSAl Viro 				REISERFS_NODUMP_FL |	\
1571f466c6fdSAl Viro 				REISERFS_SECRM_FL |	\
1572f466c6fdSAl Viro 				REISERFS_COMPR_FL |	\
1573f466c6fdSAl Viro 				REISERFS_NOTAIL_FL )
1574f466c6fdSAl Viro 
1575f466c6fdSAl Viro /* Stat Data on disk (reiserfs version of UFS disk inode minus the
1576f466c6fdSAl Viro    address blocks) */
1577f466c6fdSAl Viro struct stat_data {
1578f466c6fdSAl Viro 	__le16 sd_mode;		/* file type, permissions */
1579f466c6fdSAl Viro 	__le16 sd_attrs;	/* persistent inode flags */
1580f466c6fdSAl Viro 	__le32 sd_nlink;	/* number of hard links */
1581f466c6fdSAl Viro 	__le64 sd_size;		/* file size */
1582f466c6fdSAl Viro 	__le32 sd_uid;		/* owner */
1583f466c6fdSAl Viro 	__le32 sd_gid;		/* group */
1584f466c6fdSAl Viro 	__le32 sd_atime;	/* time of last access */
1585f466c6fdSAl Viro 	__le32 sd_mtime;	/* time file was last modified  */
1586f466c6fdSAl Viro 	__le32 sd_ctime;	/* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */
1587f466c6fdSAl Viro 	__le32 sd_blocks;
1588f466c6fdSAl Viro 	union {
1589f466c6fdSAl Viro 		__le32 sd_rdev;
1590f466c6fdSAl Viro 		__le32 sd_generation;
1591f466c6fdSAl Viro 		//__le32 sd_first_direct_byte;
1592f466c6fdSAl Viro 		/* first byte of file which is stored in a
1593f466c6fdSAl Viro 		   direct item: except that if it equals 1
1594f466c6fdSAl Viro 		   it is a symlink and if it equals
1595f466c6fdSAl Viro 		   ~(__u32)0 there is no direct item.  The
1596f466c6fdSAl Viro 		   existence of this field really grates
1597f466c6fdSAl Viro 		   on me. Let's replace it with a macro
1598f466c6fdSAl Viro 		   based on sd_size and our tail
1599f466c6fdSAl Viro 		   suppression policy? */
1600f466c6fdSAl Viro 	} __attribute__ ((__packed__)) u;
1601f466c6fdSAl Viro } __attribute__ ((__packed__));
1602f466c6fdSAl Viro //
1603f466c6fdSAl Viro // this is 44 bytes long
1604f466c6fdSAl Viro //
1605f466c6fdSAl Viro #define SD_SIZE (sizeof(struct stat_data))
1606f466c6fdSAl Viro #define SD_V2_SIZE              SD_SIZE
1607f466c6fdSAl Viro #define stat_data_v2(ih)        (ih_version (ih) == KEY_FORMAT_3_6)
1608f466c6fdSAl Viro #define sd_v2_mode(sdp)         (le16_to_cpu((sdp)->sd_mode))
1609f466c6fdSAl Viro #define set_sd_v2_mode(sdp,v)   ((sdp)->sd_mode = cpu_to_le16(v))
1610f466c6fdSAl Viro /* sd_reserved */
1611f466c6fdSAl Viro /* set_sd_reserved */
1612f466c6fdSAl Viro #define sd_v2_nlink(sdp)        (le32_to_cpu((sdp)->sd_nlink))
1613f466c6fdSAl Viro #define set_sd_v2_nlink(sdp,v)  ((sdp)->sd_nlink = cpu_to_le32(v))
1614f466c6fdSAl Viro #define sd_v2_size(sdp)         (le64_to_cpu((sdp)->sd_size))
1615f466c6fdSAl Viro #define set_sd_v2_size(sdp,v)   ((sdp)->sd_size = cpu_to_le64(v))
1616f466c6fdSAl Viro #define sd_v2_uid(sdp)          (le32_to_cpu((sdp)->sd_uid))
1617f466c6fdSAl Viro #define set_sd_v2_uid(sdp,v)    ((sdp)->sd_uid = cpu_to_le32(v))
1618f466c6fdSAl Viro #define sd_v2_gid(sdp)          (le32_to_cpu((sdp)->sd_gid))
1619f466c6fdSAl Viro #define set_sd_v2_gid(sdp,v)    ((sdp)->sd_gid = cpu_to_le32(v))
1620f466c6fdSAl Viro #define sd_v2_atime(sdp)        (le32_to_cpu((sdp)->sd_atime))
1621f466c6fdSAl Viro #define set_sd_v2_atime(sdp,v)  ((sdp)->sd_atime = cpu_to_le32(v))
1622f466c6fdSAl Viro #define sd_v2_mtime(sdp)        (le32_to_cpu((sdp)->sd_mtime))
1623f466c6fdSAl Viro #define set_sd_v2_mtime(sdp,v)  ((sdp)->sd_mtime = cpu_to_le32(v))
1624f466c6fdSAl Viro #define sd_v2_ctime(sdp)        (le32_to_cpu((sdp)->sd_ctime))
1625f466c6fdSAl Viro #define set_sd_v2_ctime(sdp,v)  ((sdp)->sd_ctime = cpu_to_le32(v))
1626f466c6fdSAl Viro #define sd_v2_blocks(sdp)       (le32_to_cpu((sdp)->sd_blocks))
1627f466c6fdSAl Viro #define set_sd_v2_blocks(sdp,v) ((sdp)->sd_blocks = cpu_to_le32(v))
1628f466c6fdSAl Viro #define sd_v2_rdev(sdp)         (le32_to_cpu((sdp)->u.sd_rdev))
1629f466c6fdSAl Viro #define set_sd_v2_rdev(sdp,v)   ((sdp)->u.sd_rdev = cpu_to_le32(v))
1630f466c6fdSAl Viro #define sd_v2_generation(sdp)   (le32_to_cpu((sdp)->u.sd_generation))
1631f466c6fdSAl Viro #define set_sd_v2_generation(sdp,v) ((sdp)->u.sd_generation = cpu_to_le32(v))
1632f466c6fdSAl Viro #define sd_v2_attrs(sdp)         (le16_to_cpu((sdp)->sd_attrs))
1633f466c6fdSAl Viro #define set_sd_v2_attrs(sdp,v)   ((sdp)->sd_attrs = cpu_to_le16(v))
1634f466c6fdSAl Viro 
1635f466c6fdSAl Viro /***************************************************************************/
1636f466c6fdSAl Viro /*                      DIRECTORY STRUCTURE                                */
1637f466c6fdSAl Viro /***************************************************************************/
1638f466c6fdSAl Viro /*
1639f466c6fdSAl Viro    Picture represents the structure of directory items
1640f466c6fdSAl Viro    ________________________________________________
1641f466c6fdSAl Viro    |  Array of     |   |     |        |       |   |
1642f466c6fdSAl Viro    | directory     |N-1| N-2 | ....   |   1st |0th|
1643f466c6fdSAl Viro    | entry headers |   |     |        |       |   |
1644f466c6fdSAl Viro    |_______________|___|_____|________|_______|___|
1645f466c6fdSAl Viro                     <----   directory entries         ------>
1646f466c6fdSAl Viro 
1647f466c6fdSAl Viro  First directory item has k_offset component 1. We store "." and ".."
1648f466c6fdSAl Viro  in one item, always, we never split "." and ".." into differing
1649f466c6fdSAl Viro  items.  This makes, among other things, the code for removing
1650f466c6fdSAl Viro  directories simpler. */
1651f466c6fdSAl Viro #define SD_OFFSET  0
1652f466c6fdSAl Viro #define SD_UNIQUENESS 0
1653f466c6fdSAl Viro #define DOT_OFFSET 1
1654f466c6fdSAl Viro #define DOT_DOT_OFFSET 2
1655f466c6fdSAl Viro #define DIRENTRY_UNIQUENESS 500
1656f466c6fdSAl Viro 
1657f466c6fdSAl Viro /* */
1658f466c6fdSAl Viro #define FIRST_ITEM_OFFSET 1
1659f466c6fdSAl Viro 
1660f466c6fdSAl Viro /*
1661f466c6fdSAl Viro    Q: How to get key of object pointed to by entry from entry?
1662f466c6fdSAl Viro 
1663f466c6fdSAl Viro    A: Each directory entry has its header. This header has deh_dir_id and deh_objectid fields, those are key
1664f466c6fdSAl Viro       of object, entry points to */
1665f466c6fdSAl Viro 
1666f466c6fdSAl Viro /* NOT IMPLEMENTED:
1667f466c6fdSAl Viro    Directory will someday contain stat data of object */
1668f466c6fdSAl Viro 
1669f466c6fdSAl Viro struct reiserfs_de_head {
1670f466c6fdSAl Viro 	__le32 deh_offset;	/* third component of the directory entry key */
1671f466c6fdSAl Viro 	__le32 deh_dir_id;	/* objectid of the parent directory of the object, that is referenced
1672f466c6fdSAl Viro 				   by directory entry */
1673f466c6fdSAl Viro 	__le32 deh_objectid;	/* objectid of the object, that is referenced by directory entry */
1674f466c6fdSAl Viro 	__le16 deh_location;	/* offset of name in the whole item */
1675f466c6fdSAl Viro 	__le16 deh_state;	/* whether 1) entry contains stat data (for future), and 2) whether
1676f466c6fdSAl Viro 				   entry is hidden (unlinked) */
1677f466c6fdSAl Viro } __attribute__ ((__packed__));
1678f466c6fdSAl Viro #define DEH_SIZE                  sizeof(struct reiserfs_de_head)
1679f466c6fdSAl Viro #define deh_offset(p_deh)         (le32_to_cpu((p_deh)->deh_offset))
1680f466c6fdSAl Viro #define deh_dir_id(p_deh)         (le32_to_cpu((p_deh)->deh_dir_id))
1681f466c6fdSAl Viro #define deh_objectid(p_deh)       (le32_to_cpu((p_deh)->deh_objectid))
1682f466c6fdSAl Viro #define deh_location(p_deh)       (le16_to_cpu((p_deh)->deh_location))
1683f466c6fdSAl Viro #define deh_state(p_deh)          (le16_to_cpu((p_deh)->deh_state))
1684f466c6fdSAl Viro 
1685f466c6fdSAl Viro #define put_deh_offset(p_deh,v)   ((p_deh)->deh_offset = cpu_to_le32((v)))
1686f466c6fdSAl Viro #define put_deh_dir_id(p_deh,v)   ((p_deh)->deh_dir_id = cpu_to_le32((v)))
1687f466c6fdSAl Viro #define put_deh_objectid(p_deh,v) ((p_deh)->deh_objectid = cpu_to_le32((v)))
1688f466c6fdSAl Viro #define put_deh_location(p_deh,v) ((p_deh)->deh_location = cpu_to_le16((v)))
1689f466c6fdSAl Viro #define put_deh_state(p_deh,v)    ((p_deh)->deh_state = cpu_to_le16((v)))
1690f466c6fdSAl Viro 
1691f466c6fdSAl Viro /* empty directory contains two entries "." and ".." and their headers */
1692f466c6fdSAl Viro #define EMPTY_DIR_SIZE \
1693f466c6fdSAl Viro (DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen ("..")))
1694f466c6fdSAl Viro 
1695f466c6fdSAl Viro /* old format directories have this size when empty */
1696f466c6fdSAl Viro #define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3)
1697f466c6fdSAl Viro 
1698f466c6fdSAl Viro #define DEH_Statdata 0		/* not used now */
1699f466c6fdSAl Viro #define DEH_Visible 2
1700f466c6fdSAl Viro 
1701f466c6fdSAl Viro /* 64 bit systems (and the S/390) need to be aligned explicitly -jdm */
1702f466c6fdSAl Viro #if BITS_PER_LONG == 64 || defined(__s390__) || defined(__hppa__)
1703f466c6fdSAl Viro #   define ADDR_UNALIGNED_BITS  (3)
1704f466c6fdSAl Viro #endif
1705f466c6fdSAl Viro 
1706f466c6fdSAl Viro /* These are only used to manipulate deh_state.
1707f466c6fdSAl Viro  * Because of this, we'll use the ext2_ bit routines,
1708f466c6fdSAl Viro  * since they are little endian */
1709f466c6fdSAl Viro #ifdef ADDR_UNALIGNED_BITS
1710f466c6fdSAl Viro 
1711f466c6fdSAl Viro #   define aligned_address(addr)           ((void *)((long)(addr) & ~((1UL << ADDR_UNALIGNED_BITS) - 1)))
1712f466c6fdSAl Viro #   define unaligned_offset(addr)          (((int)((long)(addr) & ((1 << ADDR_UNALIGNED_BITS) - 1))) << 3)
1713f466c6fdSAl Viro 
1714f466c6fdSAl Viro #   define set_bit_unaligned(nr, addr)	\
1715f466c6fdSAl Viro 	__test_and_set_bit_le((nr) + unaligned_offset(addr), aligned_address(addr))
1716f466c6fdSAl Viro #   define clear_bit_unaligned(nr, addr)	\
1717f466c6fdSAl Viro 	__test_and_clear_bit_le((nr) + unaligned_offset(addr), aligned_address(addr))
1718f466c6fdSAl Viro #   define test_bit_unaligned(nr, addr)	\
1719f466c6fdSAl Viro 	test_bit_le((nr) + unaligned_offset(addr), aligned_address(addr))
1720f466c6fdSAl Viro 
1721f466c6fdSAl Viro #else
1722f466c6fdSAl Viro 
1723f466c6fdSAl Viro #   define set_bit_unaligned(nr, addr)	__test_and_set_bit_le(nr, addr)
1724f466c6fdSAl Viro #   define clear_bit_unaligned(nr, addr)	__test_and_clear_bit_le(nr, addr)
1725f466c6fdSAl Viro #   define test_bit_unaligned(nr, addr)	test_bit_le(nr, addr)
1726f466c6fdSAl Viro 
1727f466c6fdSAl Viro #endif
1728f466c6fdSAl Viro 
1729f466c6fdSAl Viro #define mark_de_with_sd(deh)        set_bit_unaligned (DEH_Statdata, &((deh)->deh_state))
1730f466c6fdSAl Viro #define mark_de_without_sd(deh)     clear_bit_unaligned (DEH_Statdata, &((deh)->deh_state))
1731f466c6fdSAl Viro #define mark_de_visible(deh)	    set_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1732f466c6fdSAl Viro #define mark_de_hidden(deh)	    clear_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1733f466c6fdSAl Viro 
1734f466c6fdSAl Viro #define de_with_sd(deh)		    test_bit_unaligned (DEH_Statdata, &((deh)->deh_state))
1735f466c6fdSAl Viro #define de_visible(deh)	    	    test_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1736f466c6fdSAl Viro #define de_hidden(deh)	    	    !test_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1737f466c6fdSAl Viro 
1738f466c6fdSAl Viro extern void make_empty_dir_item_v1(char *body, __le32 dirid, __le32 objid,
1739f466c6fdSAl Viro 				   __le32 par_dirid, __le32 par_objid);
1740f466c6fdSAl Viro extern void make_empty_dir_item(char *body, __le32 dirid, __le32 objid,
1741f466c6fdSAl Viro 				__le32 par_dirid, __le32 par_objid);
1742f466c6fdSAl Viro 
1743f466c6fdSAl Viro // two entries per block (at least)
1744f466c6fdSAl Viro #define REISERFS_MAX_NAME(block_size) 255
1745f466c6fdSAl Viro 
1746f466c6fdSAl Viro /* this structure is used for operations on directory entries. It is
1747f466c6fdSAl Viro    not a disk structure. */
1748f466c6fdSAl Viro /* When reiserfs_find_entry or search_by_entry_key find directory
1749f466c6fdSAl Viro    entry, they return filled reiserfs_dir_entry structure */
1750f466c6fdSAl Viro struct reiserfs_dir_entry {
1751f466c6fdSAl Viro 	struct buffer_head *de_bh;
1752f466c6fdSAl Viro 	int de_item_num;
1753f466c6fdSAl Viro 	struct item_head *de_ih;
1754f466c6fdSAl Viro 	int de_entry_num;
1755f466c6fdSAl Viro 	struct reiserfs_de_head *de_deh;
1756f466c6fdSAl Viro 	int de_entrylen;
1757f466c6fdSAl Viro 	int de_namelen;
1758f466c6fdSAl Viro 	char *de_name;
1759f466c6fdSAl Viro 	unsigned long *de_gen_number_bit_string;
1760f466c6fdSAl Viro 
1761f466c6fdSAl Viro 	__u32 de_dir_id;
1762f466c6fdSAl Viro 	__u32 de_objectid;
1763f466c6fdSAl Viro 
1764f466c6fdSAl Viro 	struct cpu_key de_entry_key;
1765f466c6fdSAl Viro };
1766f466c6fdSAl Viro 
1767f466c6fdSAl Viro /* these defines are useful when a particular member of a reiserfs_dir_entry is needed */
1768f466c6fdSAl Viro 
1769f466c6fdSAl Viro /* pointer to file name, stored in entry */
17704cf5f7adSJeff Mahoney #define B_I_DEH_ENTRY_FILE_NAME(bh, ih, deh) \
17714cf5f7adSJeff Mahoney 				(ih_item_body(bh, ih) + deh_location(deh))
1772f466c6fdSAl Viro 
1773f466c6fdSAl Viro /* length of name */
1774f466c6fdSAl Viro #define I_DEH_N_ENTRY_FILE_NAME_LENGTH(ih,deh,entry_num) \
1775f466c6fdSAl Viro (I_DEH_N_ENTRY_LENGTH (ih, deh, entry_num) - (de_with_sd (deh) ? SD_SIZE : 0))
1776f466c6fdSAl Viro 
1777f466c6fdSAl Viro /* hash value occupies bits from 7 up to 30 */
1778f466c6fdSAl Viro #define GET_HASH_VALUE(offset) ((offset) & 0x7fffff80LL)
1779f466c6fdSAl Viro /* generation number occupies 7 bits starting from 0 up to 6 */
1780f466c6fdSAl Viro #define GET_GENERATION_NUMBER(offset) ((offset) & 0x7fLL)
1781f466c6fdSAl Viro #define MAX_GENERATION_NUMBER  127
1782f466c6fdSAl Viro 
1783f466c6fdSAl Viro #define SET_GENERATION_NUMBER(offset,gen_number) (GET_HASH_VALUE(offset)|(gen_number))
1784f466c6fdSAl Viro 
1785f466c6fdSAl Viro /*
1786f466c6fdSAl Viro  * Picture represents an internal node of the reiserfs tree
1787f466c6fdSAl Viro  *  ______________________________________________________
1788f466c6fdSAl Viro  * |      |  Array of     |  Array of         |  Free     |
1789f466c6fdSAl Viro  * |block |    keys       |  pointers         | space     |
1790f466c6fdSAl Viro  * | head |      N        |      N+1          |           |
1791f466c6fdSAl Viro  * |______|_______________|___________________|___________|
1792f466c6fdSAl Viro  */
1793f466c6fdSAl Viro 
1794f466c6fdSAl Viro /***************************************************************************/
1795f466c6fdSAl Viro /*                      DISK CHILD                                         */
1796f466c6fdSAl Viro /***************************************************************************/
1797f466c6fdSAl Viro /* Disk child pointer: The pointer from an internal node of the tree
1798f466c6fdSAl Viro    to a node that is on disk. */
1799f466c6fdSAl Viro struct disk_child {
1800f466c6fdSAl Viro 	__le32 dc_block_number;	/* Disk child's block number. */
1801f466c6fdSAl Viro 	__le16 dc_size;		/* Disk child's used space.   */
1802f466c6fdSAl Viro 	__le16 dc_reserved;
1803f466c6fdSAl Viro };
1804f466c6fdSAl Viro 
1805f466c6fdSAl Viro #define DC_SIZE (sizeof(struct disk_child))
1806f466c6fdSAl Viro #define dc_block_number(dc_p)	(le32_to_cpu((dc_p)->dc_block_number))
1807f466c6fdSAl Viro #define dc_size(dc_p)		(le16_to_cpu((dc_p)->dc_size))
1808f466c6fdSAl Viro #define put_dc_block_number(dc_p, val)   do { (dc_p)->dc_block_number = cpu_to_le32(val); } while(0)
1809f466c6fdSAl Viro #define put_dc_size(dc_p, val)   do { (dc_p)->dc_size = cpu_to_le16(val); } while(0)
1810f466c6fdSAl Viro 
1811f466c6fdSAl Viro /* Get disk child by buffer header and position in the tree node. */
1812f466c6fdSAl Viro #define B_N_CHILD(bh, n_pos)  ((struct disk_child *)\
1813f466c6fdSAl Viro ((bh)->b_data + BLKH_SIZE + B_NR_ITEMS(bh) * KEY_SIZE + DC_SIZE * (n_pos)))
1814f466c6fdSAl Viro 
1815f466c6fdSAl Viro /* Get disk child number by buffer header and position in the tree node. */
1816f466c6fdSAl Viro #define B_N_CHILD_NUM(bh, n_pos) (dc_block_number(B_N_CHILD(bh, n_pos)))
1817f466c6fdSAl Viro #define PUT_B_N_CHILD_NUM(bh, n_pos, val) \
1818f466c6fdSAl Viro 				(put_dc_block_number(B_N_CHILD(bh, n_pos), val))
1819f466c6fdSAl Viro 
1820f466c6fdSAl Viro  /* maximal value of field child_size in structure disk_child */
1821f466c6fdSAl Viro  /* child size is the combined size of all items and their headers */
1822f466c6fdSAl Viro #define MAX_CHILD_SIZE(bh) ((int)( (bh)->b_size - BLKH_SIZE ))
1823f466c6fdSAl Viro 
1824f466c6fdSAl Viro /* amount of used space in buffer (not including block head) */
1825f466c6fdSAl Viro #define B_CHILD_SIZE(cur) (MAX_CHILD_SIZE(cur)-(B_FREE_SPACE(cur)))
1826f466c6fdSAl Viro 
1827f466c6fdSAl Viro /* max and min number of keys in internal node */
1828f466c6fdSAl Viro #define MAX_NR_KEY(bh) ( (MAX_CHILD_SIZE(bh)-DC_SIZE)/(KEY_SIZE+DC_SIZE) )
1829f466c6fdSAl Viro #define MIN_NR_KEY(bh)    (MAX_NR_KEY(bh)/2)
1830f466c6fdSAl Viro 
1831f466c6fdSAl Viro /***************************************************************************/
1832f466c6fdSAl Viro /*                      PATH STRUCTURES AND DEFINES                        */
1833f466c6fdSAl Viro /***************************************************************************/
1834f466c6fdSAl Viro 
1835f466c6fdSAl Viro /* Search_by_key fills up the path from the root to the leaf as it descends the tree looking for the
1836f466c6fdSAl Viro    key.  It uses reiserfs_bread to try to find buffers in the cache given their block number.  If it
1837f466c6fdSAl Viro    does not find them in the cache it reads them from disk.  For each node search_by_key finds using
1838f466c6fdSAl Viro    reiserfs_bread it then uses bin_search to look through that node.  bin_search will find the
1839f466c6fdSAl Viro    position of the block_number of the next node if it is looking through an internal node.  If it
1840f466c6fdSAl Viro    is looking through a leaf node bin_search will find the position of the item which has key either
1841f466c6fdSAl Viro    equal to given key, or which is the maximal key less than the given key. */
1842f466c6fdSAl Viro 
1843f466c6fdSAl Viro struct path_element {
1844f466c6fdSAl Viro 	struct buffer_head *pe_buffer;	/* Pointer to the buffer at the path in the tree. */
1845f466c6fdSAl Viro 	int pe_position;	/* Position in the tree node which is placed in the */
1846f466c6fdSAl Viro 	/* buffer above.                                  */
1847f466c6fdSAl Viro };
1848f466c6fdSAl Viro 
1849f466c6fdSAl Viro #define MAX_HEIGHT 5		/* maximal height of a tree. don't change this without changing JOURNAL_PER_BALANCE_CNT */
1850f466c6fdSAl Viro #define EXTENDED_MAX_HEIGHT         7	/* Must be equals MAX_HEIGHT + FIRST_PATH_ELEMENT_OFFSET */
1851f466c6fdSAl Viro #define FIRST_PATH_ELEMENT_OFFSET   2	/* Must be equal to at least 2. */
1852f466c6fdSAl Viro 
1853f466c6fdSAl Viro #define ILLEGAL_PATH_ELEMENT_OFFSET 1	/* Must be equal to FIRST_PATH_ELEMENT_OFFSET - 1 */
1854f466c6fdSAl Viro #define MAX_FEB_SIZE 6		/* this MUST be MAX_HEIGHT + 1. See about FEB below */
1855f466c6fdSAl Viro 
1856f466c6fdSAl Viro /* We need to keep track of who the ancestors of nodes are.  When we
1857f466c6fdSAl Viro    perform a search we record which nodes were visited while
1858f466c6fdSAl Viro    descending the tree looking for the node we searched for. This list
1859f466c6fdSAl Viro    of nodes is called the path.  This information is used while
1860f466c6fdSAl Viro    performing balancing.  Note that this path information may become
1861f466c6fdSAl Viro    invalid, and this means we must check it when using it to see if it
1862f466c6fdSAl Viro    is still valid. You'll need to read search_by_key and the comments
1863f466c6fdSAl Viro    in it, especially about decrement_counters_in_path(), to understand
1864f466c6fdSAl Viro    this structure.
1865f466c6fdSAl Viro 
1866f466c6fdSAl Viro Paths make the code so much harder to work with and debug.... An
1867f466c6fdSAl Viro enormous number of bugs are due to them, and trying to write or modify
1868f466c6fdSAl Viro code that uses them just makes my head hurt.  They are based on an
1869f466c6fdSAl Viro excessive effort to avoid disturbing the precious VFS code.:-( The
1870f466c6fdSAl Viro gods only know how we are going to SMP the code that uses them.
1871f466c6fdSAl Viro znodes are the way! */
1872f466c6fdSAl Viro 
1873f466c6fdSAl Viro #define PATH_READA	0x1	/* do read ahead */
1874f466c6fdSAl Viro #define PATH_READA_BACK 0x2	/* read backwards */
1875f466c6fdSAl Viro 
1876f466c6fdSAl Viro struct treepath {
1877f466c6fdSAl Viro 	int path_length;	/* Length of the array above.   */
1878f466c6fdSAl Viro 	int reada;
1879f466c6fdSAl Viro 	struct path_element path_elements[EXTENDED_MAX_HEIGHT];	/* Array of the path elements.  */
1880f466c6fdSAl Viro 	int pos_in_item;
1881f466c6fdSAl Viro };
1882f466c6fdSAl Viro 
1883f466c6fdSAl Viro #define pos_in_item(path) ((path)->pos_in_item)
1884f466c6fdSAl Viro 
1885f466c6fdSAl Viro #define INITIALIZE_PATH(var) \
1886f466c6fdSAl Viro struct treepath var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,}
1887f466c6fdSAl Viro 
1888f466c6fdSAl Viro /* Get path element by path and path position. */
1889f466c6fdSAl Viro #define PATH_OFFSET_PELEMENT(path, n_offset)  ((path)->path_elements + (n_offset))
1890f466c6fdSAl Viro 
1891f466c6fdSAl Viro /* Get buffer header at the path by path and path position. */
1892f466c6fdSAl Viro #define PATH_OFFSET_PBUFFER(path, n_offset)   (PATH_OFFSET_PELEMENT(path, n_offset)->pe_buffer)
1893f466c6fdSAl Viro 
1894f466c6fdSAl Viro /* Get position in the element at the path by path and path position. */
1895f466c6fdSAl Viro #define PATH_OFFSET_POSITION(path, n_offset) (PATH_OFFSET_PELEMENT(path, n_offset)->pe_position)
1896f466c6fdSAl Viro 
1897f466c6fdSAl Viro #define PATH_PLAST_BUFFER(path) (PATH_OFFSET_PBUFFER((path), (path)->path_length))
1898f466c6fdSAl Viro 				/* you know, to the person who didn't
1899f466c6fdSAl Viro 				   write this the macro name does not
1900f466c6fdSAl Viro 				   at first suggest what it does.
1901f466c6fdSAl Viro 				   Maybe POSITION_FROM_PATH_END? Or
1902f466c6fdSAl Viro 				   maybe we should just focus on
1903f466c6fdSAl Viro 				   dumping paths... -Hans */
1904f466c6fdSAl Viro #define PATH_LAST_POSITION(path) (PATH_OFFSET_POSITION((path), (path)->path_length))
1905f466c6fdSAl Viro 
1906f466c6fdSAl Viro /* in do_balance leaf has h == 0 in contrast with path structure,
1907f466c6fdSAl Viro    where root has level == 0. That is why we need these defines */
1908f466c6fdSAl Viro #define PATH_H_PBUFFER(path, h) PATH_OFFSET_PBUFFER (path, path->path_length - (h))	/* tb->S[h] */
1909f466c6fdSAl Viro #define PATH_H_PPARENT(path, h) PATH_H_PBUFFER (path, (h) + 1)	/* tb->F[h] or tb->S[0]->b_parent */
1910f466c6fdSAl Viro #define PATH_H_POSITION(path, h) PATH_OFFSET_POSITION (path, path->path_length - (h))
1911f466c6fdSAl Viro #define PATH_H_B_ITEM_ORDER(path, h) PATH_H_POSITION(path, h + 1)	/* tb->S[h]->b_item_order */
1912f466c6fdSAl Viro 
1913f466c6fdSAl Viro #define PATH_H_PATH_OFFSET(path, n_h) ((path)->path_length - (n_h))
1914f466c6fdSAl Viro 
19154cf5f7adSJeff Mahoney static inline void *reiserfs_node_data(const struct buffer_head *bh)
19164cf5f7adSJeff Mahoney {
19174cf5f7adSJeff Mahoney 	return bh->b_data + sizeof(struct block_head);
19184cf5f7adSJeff Mahoney }
19194cf5f7adSJeff Mahoney 
19204cf5f7adSJeff Mahoney /* get key from internal node */
19214cf5f7adSJeff Mahoney static inline struct reiserfs_key *internal_key(struct buffer_head *bh,
19224cf5f7adSJeff Mahoney 						int item_num)
19234cf5f7adSJeff Mahoney {
19244cf5f7adSJeff Mahoney 	struct reiserfs_key *key = reiserfs_node_data(bh);
19254cf5f7adSJeff Mahoney 
19264cf5f7adSJeff Mahoney 	return &key[item_num];
19274cf5f7adSJeff Mahoney }
19284cf5f7adSJeff Mahoney 
19294cf5f7adSJeff Mahoney /* get the item header from leaf node */
19304cf5f7adSJeff Mahoney static inline struct item_head *item_head(const struct buffer_head *bh,
19314cf5f7adSJeff Mahoney 					  int item_num)
19324cf5f7adSJeff Mahoney {
19334cf5f7adSJeff Mahoney 	struct item_head *ih = reiserfs_node_data(bh);
19344cf5f7adSJeff Mahoney 
19354cf5f7adSJeff Mahoney 	return &ih[item_num];
19364cf5f7adSJeff Mahoney }
19374cf5f7adSJeff Mahoney 
19384cf5f7adSJeff Mahoney /* get the key from leaf node */
19394cf5f7adSJeff Mahoney static inline struct reiserfs_key *leaf_key(const struct buffer_head *bh,
19404cf5f7adSJeff Mahoney 					    int item_num)
19414cf5f7adSJeff Mahoney {
19424cf5f7adSJeff Mahoney 	return &item_head(bh, item_num)->ih_key;
19434cf5f7adSJeff Mahoney }
19444cf5f7adSJeff Mahoney 
19454cf5f7adSJeff Mahoney static inline void *ih_item_body(const struct buffer_head *bh,
19464cf5f7adSJeff Mahoney 				 const struct item_head *ih)
19474cf5f7adSJeff Mahoney {
19484cf5f7adSJeff Mahoney 	return bh->b_data + ih_location(ih);
19494cf5f7adSJeff Mahoney }
19504cf5f7adSJeff Mahoney 
19514cf5f7adSJeff Mahoney /* get item body from leaf node */
19524cf5f7adSJeff Mahoney static inline void *item_body(const struct buffer_head *bh, int item_num)
19534cf5f7adSJeff Mahoney {
19544cf5f7adSJeff Mahoney 	return ih_item_body(bh, item_head(bh, item_num));
19554cf5f7adSJeff Mahoney }
19564cf5f7adSJeff Mahoney 
19574cf5f7adSJeff Mahoney static inline struct item_head *tp_item_head(const struct treepath *path)
19584cf5f7adSJeff Mahoney {
19594cf5f7adSJeff Mahoney 	return item_head(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION(path));
19604cf5f7adSJeff Mahoney }
19614cf5f7adSJeff Mahoney 
19624cf5f7adSJeff Mahoney static inline void *tp_item_body(const struct treepath *path)
19634cf5f7adSJeff Mahoney {
19644cf5f7adSJeff Mahoney 	return item_body(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION(path));
19654cf5f7adSJeff Mahoney }
19664cf5f7adSJeff Mahoney 
1967f466c6fdSAl Viro #define get_last_bh(path) PATH_PLAST_BUFFER(path)
1968f466c6fdSAl Viro #define get_item_pos(path) PATH_LAST_POSITION(path)
1969f466c6fdSAl Viro #define item_moved(ih,path) comp_items(ih, path)
1970f466c6fdSAl Viro #define path_changed(ih,path) comp_items (ih, path)
1971f466c6fdSAl Viro 
19724cf5f7adSJeff Mahoney /* array of the entry headers */
19734cf5f7adSJeff Mahoney  /* get item body */
19744cf5f7adSJeff Mahoney #define B_I_DEH(bh, ih) ((struct reiserfs_de_head *)(ih_item_body(bh, ih)))
19754cf5f7adSJeff Mahoney 
19764cf5f7adSJeff Mahoney /* length of the directory entry in directory item. This define
19774cf5f7adSJeff Mahoney    calculates length of i-th directory entry using directory entry
19784cf5f7adSJeff Mahoney    locations from dir entry head. When it calculates length of 0-th
19794cf5f7adSJeff Mahoney    directory entry, it uses length of whole item in place of entry
19804cf5f7adSJeff Mahoney    location of the non-existent following entry in the calculation.
19814cf5f7adSJeff Mahoney    See picture above.*/
19824cf5f7adSJeff Mahoney /*
19834cf5f7adSJeff Mahoney #define I_DEH_N_ENTRY_LENGTH(ih,deh,i) \
19844cf5f7adSJeff Mahoney ((i) ? (deh_location((deh)-1) - deh_location((deh))) : (ih_item_len((ih)) - deh_location((deh))))
19854cf5f7adSJeff Mahoney */
19864cf5f7adSJeff Mahoney static inline int entry_length(const struct buffer_head *bh,
19874cf5f7adSJeff Mahoney 			       const struct item_head *ih, int pos_in_item)
19884cf5f7adSJeff Mahoney {
19894cf5f7adSJeff Mahoney 	struct reiserfs_de_head *deh;
19904cf5f7adSJeff Mahoney 
19914cf5f7adSJeff Mahoney 	deh = B_I_DEH(bh, ih) + pos_in_item;
19924cf5f7adSJeff Mahoney 	if (pos_in_item)
19934cf5f7adSJeff Mahoney 		return deh_location(deh - 1) - deh_location(deh);
19944cf5f7adSJeff Mahoney 
19954cf5f7adSJeff Mahoney 	return ih_item_len(ih) - deh_location(deh);
19964cf5f7adSJeff Mahoney }
19974cf5f7adSJeff Mahoney 
1998f466c6fdSAl Viro /***************************************************************************/
1999f466c6fdSAl Viro /*                       MISC                                              */
2000f466c6fdSAl Viro /***************************************************************************/
2001f466c6fdSAl Viro 
2002f466c6fdSAl Viro /* Size of pointer to the unformatted node. */
2003f466c6fdSAl Viro #define UNFM_P_SIZE (sizeof(unp_t))
2004f466c6fdSAl Viro #define UNFM_P_SHIFT 2
2005f466c6fdSAl Viro 
2006f466c6fdSAl Viro // in in-core inode key is stored on le form
2007f466c6fdSAl Viro #define INODE_PKEY(inode) ((struct reiserfs_key *)(REISERFS_I(inode)->i_key))
2008f466c6fdSAl Viro 
2009f466c6fdSAl Viro #define MAX_UL_INT 0xffffffff
2010f466c6fdSAl Viro #define MAX_INT    0x7ffffff
2011f466c6fdSAl Viro #define MAX_US_INT 0xffff
2012f466c6fdSAl Viro 
2013f466c6fdSAl Viro // reiserfs version 2 has max offset 60 bits. Version 1 - 32 bit offset
2014f466c6fdSAl Viro static inline loff_t max_reiserfs_offset(struct inode *inode)
2015f466c6fdSAl Viro {
2016f466c6fdSAl Viro 	if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5)
2017f466c6fdSAl Viro 		return (loff_t) U32_MAX;
2018f466c6fdSAl Viro 
2019f466c6fdSAl Viro 	return (loff_t) ((~(__u64) 0) >> 4);
2020f466c6fdSAl Viro }
2021f466c6fdSAl Viro 
2022f466c6fdSAl Viro /*#define MAX_KEY_UNIQUENESS	MAX_UL_INT*/
2023f466c6fdSAl Viro #define MAX_KEY_OBJECTID	MAX_UL_INT
2024f466c6fdSAl Viro 
2025f466c6fdSAl Viro #define MAX_B_NUM  MAX_UL_INT
2026f466c6fdSAl Viro #define MAX_FC_NUM MAX_US_INT
2027f466c6fdSAl Viro 
2028f466c6fdSAl Viro /* the purpose is to detect overflow of an unsigned short */
2029f466c6fdSAl Viro #define REISERFS_LINK_MAX (MAX_US_INT - 1000)
2030f466c6fdSAl Viro 
2031f466c6fdSAl Viro /* The following defines are used in reiserfs_insert_item and reiserfs_append_item  */
2032f466c6fdSAl Viro #define REISERFS_KERNEL_MEM		0	/* reiserfs kernel memory mode  */
2033f466c6fdSAl Viro #define REISERFS_USER_MEM		1	/* reiserfs user memory mode            */
2034f466c6fdSAl Viro 
2035f466c6fdSAl Viro #define fs_generation(s) (REISERFS_SB(s)->s_generation_counter)
2036f466c6fdSAl Viro #define get_generation(s) atomic_read (&fs_generation(s))
2037f466c6fdSAl Viro #define FILESYSTEM_CHANGED_TB(tb)  (get_generation((tb)->tb_sb) != (tb)->fs_gen)
2038f466c6fdSAl Viro #define __fs_changed(gen,s) (gen != get_generation (s))
2039f466c6fdSAl Viro #define fs_changed(gen,s)		\
2040f466c6fdSAl Viro ({					\
2041f466c6fdSAl Viro 	reiserfs_cond_resched(s);	\
2042f466c6fdSAl Viro 	__fs_changed(gen, s);		\
2043f466c6fdSAl Viro })
2044f466c6fdSAl Viro 
2045f466c6fdSAl Viro /***************************************************************************/
2046f466c6fdSAl Viro /*                  FIXATE NODES                                           */
2047f466c6fdSAl Viro /***************************************************************************/
2048f466c6fdSAl Viro 
2049f466c6fdSAl Viro #define VI_TYPE_LEFT_MERGEABLE 1
2050f466c6fdSAl Viro #define VI_TYPE_RIGHT_MERGEABLE 2
2051f466c6fdSAl Viro 
2052f466c6fdSAl Viro /* To make any changes in the tree we always first find node, that
2053f466c6fdSAl Viro    contains item to be changed/deleted or place to insert a new
2054f466c6fdSAl Viro    item. We call this node S. To do balancing we need to decide what
2055f466c6fdSAl Viro    we will shift to left/right neighbor, or to a new node, where new
2056f466c6fdSAl Viro    item will be etc. To make this analysis simpler we build virtual
2057f466c6fdSAl Viro    node. Virtual node is an array of items, that will replace items of
2058f466c6fdSAl Viro    node S. (For instance if we are going to delete an item, virtual
2059f466c6fdSAl Viro    node does not contain it). Virtual node keeps information about
2060f466c6fdSAl Viro    item sizes and types, mergeability of first and last items, sizes
2061f466c6fdSAl Viro    of all entries in directory item. We use this array of items when
2062f466c6fdSAl Viro    calculating what we can shift to neighbors and how many nodes we
2063f466c6fdSAl Viro    have to have if we do not any shiftings, if we shift to left/right
2064f466c6fdSAl Viro    neighbor or to both. */
2065f466c6fdSAl Viro struct virtual_item {
2066f466c6fdSAl Viro 	int vi_index;		// index in the array of item operations
2067f466c6fdSAl Viro 	unsigned short vi_type;	// left/right mergeability
2068f466c6fdSAl Viro 	unsigned short vi_item_len;	/* length of item that it will have after balancing */
2069f466c6fdSAl Viro 	struct item_head *vi_ih;
2070f466c6fdSAl Viro 	const char *vi_item;	// body of item (old or new)
2071f466c6fdSAl Viro 	const void *vi_new_data;	// 0 always but paste mode
2072f466c6fdSAl Viro 	void *vi_uarea;		// item specific area
2073f466c6fdSAl Viro };
2074f466c6fdSAl Viro 
2075f466c6fdSAl Viro struct virtual_node {
2076f466c6fdSAl Viro 	char *vn_free_ptr;	/* this is a pointer to the free space in the buffer */
2077f466c6fdSAl Viro 	unsigned short vn_nr_item;	/* number of items in virtual node */
2078f466c6fdSAl Viro 	short vn_size;		/* size of node , that node would have if it has unlimited size and no balancing is performed */
2079f466c6fdSAl Viro 	short vn_mode;		/* mode of balancing (paste, insert, delete, cut) */
2080f466c6fdSAl Viro 	short vn_affected_item_num;
2081f466c6fdSAl Viro 	short vn_pos_in_item;
2082f466c6fdSAl Viro 	struct item_head *vn_ins_ih;	/* item header of inserted item, 0 for other modes */
2083f466c6fdSAl Viro 	const void *vn_data;
2084f466c6fdSAl Viro 	struct virtual_item *vn_vi;	/* array of items (including a new one, excluding item to be deleted) */
2085f466c6fdSAl Viro };
2086f466c6fdSAl Viro 
2087f466c6fdSAl Viro /* used by directory items when creating virtual nodes */
2088f466c6fdSAl Viro struct direntry_uarea {
2089f466c6fdSAl Viro 	int flags;
2090f466c6fdSAl Viro 	__u16 entry_count;
2091f466c6fdSAl Viro 	__u16 entry_sizes[1];
2092f466c6fdSAl Viro } __attribute__ ((__packed__));
2093f466c6fdSAl Viro 
2094f466c6fdSAl Viro /***************************************************************************/
2095f466c6fdSAl Viro /*                  TREE BALANCE                                           */
2096f466c6fdSAl Viro /***************************************************************************/
2097f466c6fdSAl Viro 
2098f466c6fdSAl Viro /* This temporary structure is used in tree balance algorithms, and
2099f466c6fdSAl Viro    constructed as we go to the extent that its various parts are
2100f466c6fdSAl Viro    needed.  It contains arrays of nodes that can potentially be
2101f466c6fdSAl Viro    involved in the balancing of node S, and parameters that define how
2102f466c6fdSAl Viro    each of the nodes must be balanced.  Note that in these algorithms
2103f466c6fdSAl Viro    for balancing the worst case is to need to balance the current node
2104f466c6fdSAl Viro    S and the left and right neighbors and all of their parents plus
2105f466c6fdSAl Viro    create a new node.  We implement S1 balancing for the leaf nodes
2106f466c6fdSAl Viro    and S0 balancing for the internal nodes (S1 and S0 are defined in
2107f466c6fdSAl Viro    our papers.)*/
2108f466c6fdSAl Viro 
2109f466c6fdSAl Viro #define MAX_FREE_BLOCK 7	/* size of the array of buffers to free at end of do_balance */
2110f466c6fdSAl Viro 
2111f466c6fdSAl Viro /* maximum number of FEB blocknrs on a single level */
2112f466c6fdSAl Viro #define MAX_AMOUNT_NEEDED 2
2113f466c6fdSAl Viro 
2114f466c6fdSAl Viro /* someday somebody will prefix every field in this struct with tb_ */
2115f466c6fdSAl Viro struct tree_balance {
2116f466c6fdSAl Viro 	int tb_mode;
2117f466c6fdSAl Viro 	int need_balance_dirty;
2118f466c6fdSAl Viro 	struct super_block *tb_sb;
2119f466c6fdSAl Viro 	struct reiserfs_transaction_handle *transaction_handle;
2120f466c6fdSAl Viro 	struct treepath *tb_path;
2121f466c6fdSAl Viro 	struct buffer_head *L[MAX_HEIGHT];	/* array of left neighbors of nodes in the path */
2122f466c6fdSAl Viro 	struct buffer_head *R[MAX_HEIGHT];	/* array of right neighbors of nodes in the path */
2123f466c6fdSAl Viro 	struct buffer_head *FL[MAX_HEIGHT];	/* array of fathers of the left  neighbors      */
2124f466c6fdSAl Viro 	struct buffer_head *FR[MAX_HEIGHT];	/* array of fathers of the right neighbors      */
2125f466c6fdSAl Viro 	struct buffer_head *CFL[MAX_HEIGHT];	/* array of common parents of center node and its left neighbor  */
2126f466c6fdSAl Viro 	struct buffer_head *CFR[MAX_HEIGHT];	/* array of common parents of center node and its right neighbor */
2127f466c6fdSAl Viro 
2128f466c6fdSAl Viro 	struct buffer_head *FEB[MAX_FEB_SIZE];	/* array of empty buffers. Number of buffers in array equals
2129f466c6fdSAl Viro 						   cur_blknum. */
2130f466c6fdSAl Viro 	struct buffer_head *used[MAX_FEB_SIZE];
2131f466c6fdSAl Viro 	struct buffer_head *thrown[MAX_FEB_SIZE];
2132f466c6fdSAl Viro 	int lnum[MAX_HEIGHT];	/* array of number of items which must be
2133f466c6fdSAl Viro 				   shifted to the left in order to balance the
2134f466c6fdSAl Viro 				   current node; for leaves includes item that
2135f466c6fdSAl Viro 				   will be partially shifted; for internal
2136f466c6fdSAl Viro 				   nodes, it is the number of child pointers
2137f466c6fdSAl Viro 				   rather than items. It includes the new item
2138f466c6fdSAl Viro 				   being created. The code sometimes subtracts
2139f466c6fdSAl Viro 				   one to get the number of wholly shifted
2140f466c6fdSAl Viro 				   items for other purposes. */
2141f466c6fdSAl Viro 	int rnum[MAX_HEIGHT];	/* substitute right for left in comment above */
2142f466c6fdSAl Viro 	int lkey[MAX_HEIGHT];	/* array indexed by height h mapping the key delimiting L[h] and
2143f466c6fdSAl Viro 				   S[h] to its item number within the node CFL[h] */
2144f466c6fdSAl Viro 	int rkey[MAX_HEIGHT];	/* substitute r for l in comment above */
2145f466c6fdSAl Viro 	int insert_size[MAX_HEIGHT];	/* the number of bytes by we are trying to add or remove from
2146f466c6fdSAl Viro 					   S[h]. A negative value means removing.  */
2147f466c6fdSAl Viro 	int blknum[MAX_HEIGHT];	/* number of nodes that will replace node S[h] after
2148f466c6fdSAl Viro 				   balancing on the level h of the tree.  If 0 then S is
2149f466c6fdSAl Viro 				   being deleted, if 1 then S is remaining and no new nodes
2150f466c6fdSAl Viro 				   are being created, if 2 or 3 then 1 or 2 new nodes is
2151f466c6fdSAl Viro 				   being created */
2152f466c6fdSAl Viro 
2153f466c6fdSAl Viro 	/* fields that are used only for balancing leaves of the tree */
2154f466c6fdSAl Viro 	int cur_blknum;		/* number of empty blocks having been already allocated                 */
2155f466c6fdSAl Viro 	int s0num;		/* number of items that fall into left most  node when S[0] splits     */
2156f466c6fdSAl Viro 	int s1num;		/* number of items that fall into first  new node when S[0] splits     */
2157f466c6fdSAl Viro 	int s2num;		/* number of items that fall into second new node when S[0] splits     */
2158f466c6fdSAl Viro 	int lbytes;		/* number of bytes which can flow to the left neighbor from the        left    */
2159f466c6fdSAl Viro 	/* most liquid item that cannot be shifted from S[0] entirely         */
2160f466c6fdSAl Viro 	/* if -1 then nothing will be partially shifted */
2161f466c6fdSAl Viro 	int rbytes;		/* number of bytes which will flow to the right neighbor from the right        */
2162f466c6fdSAl Viro 	/* most liquid item that cannot be shifted from S[0] entirely         */
2163f466c6fdSAl Viro 	/* if -1 then nothing will be partially shifted                           */
2164f466c6fdSAl Viro 	int s1bytes;		/* number of bytes which flow to the first  new node when S[0] splits   */
2165f466c6fdSAl Viro 	/* note: if S[0] splits into 3 nodes, then items do not need to be cut  */
2166f466c6fdSAl Viro 	int s2bytes;
2167f466c6fdSAl Viro 	struct buffer_head *buf_to_free[MAX_FREE_BLOCK];	/* buffers which are to be freed after do_balance finishes by unfix_nodes */
2168f466c6fdSAl Viro 	char *vn_buf;		/* kmalloced memory. Used to create
2169f466c6fdSAl Viro 				   virtual node and keep map of
2170f466c6fdSAl Viro 				   dirtied bitmap blocks */
2171f466c6fdSAl Viro 	int vn_buf_size;	/* size of the vn_buf */
2172f466c6fdSAl Viro 	struct virtual_node *tb_vn;	/* VN starts after bitmap of bitmap blocks */
2173f466c6fdSAl Viro 
2174f466c6fdSAl Viro 	int fs_gen;		/* saved value of `reiserfs_generation' counter
2175f466c6fdSAl Viro 				   see FILESYSTEM_CHANGED() macro in reiserfs_fs.h */
2176f466c6fdSAl Viro #ifdef DISPLACE_NEW_PACKING_LOCALITIES
2177f466c6fdSAl Viro 	struct in_core_key key;	/* key pointer, to pass to block allocator or
2178f466c6fdSAl Viro 				   another low-level subsystem */
2179f466c6fdSAl Viro #endif
2180f466c6fdSAl Viro };
2181f466c6fdSAl Viro 
2182f466c6fdSAl Viro /* These are modes of balancing */
2183f466c6fdSAl Viro 
2184f466c6fdSAl Viro /* When inserting an item. */
2185f466c6fdSAl Viro #define M_INSERT	'i'
2186f466c6fdSAl Viro /* When inserting into (directories only) or appending onto an already
2187f466c6fdSAl Viro    existent item. */
2188f466c6fdSAl Viro #define M_PASTE		'p'
2189f466c6fdSAl Viro /* When deleting an item. */
2190f466c6fdSAl Viro #define M_DELETE	'd'
2191f466c6fdSAl Viro /* When truncating an item or removing an entry from a (directory) item. */
2192f466c6fdSAl Viro #define M_CUT 		'c'
2193f466c6fdSAl Viro 
2194f466c6fdSAl Viro /* used when balancing on leaf level skipped (in reiserfsck) */
2195f466c6fdSAl Viro #define M_INTERNAL	'n'
2196f466c6fdSAl Viro 
2197f466c6fdSAl Viro /* When further balancing is not needed, then do_balance does not need
2198f466c6fdSAl Viro    to be called. */
2199f466c6fdSAl Viro #define M_SKIP_BALANCING 		's'
2200f466c6fdSAl Viro #define M_CONVERT	'v'
2201f466c6fdSAl Viro 
2202f466c6fdSAl Viro /* modes of leaf_move_items */
2203f466c6fdSAl Viro #define LEAF_FROM_S_TO_L 0
2204f466c6fdSAl Viro #define LEAF_FROM_S_TO_R 1
2205f466c6fdSAl Viro #define LEAF_FROM_R_TO_L 2
2206f466c6fdSAl Viro #define LEAF_FROM_L_TO_R 3
2207f466c6fdSAl Viro #define LEAF_FROM_S_TO_SNEW 4
2208f466c6fdSAl Viro 
2209f466c6fdSAl Viro #define FIRST_TO_LAST 0
2210f466c6fdSAl Viro #define LAST_TO_FIRST 1
2211f466c6fdSAl Viro 
2212f466c6fdSAl Viro /* used in do_balance for passing parent of node information that has
2213f466c6fdSAl Viro    been gotten from tb struct */
2214f466c6fdSAl Viro struct buffer_info {
2215f466c6fdSAl Viro 	struct tree_balance *tb;
2216f466c6fdSAl Viro 	struct buffer_head *bi_bh;
2217f466c6fdSAl Viro 	struct buffer_head *bi_parent;
2218f466c6fdSAl Viro 	int bi_position;
2219f466c6fdSAl Viro };
2220f466c6fdSAl Viro 
2221f466c6fdSAl Viro static inline struct super_block *sb_from_tb(struct tree_balance *tb)
2222f466c6fdSAl Viro {
2223f466c6fdSAl Viro 	return tb ? tb->tb_sb : NULL;
2224f466c6fdSAl Viro }
2225f466c6fdSAl Viro 
2226f466c6fdSAl Viro static inline struct super_block *sb_from_bi(struct buffer_info *bi)
2227f466c6fdSAl Viro {
2228f466c6fdSAl Viro 	return bi ? sb_from_tb(bi->tb) : NULL;
2229f466c6fdSAl Viro }
2230f466c6fdSAl Viro 
2231f466c6fdSAl Viro /* there are 4 types of items: stat data, directory item, indirect, direct.
2232f466c6fdSAl Viro +-------------------+------------+--------------+------------+
2233f466c6fdSAl Viro |	            |  k_offset  | k_uniqueness | mergeable? |
2234f466c6fdSAl Viro +-------------------+------------+--------------+------------+
2235f466c6fdSAl Viro |     stat data     |	0        |      0       |   no       |
2236f466c6fdSAl Viro +-------------------+------------+--------------+------------+
2237f466c6fdSAl Viro | 1st directory item| DOT_OFFSET |DIRENTRY_UNIQUENESS|   no       |
2238f466c6fdSAl Viro | non 1st directory | hash value |              |   yes      |
2239f466c6fdSAl Viro |     item          |            |              |            |
2240f466c6fdSAl Viro +-------------------+------------+--------------+------------+
2241f466c6fdSAl Viro | indirect item     | offset + 1 |TYPE_INDIRECT |   if this is not the first indirect item of the object
2242f466c6fdSAl Viro +-------------------+------------+--------------+------------+
2243f466c6fdSAl Viro | direct item       | offset + 1 |TYPE_DIRECT   | if not this is not the first direct item of the object
2244f466c6fdSAl Viro +-------------------+------------+--------------+------------+
2245f466c6fdSAl Viro */
2246f466c6fdSAl Viro 
2247f466c6fdSAl Viro struct item_operations {
2248f466c6fdSAl Viro 	int (*bytes_number) (struct item_head * ih, int block_size);
2249f466c6fdSAl Viro 	void (*decrement_key) (struct cpu_key *);
2250f466c6fdSAl Viro 	int (*is_left_mergeable) (struct reiserfs_key * ih,
2251f466c6fdSAl Viro 				  unsigned long bsize);
2252f466c6fdSAl Viro 	void (*print_item) (struct item_head *, char *item);
2253f466c6fdSAl Viro 	void (*check_item) (struct item_head *, char *item);
2254f466c6fdSAl Viro 
2255f466c6fdSAl Viro 	int (*create_vi) (struct virtual_node * vn, struct virtual_item * vi,
2256f466c6fdSAl Viro 			  int is_affected, int insert_size);
2257f466c6fdSAl Viro 	int (*check_left) (struct virtual_item * vi, int free,
2258f466c6fdSAl Viro 			   int start_skip, int end_skip);
2259f466c6fdSAl Viro 	int (*check_right) (struct virtual_item * vi, int free);
2260f466c6fdSAl Viro 	int (*part_size) (struct virtual_item * vi, int from, int to);
2261f466c6fdSAl Viro 	int (*unit_num) (struct virtual_item * vi);
2262f466c6fdSAl Viro 	void (*print_vi) (struct virtual_item * vi);
2263f466c6fdSAl Viro };
2264f466c6fdSAl Viro 
2265f466c6fdSAl Viro extern struct item_operations *item_ops[TYPE_ANY + 1];
2266f466c6fdSAl Viro 
2267f466c6fdSAl Viro #define op_bytes_number(ih,bsize)                    item_ops[le_ih_k_type (ih)]->bytes_number (ih, bsize)
2268f466c6fdSAl Viro #define op_is_left_mergeable(key,bsize)              item_ops[le_key_k_type (le_key_version (key), key)]->is_left_mergeable (key, bsize)
2269f466c6fdSAl Viro #define op_print_item(ih,item)                       item_ops[le_ih_k_type (ih)]->print_item (ih, item)
2270f466c6fdSAl Viro #define op_check_item(ih,item)                       item_ops[le_ih_k_type (ih)]->check_item (ih, item)
2271f466c6fdSAl Viro #define op_create_vi(vn,vi,is_affected,insert_size)  item_ops[le_ih_k_type ((vi)->vi_ih)]->create_vi (vn,vi,is_affected,insert_size)
2272f466c6fdSAl Viro #define op_check_left(vi,free,start_skip,end_skip) item_ops[(vi)->vi_index]->check_left (vi, free, start_skip, end_skip)
2273f466c6fdSAl Viro #define op_check_right(vi,free)                      item_ops[(vi)->vi_index]->check_right (vi, free)
2274f466c6fdSAl Viro #define op_part_size(vi,from,to)                     item_ops[(vi)->vi_index]->part_size (vi, from, to)
2275f466c6fdSAl Viro #define op_unit_num(vi)				     item_ops[(vi)->vi_index]->unit_num (vi)
2276f466c6fdSAl Viro #define op_print_vi(vi)                              item_ops[(vi)->vi_index]->print_vi (vi)
2277f466c6fdSAl Viro 
2278f466c6fdSAl Viro #define COMP_SHORT_KEYS comp_short_keys
2279f466c6fdSAl Viro 
2280f466c6fdSAl Viro /* number of blocks pointed to by the indirect item */
2281f466c6fdSAl Viro #define I_UNFM_NUM(ih)	(ih_item_len(ih) / UNFM_P_SIZE)
2282f466c6fdSAl Viro 
2283f466c6fdSAl Viro /* the used space within the unformatted node corresponding to pos within the item pointed to by ih */
2284f466c6fdSAl Viro #define I_POS_UNFM_SIZE(ih,pos,size) (((pos) == I_UNFM_NUM(ih) - 1 ) ? (size) - ih_free_space(ih) : (size))
2285f466c6fdSAl Viro 
2286f466c6fdSAl Viro /* number of bytes contained by the direct item or the unformatted nodes the indirect item points to */
2287f466c6fdSAl Viro 
2288f466c6fdSAl Viro     /* following defines use reiserfs buffer header and item header */
2289f466c6fdSAl Viro 
2290f466c6fdSAl Viro /* get stat-data */
2291f466c6fdSAl Viro #define B_I_STAT_DATA(bh, ih) ( (struct stat_data * )((bh)->b_data + ih_location(ih)) )
2292f466c6fdSAl Viro 
2293f466c6fdSAl Viro // this is 3976 for size==4096
2294f466c6fdSAl Viro #define MAX_DIRECT_ITEM_LEN(size) ((size) - BLKH_SIZE - 2*IH_SIZE - SD_SIZE - UNFM_P_SIZE)
2295f466c6fdSAl Viro 
2296f466c6fdSAl Viro /* indirect items consist of entries which contain blocknrs, pos
2297f466c6fdSAl Viro    indicates which entry, and B_I_POS_UNFM_POINTER resolves to the
2298f466c6fdSAl Viro    blocknr contained by the entry pos points to */
22994cf5f7adSJeff Mahoney #define B_I_POS_UNFM_POINTER(bh, ih, pos)				\
23004cf5f7adSJeff Mahoney 	le32_to_cpu(*(((unp_t *)ih_item_body(bh, ih)) + (pos)))
23014cf5f7adSJeff Mahoney #define PUT_B_I_POS_UNFM_POINTER(bh, ih, pos, val)			\
23024cf5f7adSJeff Mahoney 	(*(((unp_t *)ih_item_body(bh, ih)) + (pos)) = cpu_to_le32(val))
2303f466c6fdSAl Viro 
2304f466c6fdSAl Viro struct reiserfs_iget_args {
2305f466c6fdSAl Viro 	__u32 objectid;
2306f466c6fdSAl Viro 	__u32 dirid;
2307f466c6fdSAl Viro };
2308f466c6fdSAl Viro 
2309f466c6fdSAl Viro /***************************************************************************/
2310f466c6fdSAl Viro /*                    FUNCTION DECLARATIONS                                */
2311f466c6fdSAl Viro /***************************************************************************/
2312f466c6fdSAl Viro 
2313f466c6fdSAl Viro #define get_journal_desc_magic(bh) (bh->b_data + bh->b_size - 12)
2314f466c6fdSAl Viro 
2315f466c6fdSAl Viro #define journal_trans_half(blocksize) \
2316f466c6fdSAl Viro 	((blocksize - sizeof (struct reiserfs_journal_desc) + sizeof (__u32) - 12) / sizeof (__u32))
2317f466c6fdSAl Viro 
2318f466c6fdSAl Viro /* journal.c see journal.c for all the comments here */
2319f466c6fdSAl Viro 
2320f466c6fdSAl Viro /* first block written in a commit.  */
2321f466c6fdSAl Viro struct reiserfs_journal_desc {
2322f466c6fdSAl Viro 	__le32 j_trans_id;	/* id of commit */
2323f466c6fdSAl Viro 	__le32 j_len;		/* length of commit. len +1 is the commit block */
2324f466c6fdSAl Viro 	__le32 j_mount_id;	/* mount id of this trans */
2325f466c6fdSAl Viro 	__le32 j_realblock[1];	/* real locations for each block */
2326f466c6fdSAl Viro };
2327f466c6fdSAl Viro 
2328f466c6fdSAl Viro #define get_desc_trans_id(d)   le32_to_cpu((d)->j_trans_id)
2329f466c6fdSAl Viro #define get_desc_trans_len(d)  le32_to_cpu((d)->j_len)
2330f466c6fdSAl Viro #define get_desc_mount_id(d)   le32_to_cpu((d)->j_mount_id)
2331f466c6fdSAl Viro 
2332f466c6fdSAl Viro #define set_desc_trans_id(d,val)       do { (d)->j_trans_id = cpu_to_le32 (val); } while (0)
2333f466c6fdSAl Viro #define set_desc_trans_len(d,val)      do { (d)->j_len = cpu_to_le32 (val); } while (0)
2334f466c6fdSAl Viro #define set_desc_mount_id(d,val)       do { (d)->j_mount_id = cpu_to_le32 (val); } while (0)
2335f466c6fdSAl Viro 
2336f466c6fdSAl Viro /* last block written in a commit */
2337f466c6fdSAl Viro struct reiserfs_journal_commit {
2338f466c6fdSAl Viro 	__le32 j_trans_id;	/* must match j_trans_id from the desc block */
2339f466c6fdSAl Viro 	__le32 j_len;		/* ditto */
2340f466c6fdSAl Viro 	__le32 j_realblock[1];	/* real locations for each block */
2341f466c6fdSAl Viro };
2342f466c6fdSAl Viro 
2343f466c6fdSAl Viro #define get_commit_trans_id(c) le32_to_cpu((c)->j_trans_id)
2344f466c6fdSAl Viro #define get_commit_trans_len(c)        le32_to_cpu((c)->j_len)
2345f466c6fdSAl Viro #define get_commit_mount_id(c) le32_to_cpu((c)->j_mount_id)
2346f466c6fdSAl Viro 
2347f466c6fdSAl Viro #define set_commit_trans_id(c,val)     do { (c)->j_trans_id = cpu_to_le32 (val); } while (0)
2348f466c6fdSAl Viro #define set_commit_trans_len(c,val)    do { (c)->j_len = cpu_to_le32 (val); } while (0)
2349f466c6fdSAl Viro 
2350f466c6fdSAl Viro /* this header block gets written whenever a transaction is considered fully flushed, and is more recent than the
2351f466c6fdSAl Viro ** last fully flushed transaction.  fully flushed means all the log blocks and all the real blocks are on disk,
2352f466c6fdSAl Viro ** and this transaction does not need to be replayed.
2353f466c6fdSAl Viro */
2354f466c6fdSAl Viro struct reiserfs_journal_header {
2355f466c6fdSAl Viro 	__le32 j_last_flush_trans_id;	/* id of last fully flushed transaction */
2356f466c6fdSAl Viro 	__le32 j_first_unflushed_offset;	/* offset in the log of where to start replay after a crash */
2357f466c6fdSAl Viro 	__le32 j_mount_id;
2358f466c6fdSAl Viro 	/* 12 */ struct journal_params jh_journal;
2359f466c6fdSAl Viro };
2360f466c6fdSAl Viro 
2361f466c6fdSAl Viro /* biggest tunable defines are right here */
2362f466c6fdSAl Viro #define JOURNAL_BLOCK_COUNT 8192	/* number of blocks in the journal */
2363f466c6fdSAl Viro #define JOURNAL_TRANS_MAX_DEFAULT 1024	/* biggest possible single transaction, don't change for now (8/3/99) */
2364f466c6fdSAl Viro #define JOURNAL_TRANS_MIN_DEFAULT 256
2365f466c6fdSAl Viro #define JOURNAL_MAX_BATCH_DEFAULT   900	/* max blocks to batch into one transaction, don't make this any bigger than 900 */
2366f466c6fdSAl Viro #define JOURNAL_MIN_RATIO 2
2367f466c6fdSAl Viro #define JOURNAL_MAX_COMMIT_AGE 30
2368f466c6fdSAl Viro #define JOURNAL_MAX_TRANS_AGE 30
2369f466c6fdSAl Viro #define JOURNAL_PER_BALANCE_CNT (3 * (MAX_HEIGHT-2) + 9)
2370f466c6fdSAl Viro #define JOURNAL_BLOCKS_PER_OBJECT(sb)  (JOURNAL_PER_BALANCE_CNT * 3 + \
2371f466c6fdSAl Viro 					 2 * (REISERFS_QUOTA_INIT_BLOCKS(sb) + \
2372f466c6fdSAl Viro 					      REISERFS_QUOTA_TRANS_BLOCKS(sb)))
2373f466c6fdSAl Viro 
2374f466c6fdSAl Viro #ifdef CONFIG_QUOTA
2375f466c6fdSAl Viro #define REISERFS_QUOTA_OPTS ((1 << REISERFS_USRQUOTA) | (1 << REISERFS_GRPQUOTA))
2376f466c6fdSAl Viro /* We need to update data and inode (atime) */
2377f466c6fdSAl Viro #define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & REISERFS_QUOTA_OPTS ? 2 : 0)
2378f466c6fdSAl Viro /* 1 balancing, 1 bitmap, 1 data per write + stat data update */
2379f466c6fdSAl Viro #define REISERFS_QUOTA_INIT_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & REISERFS_QUOTA_OPTS ? \
2380f466c6fdSAl Viro (DQUOT_INIT_ALLOC*(JOURNAL_PER_BALANCE_CNT+2)+DQUOT_INIT_REWRITE+1) : 0)
2381f466c6fdSAl Viro /* same as with INIT */
2382f466c6fdSAl Viro #define REISERFS_QUOTA_DEL_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & REISERFS_QUOTA_OPTS ? \
2383f466c6fdSAl Viro (DQUOT_DEL_ALLOC*(JOURNAL_PER_BALANCE_CNT+2)+DQUOT_DEL_REWRITE+1) : 0)
2384f466c6fdSAl Viro #else
2385f466c6fdSAl Viro #define REISERFS_QUOTA_TRANS_BLOCKS(s) 0
2386f466c6fdSAl Viro #define REISERFS_QUOTA_INIT_BLOCKS(s) 0
2387f466c6fdSAl Viro #define REISERFS_QUOTA_DEL_BLOCKS(s) 0
2388f466c6fdSAl Viro #endif
2389f466c6fdSAl Viro 
2390f466c6fdSAl Viro /* both of these can be as low as 1, or as high as you want.  The min is the
2391f466c6fdSAl Viro ** number of 4k bitmap nodes preallocated on mount. New nodes are allocated
2392f466c6fdSAl Viro ** as needed, and released when transactions are committed.  On release, if
2393f466c6fdSAl Viro ** the current number of nodes is > max, the node is freed, otherwise,
2394f466c6fdSAl Viro ** it is put on a free list for faster use later.
2395f466c6fdSAl Viro */
2396f466c6fdSAl Viro #define REISERFS_MIN_BITMAP_NODES 10
2397f466c6fdSAl Viro #define REISERFS_MAX_BITMAP_NODES 100
2398f466c6fdSAl Viro 
2399f466c6fdSAl Viro #define JBH_HASH_SHIFT 13	/* these are based on journal hash size of 8192 */
2400f466c6fdSAl Viro #define JBH_HASH_MASK 8191
2401f466c6fdSAl Viro 
2402f466c6fdSAl Viro #define _jhashfn(sb,block)	\
2403f466c6fdSAl Viro 	(((unsigned long)sb>>L1_CACHE_SHIFT) ^ \
2404f466c6fdSAl Viro 	 (((block)<<(JBH_HASH_SHIFT - 6)) ^ ((block) >> 13) ^ ((block) << (JBH_HASH_SHIFT - 12))))
2405f466c6fdSAl Viro #define journal_hash(t,sb,block) ((t)[_jhashfn((sb),(block)) & JBH_HASH_MASK])
2406f466c6fdSAl Viro 
2407f466c6fdSAl Viro // We need these to make journal.c code more readable
2408f466c6fdSAl Viro #define journal_find_get_block(s, block) __find_get_block(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
2409f466c6fdSAl Viro #define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
2410f466c6fdSAl Viro #define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
2411f466c6fdSAl Viro 
2412f466c6fdSAl Viro enum reiserfs_bh_state_bits {
2413f466c6fdSAl Viro 	BH_JDirty = BH_PrivateStart,	/* buffer is in current transaction */
2414f466c6fdSAl Viro 	BH_JDirty_wait,
2415f466c6fdSAl Viro 	BH_JNew,		/* disk block was taken off free list before
2416f466c6fdSAl Viro 				 * being in a finished transaction, or
2417f466c6fdSAl Viro 				 * written to disk. Can be reused immed. */
2418f466c6fdSAl Viro 	BH_JPrepared,
2419f466c6fdSAl Viro 	BH_JRestore_dirty,
2420f466c6fdSAl Viro 	BH_JTest,		// debugging only will go away
2421f466c6fdSAl Viro };
2422f466c6fdSAl Viro 
2423f466c6fdSAl Viro BUFFER_FNS(JDirty, journaled);
2424f466c6fdSAl Viro TAS_BUFFER_FNS(JDirty, journaled);
2425f466c6fdSAl Viro BUFFER_FNS(JDirty_wait, journal_dirty);
2426f466c6fdSAl Viro TAS_BUFFER_FNS(JDirty_wait, journal_dirty);
2427f466c6fdSAl Viro BUFFER_FNS(JNew, journal_new);
2428f466c6fdSAl Viro TAS_BUFFER_FNS(JNew, journal_new);
2429f466c6fdSAl Viro BUFFER_FNS(JPrepared, journal_prepared);
2430f466c6fdSAl Viro TAS_BUFFER_FNS(JPrepared, journal_prepared);
2431f466c6fdSAl Viro BUFFER_FNS(JRestore_dirty, journal_restore_dirty);
2432f466c6fdSAl Viro TAS_BUFFER_FNS(JRestore_dirty, journal_restore_dirty);
2433f466c6fdSAl Viro BUFFER_FNS(JTest, journal_test);
2434f466c6fdSAl Viro TAS_BUFFER_FNS(JTest, journal_test);
2435f466c6fdSAl Viro 
2436f466c6fdSAl Viro /*
2437f466c6fdSAl Viro ** transaction handle which is passed around for all journal calls
2438f466c6fdSAl Viro */
2439f466c6fdSAl Viro struct reiserfs_transaction_handle {
2440f466c6fdSAl Viro 	struct super_block *t_super;	/* super for this FS when journal_begin was
2441f466c6fdSAl Viro 					   called. saves calls to reiserfs_get_super
2442f466c6fdSAl Viro 					   also used by nested transactions to make
2443f466c6fdSAl Viro 					   sure they are nesting on the right FS
2444f466c6fdSAl Viro 					   _must_ be first in the handle
2445f466c6fdSAl Viro 					 */
2446f466c6fdSAl Viro 	int t_refcount;
2447f466c6fdSAl Viro 	int t_blocks_logged;	/* number of blocks this writer has logged */
2448f466c6fdSAl Viro 	int t_blocks_allocated;	/* number of blocks this writer allocated */
2449f466c6fdSAl Viro 	unsigned int t_trans_id;	/* sanity check, equals the current trans id */
2450f466c6fdSAl Viro 	void *t_handle_save;	/* save existing current->journal_info */
2451f466c6fdSAl Viro 	unsigned displace_new_blocks:1;	/* if new block allocation occurres, that block
2452f466c6fdSAl Viro 					   should be displaced from others */
2453f466c6fdSAl Viro 	struct list_head t_list;
2454f466c6fdSAl Viro };
2455f466c6fdSAl Viro 
2456f466c6fdSAl Viro /* used to keep track of ordered and tail writes, attached to the buffer
2457f466c6fdSAl Viro  * head through b_journal_head.
2458f466c6fdSAl Viro  */
2459f466c6fdSAl Viro struct reiserfs_jh {
2460f466c6fdSAl Viro 	struct reiserfs_journal_list *jl;
2461f466c6fdSAl Viro 	struct buffer_head *bh;
2462f466c6fdSAl Viro 	struct list_head list;
2463f466c6fdSAl Viro };
2464f466c6fdSAl Viro 
2465f466c6fdSAl Viro void reiserfs_free_jh(struct buffer_head *bh);
2466f466c6fdSAl Viro int reiserfs_add_tail_list(struct inode *inode, struct buffer_head *bh);
2467f466c6fdSAl Viro int reiserfs_add_ordered_list(struct inode *inode, struct buffer_head *bh);
2468f466c6fdSAl Viro int journal_mark_dirty(struct reiserfs_transaction_handle *,
2469f466c6fdSAl Viro 		       struct super_block *, struct buffer_head *bh);
2470f466c6fdSAl Viro 
2471f466c6fdSAl Viro static inline int reiserfs_file_data_log(struct inode *inode)
2472f466c6fdSAl Viro {
2473f466c6fdSAl Viro 	if (reiserfs_data_log(inode->i_sb) ||
2474f466c6fdSAl Viro 	    (REISERFS_I(inode)->i_flags & i_data_log))
2475f466c6fdSAl Viro 		return 1;
2476f466c6fdSAl Viro 	return 0;
2477f466c6fdSAl Viro }
2478f466c6fdSAl Viro 
2479f466c6fdSAl Viro static inline int reiserfs_transaction_running(struct super_block *s)
2480f466c6fdSAl Viro {
2481f466c6fdSAl Viro 	struct reiserfs_transaction_handle *th = current->journal_info;
2482f466c6fdSAl Viro 	if (th && th->t_super == s)
2483f466c6fdSAl Viro 		return 1;
2484f466c6fdSAl Viro 	if (th && th->t_super == NULL)
2485f466c6fdSAl Viro 		BUG();
2486f466c6fdSAl Viro 	return 0;
2487f466c6fdSAl Viro }
2488f466c6fdSAl Viro 
2489f466c6fdSAl Viro static inline int reiserfs_transaction_free_space(struct reiserfs_transaction_handle *th)
2490f466c6fdSAl Viro {
2491f466c6fdSAl Viro 	return th->t_blocks_allocated - th->t_blocks_logged;
2492f466c6fdSAl Viro }
2493f466c6fdSAl Viro 
2494f466c6fdSAl Viro struct reiserfs_transaction_handle *reiserfs_persistent_transaction(struct
2495f466c6fdSAl Viro 								    super_block
2496f466c6fdSAl Viro 								    *,
2497f466c6fdSAl Viro 								    int count);
2498f466c6fdSAl Viro int reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *);
2499cfac4b47SMarco Stornelli void reiserfs_vfs_truncate_file(struct inode *inode);
2500f466c6fdSAl Viro int reiserfs_commit_page(struct inode *inode, struct page *page,
2501f466c6fdSAl Viro 			 unsigned from, unsigned to);
250225729b0eSArtem Bityutskiy void reiserfs_flush_old_commits(struct super_block *);
2503f466c6fdSAl Viro int reiserfs_commit_for_inode(struct inode *);
2504f466c6fdSAl Viro int reiserfs_inode_needs_commit(struct inode *);
2505f466c6fdSAl Viro void reiserfs_update_inode_transaction(struct inode *);
2506f466c6fdSAl Viro void reiserfs_wait_on_write_block(struct super_block *s);
2507f466c6fdSAl Viro void reiserfs_block_writes(struct reiserfs_transaction_handle *th);
2508f466c6fdSAl Viro void reiserfs_allow_writes(struct super_block *s);
2509f466c6fdSAl Viro void reiserfs_check_lock_depth(struct super_block *s, char *caller);
2510f466c6fdSAl Viro int reiserfs_prepare_for_journal(struct super_block *, struct buffer_head *bh,
2511f466c6fdSAl Viro 				 int wait);
2512f466c6fdSAl Viro void reiserfs_restore_prepared_buffer(struct super_block *,
2513f466c6fdSAl Viro 				      struct buffer_head *bh);
2514f466c6fdSAl Viro int journal_init(struct super_block *, const char *j_dev_name, int old_format,
2515f466c6fdSAl Viro 		 unsigned int);
2516f466c6fdSAl Viro int journal_release(struct reiserfs_transaction_handle *, struct super_block *);
2517f466c6fdSAl Viro int journal_release_error(struct reiserfs_transaction_handle *,
2518f466c6fdSAl Viro 			  struct super_block *);
2519f466c6fdSAl Viro int journal_end(struct reiserfs_transaction_handle *, struct super_block *,
2520f466c6fdSAl Viro 		unsigned long);
2521f466c6fdSAl Viro int journal_end_sync(struct reiserfs_transaction_handle *, struct super_block *,
2522f466c6fdSAl Viro 		     unsigned long);
2523f466c6fdSAl Viro int journal_mark_freed(struct reiserfs_transaction_handle *,
2524f466c6fdSAl Viro 		       struct super_block *, b_blocknr_t blocknr);
2525f466c6fdSAl Viro int journal_transaction_should_end(struct reiserfs_transaction_handle *, int);
2526f466c6fdSAl Viro int reiserfs_in_journal(struct super_block *sb, unsigned int bmap_nr,
2527f466c6fdSAl Viro 			 int bit_nr, int searchall, b_blocknr_t *next);
2528f466c6fdSAl Viro int journal_begin(struct reiserfs_transaction_handle *,
2529f466c6fdSAl Viro 		  struct super_block *sb, unsigned long);
2530f466c6fdSAl Viro int journal_join_abort(struct reiserfs_transaction_handle *,
2531f466c6fdSAl Viro 		       struct super_block *sb, unsigned long);
2532f466c6fdSAl Viro void reiserfs_abort_journal(struct super_block *sb, int errno);
2533f466c6fdSAl Viro void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...);
2534f466c6fdSAl Viro int reiserfs_allocate_list_bitmaps(struct super_block *s,
2535f466c6fdSAl Viro 				   struct reiserfs_list_bitmap *, unsigned int);
2536f466c6fdSAl Viro 
2537033369d1SArtem Bityutskiy void reiserfs_schedule_old_flush(struct super_block *s);
2538f466c6fdSAl Viro void add_save_link(struct reiserfs_transaction_handle *th,
2539f466c6fdSAl Viro 		   struct inode *inode, int truncate);
2540f466c6fdSAl Viro int remove_save_link(struct inode *inode, int truncate);
2541f466c6fdSAl Viro 
2542f466c6fdSAl Viro /* objectid.c */
2543f466c6fdSAl Viro __u32 reiserfs_get_unused_objectid(struct reiserfs_transaction_handle *th);
2544f466c6fdSAl Viro void reiserfs_release_objectid(struct reiserfs_transaction_handle *th,
2545f466c6fdSAl Viro 			       __u32 objectid_to_release);
2546f466c6fdSAl Viro int reiserfs_convert_objectid_map_v1(struct super_block *);
2547f466c6fdSAl Viro 
2548f466c6fdSAl Viro /* stree.c */
2549f466c6fdSAl Viro int B_IS_IN_TREE(const struct buffer_head *);
2550f466c6fdSAl Viro extern void copy_item_head(struct item_head *to,
2551f466c6fdSAl Viro 			   const struct item_head *from);
2552f466c6fdSAl Viro 
2553f466c6fdSAl Viro // first key is in cpu form, second - le
2554f466c6fdSAl Viro extern int comp_short_keys(const struct reiserfs_key *le_key,
2555f466c6fdSAl Viro 			   const struct cpu_key *cpu_key);
2556f466c6fdSAl Viro extern void le_key2cpu_key(struct cpu_key *to, const struct reiserfs_key *from);
2557f466c6fdSAl Viro 
2558f466c6fdSAl Viro // both are in le form
2559f466c6fdSAl Viro extern int comp_le_keys(const struct reiserfs_key *,
2560f466c6fdSAl Viro 			const struct reiserfs_key *);
2561f466c6fdSAl Viro extern int comp_short_le_keys(const struct reiserfs_key *,
2562f466c6fdSAl Viro 			      const struct reiserfs_key *);
2563f466c6fdSAl Viro 
2564f466c6fdSAl Viro //
2565f466c6fdSAl Viro // get key version from on disk key - kludge
2566f466c6fdSAl Viro //
2567f466c6fdSAl Viro static inline int le_key_version(const struct reiserfs_key *key)
2568f466c6fdSAl Viro {
2569f466c6fdSAl Viro 	int type;
2570f466c6fdSAl Viro 
2571f466c6fdSAl Viro 	type = offset_v2_k_type(&(key->u.k_offset_v2));
2572f466c6fdSAl Viro 	if (type != TYPE_DIRECT && type != TYPE_INDIRECT
2573f466c6fdSAl Viro 	    && type != TYPE_DIRENTRY)
2574f466c6fdSAl Viro 		return KEY_FORMAT_3_5;
2575f466c6fdSAl Viro 
2576f466c6fdSAl Viro 	return KEY_FORMAT_3_6;
2577f466c6fdSAl Viro 
2578f466c6fdSAl Viro }
2579f466c6fdSAl Viro 
2580f466c6fdSAl Viro static inline void copy_key(struct reiserfs_key *to,
2581f466c6fdSAl Viro 			    const struct reiserfs_key *from)
2582f466c6fdSAl Viro {
2583f466c6fdSAl Viro 	memcpy(to, from, KEY_SIZE);
2584f466c6fdSAl Viro }
2585f466c6fdSAl Viro 
2586f466c6fdSAl Viro int comp_items(const struct item_head *stored_ih, const struct treepath *path);
2587f466c6fdSAl Viro const struct reiserfs_key *get_rkey(const struct treepath *chk_path,
2588f466c6fdSAl Viro 				    const struct super_block *sb);
2589f466c6fdSAl Viro int search_by_key(struct super_block *, const struct cpu_key *,
2590f466c6fdSAl Viro 		  struct treepath *, int);
2591f466c6fdSAl Viro #define search_item(s,key,path) search_by_key (s, key, path, DISK_LEAF_NODE_LEVEL)
2592f466c6fdSAl Viro int search_for_position_by_key(struct super_block *sb,
2593f466c6fdSAl Viro 			       const struct cpu_key *cpu_key,
2594f466c6fdSAl Viro 			       struct treepath *search_path);
2595f466c6fdSAl Viro extern void decrement_bcount(struct buffer_head *bh);
2596f466c6fdSAl Viro void decrement_counters_in_path(struct treepath *search_path);
2597f466c6fdSAl Viro void pathrelse(struct treepath *search_path);
2598f466c6fdSAl Viro int reiserfs_check_path(struct treepath *p);
2599f466c6fdSAl Viro void pathrelse_and_restore(struct super_block *s, struct treepath *search_path);
2600f466c6fdSAl Viro 
2601f466c6fdSAl Viro int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
2602f466c6fdSAl Viro 			 struct treepath *path,
2603f466c6fdSAl Viro 			 const struct cpu_key *key,
2604f466c6fdSAl Viro 			 struct item_head *ih,
2605f466c6fdSAl Viro 			 struct inode *inode, const char *body);
2606f466c6fdSAl Viro 
2607f466c6fdSAl Viro int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th,
2608f466c6fdSAl Viro 			     struct treepath *path,
2609f466c6fdSAl Viro 			     const struct cpu_key *key,
2610f466c6fdSAl Viro 			     struct inode *inode,
2611f466c6fdSAl Viro 			     const char *body, int paste_size);
2612f466c6fdSAl Viro 
2613f466c6fdSAl Viro int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
2614f466c6fdSAl Viro 			   struct treepath *path,
2615f466c6fdSAl Viro 			   struct cpu_key *key,
2616f466c6fdSAl Viro 			   struct inode *inode,
2617f466c6fdSAl Viro 			   struct page *page, loff_t new_file_size);
2618f466c6fdSAl Viro 
2619f466c6fdSAl Viro int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
2620f466c6fdSAl Viro 			 struct treepath *path,
2621f466c6fdSAl Viro 			 const struct cpu_key *key,
2622f466c6fdSAl Viro 			 struct inode *inode, struct buffer_head *un_bh);
2623f466c6fdSAl Viro 
2624f466c6fdSAl Viro void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
2625f466c6fdSAl Viro 				struct inode *inode, struct reiserfs_key *key);
2626f466c6fdSAl Viro int reiserfs_delete_object(struct reiserfs_transaction_handle *th,
2627f466c6fdSAl Viro 			   struct inode *inode);
2628f466c6fdSAl Viro int reiserfs_do_truncate(struct reiserfs_transaction_handle *th,
2629f466c6fdSAl Viro 			 struct inode *inode, struct page *,
2630f466c6fdSAl Viro 			 int update_timestamps);
2631f466c6fdSAl Viro 
2632f466c6fdSAl Viro #define i_block_size(inode) ((inode)->i_sb->s_blocksize)
2633f466c6fdSAl Viro #define file_size(inode) ((inode)->i_size)
2634f466c6fdSAl Viro #define tail_size(inode) (file_size (inode) & (i_block_size (inode) - 1))
2635f466c6fdSAl Viro 
2636f466c6fdSAl Viro #define tail_has_to_be_packed(inode) (have_large_tails ((inode)->i_sb)?\
2637f466c6fdSAl Viro !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 )
2638f466c6fdSAl Viro 
2639f466c6fdSAl Viro void padd_item(char *item, int total_length, int length);
2640f466c6fdSAl Viro 
2641f466c6fdSAl Viro /* inode.c */
2642f466c6fdSAl Viro /* args for the create parameter of reiserfs_get_block */
2643f466c6fdSAl Viro #define GET_BLOCK_NO_CREATE 0	/* don't create new blocks or convert tails */
2644f466c6fdSAl Viro #define GET_BLOCK_CREATE 1	/* add anything you need to find block */
2645f466c6fdSAl Viro #define GET_BLOCK_NO_HOLE 2	/* return -ENOENT for file holes */
2646f466c6fdSAl Viro #define GET_BLOCK_READ_DIRECT 4	/* read the tail if indirect item not found */
2647f466c6fdSAl Viro #define GET_BLOCK_NO_IMUX     8	/* i_mutex is not held, don't preallocate */
2648f466c6fdSAl Viro #define GET_BLOCK_NO_DANGLE   16	/* don't leave any transactions running */
2649f466c6fdSAl Viro 
2650f466c6fdSAl Viro void reiserfs_read_locked_inode(struct inode *inode,
2651f466c6fdSAl Viro 				struct reiserfs_iget_args *args);
2652f466c6fdSAl Viro int reiserfs_find_actor(struct inode *inode, void *p);
2653f466c6fdSAl Viro int reiserfs_init_locked_inode(struct inode *inode, void *p);
2654f466c6fdSAl Viro void reiserfs_evict_inode(struct inode *inode);
2655f466c6fdSAl Viro int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc);
2656f466c6fdSAl Viro int reiserfs_get_block(struct inode *inode, sector_t block,
2657f466c6fdSAl Viro 		       struct buffer_head *bh_result, int create);
2658f466c6fdSAl Viro struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
2659f466c6fdSAl Viro 				     int fh_len, int fh_type);
2660f466c6fdSAl Viro struct dentry *reiserfs_fh_to_parent(struct super_block *sb, struct fid *fid,
2661f466c6fdSAl Viro 				     int fh_len, int fh_type);
2662b0b0382bSAl Viro int reiserfs_encode_fh(struct inode *inode, __u32 * data, int *lenp,
2663b0b0382bSAl Viro 		       struct inode *parent);
2664f466c6fdSAl Viro 
2665f466c6fdSAl Viro int reiserfs_truncate_file(struct inode *, int update_timestamps);
2666f466c6fdSAl Viro void make_cpu_key(struct cpu_key *cpu_key, struct inode *inode, loff_t offset,
2667f466c6fdSAl Viro 		  int type, int key_length);
2668f466c6fdSAl Viro void make_le_item_head(struct item_head *ih, const struct cpu_key *key,
2669f466c6fdSAl Viro 		       int version,
2670f466c6fdSAl Viro 		       loff_t offset, int type, int length, int entry_count);
2671f466c6fdSAl Viro struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key);
2672f466c6fdSAl Viro 
2673f466c6fdSAl Viro struct reiserfs_security_handle;
2674f466c6fdSAl Viro int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
2675f466c6fdSAl Viro 		       struct inode *dir, umode_t mode,
2676f466c6fdSAl Viro 		       const char *symname, loff_t i_size,
2677f466c6fdSAl Viro 		       struct dentry *dentry, struct inode *inode,
2678f466c6fdSAl Viro 		       struct reiserfs_security_handle *security);
2679f466c6fdSAl Viro 
2680f466c6fdSAl Viro void reiserfs_update_sd_size(struct reiserfs_transaction_handle *th,
2681f466c6fdSAl Viro 			     struct inode *inode, loff_t size);
2682f466c6fdSAl Viro 
2683f466c6fdSAl Viro static inline void reiserfs_update_sd(struct reiserfs_transaction_handle *th,
2684f466c6fdSAl Viro 				      struct inode *inode)
2685f466c6fdSAl Viro {
2686f466c6fdSAl Viro 	reiserfs_update_sd_size(th, inode, inode->i_size);
2687f466c6fdSAl Viro }
2688f466c6fdSAl Viro 
2689f466c6fdSAl Viro void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode);
2690f466c6fdSAl Viro void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs);
2691f466c6fdSAl Viro int reiserfs_setattr(struct dentry *dentry, struct iattr *attr);
2692f466c6fdSAl Viro 
2693f466c6fdSAl Viro int __reiserfs_write_begin(struct page *page, unsigned from, unsigned len);
2694f466c6fdSAl Viro 
2695f466c6fdSAl Viro /* namei.c */
2696f466c6fdSAl Viro void set_de_name_and_namelen(struct reiserfs_dir_entry *de);
2697f466c6fdSAl Viro int search_by_entry_key(struct super_block *sb, const struct cpu_key *key,
2698f466c6fdSAl Viro 			struct treepath *path, struct reiserfs_dir_entry *de);
2699f466c6fdSAl Viro struct dentry *reiserfs_get_parent(struct dentry *);
2700f466c6fdSAl Viro 
2701f466c6fdSAl Viro #ifdef CONFIG_REISERFS_PROC_INFO
2702f466c6fdSAl Viro int reiserfs_proc_info_init(struct super_block *sb);
2703f466c6fdSAl Viro int reiserfs_proc_info_done(struct super_block *sb);
2704f466c6fdSAl Viro int reiserfs_proc_info_global_init(void);
2705f466c6fdSAl Viro int reiserfs_proc_info_global_done(void);
2706f466c6fdSAl Viro 
2707f466c6fdSAl Viro #define PROC_EXP( e )   e
2708f466c6fdSAl Viro 
2709f466c6fdSAl Viro #define __PINFO( sb ) REISERFS_SB(sb) -> s_proc_info_data
2710f466c6fdSAl Viro #define PROC_INFO_MAX( sb, field, value )								\
2711f466c6fdSAl Viro     __PINFO( sb ).field =												\
2712f466c6fdSAl Viro         max( REISERFS_SB( sb ) -> s_proc_info_data.field, value )
2713f466c6fdSAl Viro #define PROC_INFO_INC( sb, field ) ( ++ ( __PINFO( sb ).field ) )
2714f466c6fdSAl Viro #define PROC_INFO_ADD( sb, field, val ) ( __PINFO( sb ).field += ( val ) )
2715f466c6fdSAl Viro #define PROC_INFO_BH_STAT( sb, bh, level )							\
2716f466c6fdSAl Viro     PROC_INFO_INC( sb, sbk_read_at[ ( level ) ] );						\
2717f466c6fdSAl Viro     PROC_INFO_ADD( sb, free_at[ ( level ) ], B_FREE_SPACE( bh ) );	\
2718f466c6fdSAl Viro     PROC_INFO_ADD( sb, items_at[ ( level ) ], B_NR_ITEMS( bh ) )
2719f466c6fdSAl Viro #else
2720f466c6fdSAl Viro static inline int reiserfs_proc_info_init(struct super_block *sb)
2721f466c6fdSAl Viro {
2722f466c6fdSAl Viro 	return 0;
2723f466c6fdSAl Viro }
2724f466c6fdSAl Viro 
2725f466c6fdSAl Viro static inline int reiserfs_proc_info_done(struct super_block *sb)
2726f466c6fdSAl Viro {
2727f466c6fdSAl Viro 	return 0;
2728f466c6fdSAl Viro }
2729f466c6fdSAl Viro 
2730f466c6fdSAl Viro static inline int reiserfs_proc_info_global_init(void)
2731f466c6fdSAl Viro {
2732f466c6fdSAl Viro 	return 0;
2733f466c6fdSAl Viro }
2734f466c6fdSAl Viro 
2735f466c6fdSAl Viro static inline int reiserfs_proc_info_global_done(void)
2736f466c6fdSAl Viro {
2737f466c6fdSAl Viro 	return 0;
2738f466c6fdSAl Viro }
2739f466c6fdSAl Viro 
2740f466c6fdSAl Viro #define PROC_EXP( e )
2741f466c6fdSAl Viro #define VOID_V ( ( void ) 0 )
2742f466c6fdSAl Viro #define PROC_INFO_MAX( sb, field, value ) VOID_V
2743f466c6fdSAl Viro #define PROC_INFO_INC( sb, field ) VOID_V
2744f466c6fdSAl Viro #define PROC_INFO_ADD( sb, field, val ) VOID_V
2745f466c6fdSAl Viro #define PROC_INFO_BH_STAT(sb, bh, n_node_level) VOID_V
2746f466c6fdSAl Viro #endif
2747f466c6fdSAl Viro 
2748f466c6fdSAl Viro /* dir.c */
2749f466c6fdSAl Viro extern const struct inode_operations reiserfs_dir_inode_operations;
2750f466c6fdSAl Viro extern const struct inode_operations reiserfs_symlink_inode_operations;
2751f466c6fdSAl Viro extern const struct inode_operations reiserfs_special_inode_operations;
2752f466c6fdSAl Viro extern const struct file_operations reiserfs_dir_operations;
2753cd62cdaeSAl Viro int reiserfs_readdir_inode(struct inode *, struct dir_context *);
2754f466c6fdSAl Viro 
2755f466c6fdSAl Viro /* tail_conversion.c */
2756f466c6fdSAl Viro int direct2indirect(struct reiserfs_transaction_handle *, struct inode *,
2757f466c6fdSAl Viro 		    struct treepath *, struct buffer_head *, loff_t);
2758f466c6fdSAl Viro int indirect2direct(struct reiserfs_transaction_handle *, struct inode *,
2759f466c6fdSAl Viro 		    struct page *, struct treepath *, const struct cpu_key *,
2760f466c6fdSAl Viro 		    loff_t, char *);
2761f466c6fdSAl Viro void reiserfs_unmap_buffer(struct buffer_head *);
2762f466c6fdSAl Viro 
2763f466c6fdSAl Viro /* file.c */
2764f466c6fdSAl Viro extern const struct inode_operations reiserfs_file_inode_operations;
2765f466c6fdSAl Viro extern const struct file_operations reiserfs_file_operations;
2766f466c6fdSAl Viro extern const struct address_space_operations reiserfs_address_space_operations;
2767f466c6fdSAl Viro 
2768f466c6fdSAl Viro /* fix_nodes.c */
2769f466c6fdSAl Viro 
2770f466c6fdSAl Viro int fix_nodes(int n_op_mode, struct tree_balance *tb,
2771f466c6fdSAl Viro 	      struct item_head *ins_ih, const void *);
2772f466c6fdSAl Viro void unfix_nodes(struct tree_balance *);
2773f466c6fdSAl Viro 
2774f466c6fdSAl Viro /* prints.c */
2775f466c6fdSAl Viro void __reiserfs_panic(struct super_block *s, const char *id,
2776f466c6fdSAl Viro 		      const char *function, const char *fmt, ...)
2777f466c6fdSAl Viro     __attribute__ ((noreturn));
2778f466c6fdSAl Viro #define reiserfs_panic(s, id, fmt, args...) \
2779f466c6fdSAl Viro 	__reiserfs_panic(s, id, __func__, fmt, ##args)
2780f466c6fdSAl Viro void __reiserfs_error(struct super_block *s, const char *id,
2781f466c6fdSAl Viro 		      const char *function, const char *fmt, ...);
2782f466c6fdSAl Viro #define reiserfs_error(s, id, fmt, args...) \
2783f466c6fdSAl Viro 	 __reiserfs_error(s, id, __func__, fmt, ##args)
2784f466c6fdSAl Viro void reiserfs_info(struct super_block *s, const char *fmt, ...);
2785f466c6fdSAl Viro void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...);
2786f466c6fdSAl Viro void print_indirect_item(struct buffer_head *bh, int item_num);
2787f466c6fdSAl Viro void store_print_tb(struct tree_balance *tb);
2788f466c6fdSAl Viro void print_cur_tb(char *mes);
2789f466c6fdSAl Viro void print_de(struct reiserfs_dir_entry *de);
2790f466c6fdSAl Viro void print_bi(struct buffer_info *bi, char *mes);
2791f466c6fdSAl Viro #define PRINT_LEAF_ITEMS 1	/* print all items */
2792f466c6fdSAl Viro #define PRINT_DIRECTORY_ITEMS 2	/* print directory items */
2793f466c6fdSAl Viro #define PRINT_DIRECT_ITEMS 4	/* print contents of direct items */
2794f466c6fdSAl Viro void print_block(struct buffer_head *bh, ...);
2795f466c6fdSAl Viro void print_bmap(struct super_block *s, int silent);
2796f466c6fdSAl Viro void print_bmap_block(int i, char *data, int size, int silent);
2797f466c6fdSAl Viro /*void print_super_block (struct super_block * s, char * mes);*/
2798f466c6fdSAl Viro void print_objectid_map(struct super_block *s);
2799f466c6fdSAl Viro void print_block_head(struct buffer_head *bh, char *mes);
2800f466c6fdSAl Viro void check_leaf(struct buffer_head *bh);
2801f466c6fdSAl Viro void check_internal(struct buffer_head *bh);
2802f466c6fdSAl Viro void print_statistics(struct super_block *s);
2803f466c6fdSAl Viro char *reiserfs_hashname(int code);
2804f466c6fdSAl Viro 
2805f466c6fdSAl Viro /* lbalance.c */
2806f466c6fdSAl Viro int leaf_move_items(int shift_mode, struct tree_balance *tb, int mov_num,
2807f466c6fdSAl Viro 		    int mov_bytes, struct buffer_head *Snew);
2808f466c6fdSAl Viro int leaf_shift_left(struct tree_balance *tb, int shift_num, int shift_bytes);
2809f466c6fdSAl Viro int leaf_shift_right(struct tree_balance *tb, int shift_num, int shift_bytes);
2810f466c6fdSAl Viro void leaf_delete_items(struct buffer_info *cur_bi, int last_first, int first,
2811f466c6fdSAl Viro 		       int del_num, int del_bytes);
2812f466c6fdSAl Viro void leaf_insert_into_buf(struct buffer_info *bi, int before,
2813f466c6fdSAl Viro 			  struct item_head *inserted_item_ih,
2814f466c6fdSAl Viro 			  const char *inserted_item_body, int zeros_number);
2815f466c6fdSAl Viro void leaf_paste_in_buffer(struct buffer_info *bi, int pasted_item_num,
2816f466c6fdSAl Viro 			  int pos_in_item, int paste_size, const char *body,
2817f466c6fdSAl Viro 			  int zeros_number);
2818f466c6fdSAl Viro void leaf_cut_from_buffer(struct buffer_info *bi, int cut_item_num,
2819f466c6fdSAl Viro 			  int pos_in_item, int cut_size);
2820f466c6fdSAl Viro void leaf_paste_entries(struct buffer_info *bi, int item_num, int before,
2821f466c6fdSAl Viro 			int new_entry_count, struct reiserfs_de_head *new_dehs,
2822f466c6fdSAl Viro 			const char *records, int paste_size);
2823f466c6fdSAl Viro /* ibalance.c */
2824f466c6fdSAl Viro int balance_internal(struct tree_balance *, int, int, struct item_head *,
2825f466c6fdSAl Viro 		     struct buffer_head **);
2826f466c6fdSAl Viro 
2827f466c6fdSAl Viro /* do_balance.c */
2828f466c6fdSAl Viro void do_balance_mark_leaf_dirty(struct tree_balance *tb,
2829f466c6fdSAl Viro 				struct buffer_head *bh, int flag);
2830f466c6fdSAl Viro #define do_balance_mark_internal_dirty do_balance_mark_leaf_dirty
2831f466c6fdSAl Viro #define do_balance_mark_sb_dirty do_balance_mark_leaf_dirty
2832f466c6fdSAl Viro 
2833f466c6fdSAl Viro void do_balance(struct tree_balance *tb, struct item_head *ih,
2834f466c6fdSAl Viro 		const char *body, int flag);
2835f466c6fdSAl Viro void reiserfs_invalidate_buffer(struct tree_balance *tb,
2836f466c6fdSAl Viro 				struct buffer_head *bh);
2837f466c6fdSAl Viro 
2838f466c6fdSAl Viro int get_left_neighbor_position(struct tree_balance *tb, int h);
2839f466c6fdSAl Viro int get_right_neighbor_position(struct tree_balance *tb, int h);
2840f466c6fdSAl Viro void replace_key(struct tree_balance *tb, struct buffer_head *, int,
2841f466c6fdSAl Viro 		 struct buffer_head *, int);
2842f466c6fdSAl Viro void make_empty_node(struct buffer_info *);
2843f466c6fdSAl Viro struct buffer_head *get_FEB(struct tree_balance *);
2844f466c6fdSAl Viro 
2845f466c6fdSAl Viro /* bitmap.c */
2846f466c6fdSAl Viro 
2847f466c6fdSAl Viro /* structure contains hints for block allocator, and it is a container for
2848f466c6fdSAl Viro  * arguments, such as node, search path, transaction_handle, etc. */
2849f466c6fdSAl Viro struct __reiserfs_blocknr_hint {
2850f466c6fdSAl Viro 	struct inode *inode;	/* inode passed to allocator, if we allocate unf. nodes */
2851f466c6fdSAl Viro 	sector_t block;		/* file offset, in blocks */
2852f466c6fdSAl Viro 	struct in_core_key key;
2853f466c6fdSAl Viro 	struct treepath *path;	/* search path, used by allocator to deternine search_start by
2854f466c6fdSAl Viro 				 * various ways */
2855f466c6fdSAl Viro 	struct reiserfs_transaction_handle *th;	/* transaction handle is needed to log super blocks and
2856f466c6fdSAl Viro 						 * bitmap blocks changes  */
2857f466c6fdSAl Viro 	b_blocknr_t beg, end;
2858f466c6fdSAl Viro 	b_blocknr_t search_start;	/* a field used to transfer search start value (block number)
2859f466c6fdSAl Viro 					 * between different block allocator procedures
2860f466c6fdSAl Viro 					 * (determine_search_start() and others) */
2861f466c6fdSAl Viro 	int prealloc_size;	/* is set in determine_prealloc_size() function, used by underlayed
2862f466c6fdSAl Viro 				 * function that do actual allocation */
2863f466c6fdSAl Viro 
2864f466c6fdSAl Viro 	unsigned formatted_node:1;	/* the allocator uses different polices for getting disk space for
2865f466c6fdSAl Viro 					 * formatted/unformatted blocks with/without preallocation */
2866f466c6fdSAl Viro 	unsigned preallocate:1;
2867f466c6fdSAl Viro };
2868f466c6fdSAl Viro 
2869f466c6fdSAl Viro typedef struct __reiserfs_blocknr_hint reiserfs_blocknr_hint_t;
2870f466c6fdSAl Viro 
2871f466c6fdSAl Viro int reiserfs_parse_alloc_options(struct super_block *, char *);
2872f466c6fdSAl Viro void reiserfs_init_alloc_options(struct super_block *s);
2873f466c6fdSAl Viro 
2874f466c6fdSAl Viro /*
2875f466c6fdSAl Viro  * given a directory, this will tell you what packing locality
2876f466c6fdSAl Viro  * to use for a new object underneat it.  The locality is returned
2877f466c6fdSAl Viro  * in disk byte order (le).
2878f466c6fdSAl Viro  */
2879f466c6fdSAl Viro __le32 reiserfs_choose_packing(struct inode *dir);
2880f466c6fdSAl Viro 
2881ea0856cdSRashika Kheria void show_alloc_options(struct seq_file *seq, struct super_block *s);
2882f466c6fdSAl Viro int reiserfs_init_bitmap_cache(struct super_block *sb);
2883f466c6fdSAl Viro void reiserfs_free_bitmap_cache(struct super_block *sb);
2884f466c6fdSAl Viro void reiserfs_cache_bitmap_metadata(struct super_block *sb, struct buffer_head *bh, struct reiserfs_bitmap_info *info);
2885f466c6fdSAl Viro struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb, unsigned int bitmap);
2886f466c6fdSAl Viro int is_reusable(struct super_block *s, b_blocknr_t block, int bit_value);
2887f466c6fdSAl Viro void reiserfs_free_block(struct reiserfs_transaction_handle *th, struct inode *,
2888f466c6fdSAl Viro 			 b_blocknr_t, int for_unformatted);
2889f466c6fdSAl Viro int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *, b_blocknr_t *, int,
2890f466c6fdSAl Viro 			       int);
2891f466c6fdSAl Viro static inline int reiserfs_new_form_blocknrs(struct tree_balance *tb,
2892f466c6fdSAl Viro 					     b_blocknr_t * new_blocknrs,
2893f466c6fdSAl Viro 					     int amount_needed)
2894f466c6fdSAl Viro {
2895f466c6fdSAl Viro 	reiserfs_blocknr_hint_t hint = {
2896f466c6fdSAl Viro 		.th = tb->transaction_handle,
2897f466c6fdSAl Viro 		.path = tb->tb_path,
2898f466c6fdSAl Viro 		.inode = NULL,
2899f466c6fdSAl Viro 		.key = tb->key,
2900f466c6fdSAl Viro 		.block = 0,
2901f466c6fdSAl Viro 		.formatted_node = 1
2902f466c6fdSAl Viro 	};
2903f466c6fdSAl Viro 	return reiserfs_allocate_blocknrs(&hint, new_blocknrs, amount_needed,
2904f466c6fdSAl Viro 					  0);
2905f466c6fdSAl Viro }
2906f466c6fdSAl Viro 
2907f466c6fdSAl Viro static inline int reiserfs_new_unf_blocknrs(struct reiserfs_transaction_handle
2908f466c6fdSAl Viro 					    *th, struct inode *inode,
2909f466c6fdSAl Viro 					    b_blocknr_t * new_blocknrs,
2910f466c6fdSAl Viro 					    struct treepath *path,
2911f466c6fdSAl Viro 					    sector_t block)
2912f466c6fdSAl Viro {
2913f466c6fdSAl Viro 	reiserfs_blocknr_hint_t hint = {
2914f466c6fdSAl Viro 		.th = th,
2915f466c6fdSAl Viro 		.path = path,
2916f466c6fdSAl Viro 		.inode = inode,
2917f466c6fdSAl Viro 		.block = block,
2918f466c6fdSAl Viro 		.formatted_node = 0,
2919f466c6fdSAl Viro 		.preallocate = 0
2920f466c6fdSAl Viro 	};
2921f466c6fdSAl Viro 	return reiserfs_allocate_blocknrs(&hint, new_blocknrs, 1, 0);
2922f466c6fdSAl Viro }
2923f466c6fdSAl Viro 
2924f466c6fdSAl Viro #ifdef REISERFS_PREALLOCATE
2925f466c6fdSAl Viro static inline int reiserfs_new_unf_blocknrs2(struct reiserfs_transaction_handle
2926f466c6fdSAl Viro 					     *th, struct inode *inode,
2927f466c6fdSAl Viro 					     b_blocknr_t * new_blocknrs,
2928f466c6fdSAl Viro 					     struct treepath *path,
2929f466c6fdSAl Viro 					     sector_t block)
2930f466c6fdSAl Viro {
2931f466c6fdSAl Viro 	reiserfs_blocknr_hint_t hint = {
2932f466c6fdSAl Viro 		.th = th,
2933f466c6fdSAl Viro 		.path = path,
2934f466c6fdSAl Viro 		.inode = inode,
2935f466c6fdSAl Viro 		.block = block,
2936f466c6fdSAl Viro 		.formatted_node = 0,
2937f466c6fdSAl Viro 		.preallocate = 1
2938f466c6fdSAl Viro 	};
2939f466c6fdSAl Viro 	return reiserfs_allocate_blocknrs(&hint, new_blocknrs, 1, 0);
2940f466c6fdSAl Viro }
2941f466c6fdSAl Viro 
2942f466c6fdSAl Viro void reiserfs_discard_prealloc(struct reiserfs_transaction_handle *th,
2943f466c6fdSAl Viro 			       struct inode *inode);
2944f466c6fdSAl Viro void reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle *th);
2945f466c6fdSAl Viro #endif
2946f466c6fdSAl Viro 
2947f466c6fdSAl Viro /* hashes.c */
2948f466c6fdSAl Viro __u32 keyed_hash(const signed char *msg, int len);
2949f466c6fdSAl Viro __u32 yura_hash(const signed char *msg, int len);
2950f466c6fdSAl Viro __u32 r5_hash(const signed char *msg, int len);
2951f466c6fdSAl Viro 
2952f466c6fdSAl Viro #define reiserfs_set_le_bit		__set_bit_le
2953f466c6fdSAl Viro #define reiserfs_test_and_set_le_bit	__test_and_set_bit_le
2954f466c6fdSAl Viro #define reiserfs_clear_le_bit		__clear_bit_le
2955f466c6fdSAl Viro #define reiserfs_test_and_clear_le_bit	__test_and_clear_bit_le
2956f466c6fdSAl Viro #define reiserfs_test_le_bit		test_bit_le
2957f466c6fdSAl Viro #define reiserfs_find_next_zero_le_bit	find_next_zero_bit_le
2958f466c6fdSAl Viro 
2959f466c6fdSAl Viro /* sometimes reiserfs_truncate may require to allocate few new blocks
2960f466c6fdSAl Viro    to perform indirect2direct conversion. People probably used to
2961f466c6fdSAl Viro    think, that truncate should work without problems on a filesystem
2962f466c6fdSAl Viro    without free disk space. They may complain that they can not
2963f466c6fdSAl Viro    truncate due to lack of free disk space. This spare space allows us
2964f466c6fdSAl Viro    to not worry about it. 500 is probably too much, but it should be
2965f466c6fdSAl Viro    absolutely safe */
2966f466c6fdSAl Viro #define SPARE_SPACE 500
2967f466c6fdSAl Viro 
2968f466c6fdSAl Viro /* prototypes from ioctl.c */
2969f466c6fdSAl Viro long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
2970f466c6fdSAl Viro long reiserfs_compat_ioctl(struct file *filp,
2971f466c6fdSAl Viro 		   unsigned int cmd, unsigned long arg);
2972f466c6fdSAl Viro int reiserfs_unpack(struct inode *inode, struct file *filp);
2973