1
2
3
4
5
6
7
8
9
10
11#ifndef _LINUX_REISER_FS_H
12#define _LINUX_REISER_FS_H
13
14#include <linux/types.h>
15#include <linux/magic.h>
16
17#ifdef __KERNEL__
18#include <linux/slab.h>
19#include <linux/interrupt.h>
20#include <linux/sched.h>
21#include <linux/workqueue.h>
22#include <asm/unaligned.h>
23#include <linux/bitops.h>
24#include <linux/proc_fs.h>
25#include <linux/smp_lock.h>
26#include <linux/buffer_head.h>
27#include <linux/reiserfs_fs_i.h>
28#include <linux/reiserfs_fs_sb.h>
29#endif
30
31struct fid;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63#define USE_INODE_GENERATION_COUNTER
64
65#define REISERFS_PREALLOCATE
66#define DISPLACE_NEW_PACKING_LOCALITIES
67#define PREALLOCATION_SIZE 9
68
69
70#define _ROUND_UP(x,n) (((x)+(n)-1u) & ~((n)-1u))
71
72
73
74
75#define ROUND_UP(x) _ROUND_UP(x,8LL)
76
77
78
79
80#define REISERFS_DEBUG_CODE 5
81
82void reiserfs_warning(struct super_block *s, const char *fmt, ...);
83
84
85
86#define __RASSERT( cond, scond, format, args... ) \
87if( !( cond ) ) \
88 reiserfs_panic( NULL, "reiserfs[%i]: assertion " scond " failed at " \
89 __FILE__ ":%i:%s: " format "\n", \
90 in_interrupt() ? -1 : task_pid_nr(current), __LINE__ , __FUNCTION__ , ##args )
91
92#define RASSERT(cond, format, args...) __RASSERT(cond, #cond, format, ##args)
93
94#if defined( CONFIG_REISERFS_CHECK )
95#define RFALSE(cond, format, args...) __RASSERT(!(cond), "!(" #cond ")", format, ##args)
96#else
97#define RFALSE( cond, format, args... ) do {;} while( 0 )
98#endif
99
100#define CONSTF __attribute_const__
101
102
103
104
105
106
107
108
109
110
111
112
113#define UNSET_HASH 0
114
115#define TEA_HASH 1
116#define YURA_HASH 2
117#define R5_HASH 3
118#define DEFAULT_HASH R5_HASH
119
120struct journal_params {
121 __le32 jp_journal_1st_block;
122
123 __le32 jp_journal_dev;
124 __le32 jp_journal_size;
125 __le32 jp_journal_trans_max;
126 __le32 jp_journal_magic;
127
128 __le32 jp_journal_max_batch;
129
130 __le32 jp_journal_max_commit_age;
131
132 __le32 jp_journal_max_trans_age;
133
134};
135
136
137struct reiserfs_super_block_v1 {
138 __le32 s_block_count;
139 __le32 s_free_blocks;
140 __le32 s_root_block;
141 struct journal_params s_journal;
142 __le16 s_blocksize;
143 __le16 s_oid_maxsize;
144
145 __le16 s_oid_cursize;
146 __le16 s_umount_state;
147
148 char s_magic[10];
149
150
151 __le16 s_fs_state;
152
153 __le32 s_hash_function_code;
154
155 __le16 s_tree_height;
156 __le16 s_bmap_nr;
157
158 __le16 s_version;
159
160 __le16 s_reserved_for_journal;
161
162
163} __attribute__ ((__packed__));
164
165#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1))
166
167
168struct reiserfs_super_block {
169 struct reiserfs_super_block_v1 s_v1;
170 __le32 s_inode_generation;
171 __le32 s_flags;
172 unsigned char s_uuid[16];
173 unsigned char s_label[16];
174 char s_unused[88];
175
176
177
178} __attribute__ ((__packed__));
179
180#define SB_SIZE (sizeof(struct reiserfs_super_block))
181
182#define REISERFS_VERSION_1 0
183#define REISERFS_VERSION_2 2
184
185
186#define SB_DISK_SUPER_BLOCK(s) (REISERFS_SB(s)->s_rs)
187#define SB_V1_DISK_SUPER_BLOCK(s) (&(SB_DISK_SUPER_BLOCK(s)->s_v1))
188#define SB_BLOCKSIZE(s) \
189 le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_blocksize))
190#define SB_BLOCK_COUNT(s) \
191 le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_block_count))
192#define SB_FREE_BLOCKS(s) \
193 le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks))
194#define SB_REISERFS_MAGIC(s) \
195 (SB_V1_DISK_SUPER_BLOCK(s)->s_magic)
196#define SB_ROOT_BLOCK(s) \
197 le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_root_block))
198#define SB_TREE_HEIGHT(s) \
199 le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height))
200#define SB_REISERFS_STATE(s) \
201 le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state))
202#define SB_VERSION(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_version))
203#define SB_BMAP_NR(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr))
204
205#define PUT_SB_BLOCK_COUNT(s, val) \
206 do { SB_V1_DISK_SUPER_BLOCK(s)->s_block_count = cpu_to_le32(val); } while (0)
207#define PUT_SB_FREE_BLOCKS(s, val) \
208 do { SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks = cpu_to_le32(val); } while (0)
209#define PUT_SB_ROOT_BLOCK(s, val) \
210 do { SB_V1_DISK_SUPER_BLOCK(s)->s_root_block = cpu_to_le32(val); } while (0)
211#define PUT_SB_TREE_HEIGHT(s, val) \
212 do { SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height = cpu_to_le16(val); } while (0)
213#define PUT_SB_REISERFS_STATE(s, val) \
214 do { SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state = cpu_to_le16(val); } while (0)
215#define PUT_SB_VERSION(s, val) \
216 do { SB_V1_DISK_SUPER_BLOCK(s)->s_version = cpu_to_le16(val); } while (0)
217#define PUT_SB_BMAP_NR(s, val) \
218 do { SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr = cpu_to_le16 (val); } while (0)
219
220#define SB_ONDISK_JP(s) (&SB_V1_DISK_SUPER_BLOCK(s)->s_journal)
221#define SB_ONDISK_JOURNAL_SIZE(s) \
222 le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_size))
223#define SB_ONDISK_JOURNAL_1st_BLOCK(s) \
224 le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_1st_block))
225#define SB_ONDISK_JOURNAL_DEVICE(s) \
226 le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_dev))
227#define SB_ONDISK_RESERVED_FOR_JOURNAL(s) \
228 le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_reserved_for_journal))
229
230#define is_block_in_log_or_reserved_area(s, block) \
231 block >= SB_JOURNAL_1st_RESERVED_BLOCK(s) \
232 && block < SB_JOURNAL_1st_RESERVED_BLOCK(s) + \
233 ((!is_reiserfs_jr(SB_DISK_SUPER_BLOCK(s)) ? \
234 SB_ONDISK_JOURNAL_SIZE(s) + 1 : SB_ONDISK_RESERVED_FOR_JOURNAL(s)))
235
236int is_reiserfs_3_5(struct reiserfs_super_block *rs);
237int is_reiserfs_3_6(struct reiserfs_super_block *rs);
238int is_reiserfs_jr(struct reiserfs_super_block *rs);
239
240
241
242
243
244
245#define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)
246#define REISERFS_FIRST_BLOCK unused_define
247#define REISERFS_JOURNAL_OFFSET_IN_BYTES REISERFS_DISK_OFFSET_IN_BYTES
248
249
250#define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)
251
252
253#define CARRY_ON 0
254#define REPEAT_SEARCH -1
255#define IO_ERROR -2
256#define NO_DISK_SPACE -3
257#define NO_BALANCING_NEEDED (-4)
258#define NO_MORE_UNUSED_CONTIGUOUS_BLOCKS (-5)
259#define QUOTA_EXCEEDED -6
260
261typedef __u32 b_blocknr_t;
262typedef __le32 unp_t;
263
264struct unfm_nodeinfo {
265 unp_t unfm_nodenum;
266 unsigned short unfm_freespace;
267};
268
269
270
271#define KEY_FORMAT_3_5 0
272#define KEY_FORMAT_3_6 1
273
274
275#define STAT_DATA_V1 0
276#define STAT_DATA_V2 1
277
278static inline struct reiserfs_inode_info *REISERFS_I(const struct inode *inode)
279{
280 return container_of(inode, struct reiserfs_inode_info, vfs_inode);
281}
282
283static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb)
284{
285 return sb->s_fs_info;
286}
287
288
289
290static inline u32 reiserfs_bmap_count(struct super_block *sb)
291{
292 return (SB_BLOCK_COUNT(sb) - 1) / (sb->s_blocksize * 8) + 1;
293}
294
295static inline int bmap_would_wrap(unsigned bmap_nr)
296{
297 return bmap_nr > ((1LL << 16) - 1);
298}
299
300
301
302#define get_inode_item_key_version( inode ) \
303 ((REISERFS_I(inode)->i_flags & i_item_key_version_mask) ? KEY_FORMAT_3_6 : KEY_FORMAT_3_5)
304
305#define set_inode_item_key_version( inode, version ) \
306 ({ if((version)==KEY_FORMAT_3_6) \
307 REISERFS_I(inode)->i_flags |= i_item_key_version_mask; \
308 else \
309 REISERFS_I(inode)->i_flags &= ~i_item_key_version_mask; })
310
311#define get_inode_sd_version(inode) \
312 ((REISERFS_I(inode)->i_flags & i_stat_data_version_mask) ? STAT_DATA_V2 : STAT_DATA_V1)
313
314#define set_inode_sd_version(inode, version) \
315 ({ if((version)==STAT_DATA_V2) \
316 REISERFS_I(inode)->i_flags |= i_stat_data_version_mask; \
317 else \
318 REISERFS_I(inode)->i_flags &= ~i_stat_data_version_mask; })
319
320
321
322
323
324
325
326
327
328
329
330#define STORE_TAIL_IN_UNFM_S1(n_file_size,n_tail_size,n_block_size) \
331(\
332 (!(n_tail_size)) || \
333 (((n_tail_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) || \
334 ( (n_file_size) >= (n_block_size) * 4 ) || \
335 ( ( (n_file_size) >= (n_block_size) * 3 ) && \
336 ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size))/4) ) || \
337 ( ( (n_file_size) >= (n_block_size) * 2 ) && \
338 ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size))/2) ) || \
339 ( ( (n_file_size) >= (n_block_size) ) && \
340 ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size) * 3)/4) ) ) \
341)
342
343
344
345
346
347
348#define STORE_TAIL_IN_UNFM_S2(n_file_size,n_tail_size,n_block_size) \
349(\
350 (!(n_tail_size)) || \
351 (((n_file_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) ) \
352)
353
354
355
356
357#define REISERFS_VALID_FS 1
358#define REISERFS_ERROR_FS 2
359
360
361
362
363#define TYPE_STAT_DATA 0
364#define TYPE_INDIRECT 1
365#define TYPE_DIRECT 2
366#define TYPE_DIRENTRY 3
367#define TYPE_MAXTYPE 3
368#define TYPE_ANY 15
369
370
371
372
373
374
375
376
377struct offset_v1 {
378 __le32 k_offset;
379 __le32 k_uniqueness;
380} __attribute__ ((__packed__));
381
382struct offset_v2 {
383 __le64 v;
384} __attribute__ ((__packed__));
385
386static inline __u16 offset_v2_k_type(const struct offset_v2 *v2)
387{
388 __u8 type = le64_to_cpu(v2->v) >> 60;
389 return (type <= TYPE_MAXTYPE) ? type : TYPE_ANY;
390}
391
392static inline void set_offset_v2_k_type(struct offset_v2 *v2, int type)
393{
394 v2->v =
395 (v2->v & cpu_to_le64(~0ULL >> 4)) | cpu_to_le64((__u64) type << 60);
396}
397
398static inline loff_t offset_v2_k_offset(const struct offset_v2 *v2)
399{
400 return le64_to_cpu(v2->v) & (~0ULL >> 4);
401}
402
403static inline void set_offset_v2_k_offset(struct offset_v2 *v2, loff_t offset)
404{
405 offset &= (~0ULL >> 4);
406 v2->v = (v2->v & cpu_to_le64(15ULL << 60)) | cpu_to_le64(offset);
407}
408
409
410
411struct reiserfs_key {
412 __le32 k_dir_id;
413
414 __le32 k_objectid;
415 union {
416 struct offset_v1 k_offset_v1;
417 struct offset_v2 k_offset_v2;
418 } __attribute__ ((__packed__)) u;
419} __attribute__ ((__packed__));
420
421struct in_core_key {
422 __u32 k_dir_id;
423
424 __u32 k_objectid;
425 __u64 k_offset;
426 __u8 k_type;
427};
428
429struct cpu_key {
430 struct in_core_key on_disk_key;
431 int version;
432 int key_length;
433
434};
435
436
437
438
439
440#define REISERFS_FULL_KEY_LEN 4
441#define REISERFS_SHORT_KEY_LEN 2
442
443
444#define FIRST_GREATER 1
445#define SECOND_GREATER -1
446#define KEYS_IDENTICAL 0
447#define KEY_FOUND 1
448#define KEY_NOT_FOUND 0
449
450#define KEY_SIZE (sizeof(struct reiserfs_key))
451#define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32))
452
453
454#define ITEM_FOUND 1
455#define ITEM_NOT_FOUND 0
456#define ENTRY_FOUND 1
457#define ENTRY_NOT_FOUND 0
458#define DIRECTORY_NOT_FOUND -1
459#define REGULAR_FILE_FOUND -2
460#define DIRECTORY_FOUND -3
461#define BYTE_FOUND 1
462#define BYTE_NOT_FOUND 0
463#define FILE_NOT_FOUND -1
464
465#define POSITION_FOUND 1
466#define POSITION_NOT_FOUND 0
467
468
469#define NAME_FOUND 1
470#define NAME_NOT_FOUND 0
471#define GOTO_PREVIOUS_ITEM 2
472#define NAME_FOUND_INVISIBLE 3
473
474
475
476
477
478
479struct item_head {
480
481
482 struct reiserfs_key ih_key;
483 union {
484
485
486
487
488
489
490 __le16 ih_free_space_reserved;
491
492
493 __le16 ih_entry_count;
494 } __attribute__ ((__packed__)) u;
495 __le16 ih_item_len;
496 __le16 ih_item_location;
497
498 __le16 ih_version;
499
500
501
502} __attribute__ ((__packed__));
503
504#define IH_SIZE (sizeof(struct item_head))
505
506#define ih_free_space(ih) le16_to_cpu((ih)->u.ih_free_space_reserved)
507#define ih_version(ih) le16_to_cpu((ih)->ih_version)
508#define ih_entry_count(ih) le16_to_cpu((ih)->u.ih_entry_count)
509#define ih_location(ih) le16_to_cpu((ih)->ih_item_location)
510#define ih_item_len(ih) le16_to_cpu((ih)->ih_item_len)
511
512#define put_ih_free_space(ih, val) do { (ih)->u.ih_free_space_reserved = cpu_to_le16(val); } while(0)
513#define put_ih_version(ih, val) do { (ih)->ih_version = cpu_to_le16(val); } while (0)
514#define put_ih_entry_count(ih, val) do { (ih)->u.ih_entry_count = cpu_to_le16(val); } while (0)
515#define put_ih_location(ih, val) do { (ih)->ih_item_location = cpu_to_le16(val); } while (0)
516#define put_ih_item_len(ih, val) do { (ih)->ih_item_len = cpu_to_le16(val); } while (0)
517
518#define unreachable_item(ih) (ih_version(ih) & (1 << 15))
519
520#define get_ih_free_space(ih) (ih_version (ih) == KEY_FORMAT_3_6 ? 0 : ih_free_space (ih))
521#define set_ih_free_space(ih,val) put_ih_free_space((ih), ((ih_version(ih) == KEY_FORMAT_3_6) ? 0 : (val)))
522
523
524
525
526
527
528
529#define get_block_num(p, i) le32_to_cpu(get_unaligned((p) + (i)))
530#define put_block_num(p, i, v) put_unaligned(cpu_to_le32(v), (p) + (i))
531
532
533
534
535#define V1_SD_UNIQUENESS 0
536#define V1_INDIRECT_UNIQUENESS 0xfffffffe
537#define V1_DIRECT_UNIQUENESS 0xffffffff
538#define V1_DIRENTRY_UNIQUENESS 500
539#define V1_ANY_UNIQUENESS 555
540
541
542
543
544static inline int uniqueness2type(__u32 uniqueness) CONSTF;
545static inline int uniqueness2type(__u32 uniqueness)
546{
547 switch ((int)uniqueness) {
548 case V1_SD_UNIQUENESS:
549 return TYPE_STAT_DATA;
550 case V1_INDIRECT_UNIQUENESS:
551 return TYPE_INDIRECT;
552 case V1_DIRECT_UNIQUENESS:
553 return TYPE_DIRECT;
554 case V1_DIRENTRY_UNIQUENESS:
555 return TYPE_DIRENTRY;
556 default:
557 reiserfs_warning(NULL, "vs-500: unknown uniqueness %d",
558 uniqueness);
559 case V1_ANY_UNIQUENESS:
560 return TYPE_ANY;
561 }
562}
563
564static inline __u32 type2uniqueness(int type) CONSTF;
565static inline __u32 type2uniqueness(int type)
566{
567 switch (type) {
568 case TYPE_STAT_DATA:
569 return V1_SD_UNIQUENESS;
570 case TYPE_INDIRECT:
571 return V1_INDIRECT_UNIQUENESS;
572 case TYPE_DIRECT:
573 return V1_DIRECT_UNIQUENESS;
574 case TYPE_DIRENTRY:
575 return V1_DIRENTRY_UNIQUENESS;
576 default:
577 reiserfs_warning(NULL, "vs-501: unknown type %d", type);
578 case TYPE_ANY:
579 return V1_ANY_UNIQUENESS;
580 }
581}
582
583
584
585
586
587
588static inline loff_t le_key_k_offset(int version,
589 const struct reiserfs_key *key)
590{
591 return (version == KEY_FORMAT_3_5) ?
592 le32_to_cpu(key->u.k_offset_v1.k_offset) :
593 offset_v2_k_offset(&(key->u.k_offset_v2));
594}
595
596static inline loff_t le_ih_k_offset(const struct item_head *ih)
597{
598 return le_key_k_offset(ih_version(ih), &(ih->ih_key));
599}
600
601static inline loff_t le_key_k_type(int version, const struct reiserfs_key *key)
602{
603 return (version == KEY_FORMAT_3_5) ?
604 uniqueness2type(le32_to_cpu(key->u.k_offset_v1.k_uniqueness)) :
605 offset_v2_k_type(&(key->u.k_offset_v2));
606}
607
608static inline loff_t le_ih_k_type(const struct item_head *ih)
609{
610 return le_key_k_type(ih_version(ih), &(ih->ih_key));
611}
612
613static inline void set_le_key_k_offset(int version, struct reiserfs_key *key,
614 loff_t offset)
615{
616 (version == KEY_FORMAT_3_5) ? (void)(key->u.k_offset_v1.k_offset = cpu_to_le32(offset)) :
617 (void)(set_offset_v2_k_offset(&(key->u.k_offset_v2), offset));
618}
619
620static inline void set_le_ih_k_offset(struct item_head *ih, loff_t offset)
621{
622 set_le_key_k_offset(ih_version(ih), &(ih->ih_key), offset);
623}
624
625static inline void set_le_key_k_type(int version, struct reiserfs_key *key,
626 int type)
627{
628 (version == KEY_FORMAT_3_5) ?
629 (void)(key->u.k_offset_v1.k_uniqueness =
630 cpu_to_le32(type2uniqueness(type)))
631 : (void)(set_offset_v2_k_type(&(key->u.k_offset_v2), type));
632}
633static inline void set_le_ih_k_type(struct item_head *ih, int type)
634{
635 set_le_key_k_type(ih_version(ih), &(ih->ih_key), type);
636}
637
638#define is_direntry_le_key(version,key) (le_key_k_type (version, key) == TYPE_DIRENTRY)
639#define is_direct_le_key(version,key) (le_key_k_type (version, key) == TYPE_DIRECT)
640#define is_indirect_le_key(version,key) (le_key_k_type (version, key) == TYPE_INDIRECT)
641#define is_statdata_le_key(version,key) (le_key_k_type (version, key) == TYPE_STAT_DATA)
642
643
644
645
646#define is_direntry_le_ih(ih) is_direntry_le_key (ih_version (ih), &((ih)->ih_key))
647#define is_direct_le_ih(ih) is_direct_le_key (ih_version (ih), &((ih)->ih_key))
648#define is_indirect_le_ih(ih) is_indirect_le_key (ih_version(ih), &((ih)->ih_key))
649#define is_statdata_le_ih(ih) is_statdata_le_key (ih_version (ih), &((ih)->ih_key))
650
651
652
653
654static inline loff_t cpu_key_k_offset(const struct cpu_key *key)
655{
656 return key->on_disk_key.k_offset;
657}
658
659static inline loff_t cpu_key_k_type(const struct cpu_key *key)
660{
661 return key->on_disk_key.k_type;
662}
663
664static inline void set_cpu_key_k_offset(struct cpu_key *key, loff_t offset)
665{
666 key->on_disk_key.k_offset = offset;
667}
668
669static inline void set_cpu_key_k_type(struct cpu_key *key, int type)
670{
671 key->on_disk_key.k_type = type;
672}
673
674static inline void cpu_key_k_offset_dec(struct cpu_key *key)
675{
676 key->on_disk_key.k_offset--;
677}
678
679#define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY)
680#define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT)
681#define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT)
682#define is_statdata_cpu_key(key) (cpu_key_k_type (key) == TYPE_STAT_DATA)
683
684
685#define is_direntry_cpu_ih(ih) (is_direntry_cpu_key (&((ih)->ih_key)))
686#define is_direct_cpu_ih(ih) (is_direct_cpu_key (&((ih)->ih_key)))
687#define is_indirect_cpu_ih(ih) (is_indirect_cpu_key (&((ih)->ih_key)))
688#define is_statdata_cpu_ih(ih) (is_statdata_cpu_key (&((ih)->ih_key)))
689
690#define I_K_KEY_IN_ITEM(p_s_ih, p_s_key, n_blocksize) \
691 ( ! COMP_SHORT_KEYS(p_s_ih, p_s_key) && \
692 I_OFF_BYTE_IN_ITEM(p_s_ih, k_offset (p_s_key), n_blocksize) )
693
694
695#define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)
696#define MIN_ITEM_LEN 1
697
698
699#define REISERFS_ROOT_OBJECTID 2
700#define REISERFS_ROOT_PARENT_OBJECTID 1
701extern struct reiserfs_key root_key;
702
703
704
705
706
707
708
709
710
711
712
713
714struct block_head {
715 __le16 blk_level;
716 __le16 blk_nr_item;
717 __le16 blk_free_space;
718 __le16 blk_reserved;
719
720 struct reiserfs_key blk_right_delim_key;
721};
722
723#define BLKH_SIZE (sizeof(struct block_head))
724#define blkh_level(p_blkh) (le16_to_cpu((p_blkh)->blk_level))
725#define blkh_nr_item(p_blkh) (le16_to_cpu((p_blkh)->blk_nr_item))
726#define blkh_free_space(p_blkh) (le16_to_cpu((p_blkh)->blk_free_space))
727#define blkh_reserved(p_blkh) (le16_to_cpu((p_blkh)->blk_reserved))
728#define set_blkh_level(p_blkh,val) ((p_blkh)->blk_level = cpu_to_le16(val))
729#define set_blkh_nr_item(p_blkh,val) ((p_blkh)->blk_nr_item = cpu_to_le16(val))
730#define set_blkh_free_space(p_blkh,val) ((p_blkh)->blk_free_space = cpu_to_le16(val))
731#define set_blkh_reserved(p_blkh,val) ((p_blkh)->blk_reserved = cpu_to_le16(val))
732#define blkh_right_delim_key(p_blkh) ((p_blkh)->blk_right_delim_key)
733#define set_blkh_right_delim_key(p_blkh,val) ((p_blkh)->blk_right_delim_key = val)
734
735
736
737
738
739#define FREE_LEVEL 0
740
741
742
743
744#define DISK_LEAF_NODE_LEVEL 1
745
746
747#define B_BLK_HEAD(p_s_bh) ((struct block_head *)((p_s_bh)->b_data))
748
749#define B_NR_ITEMS(p_s_bh) (blkh_nr_item(B_BLK_HEAD(p_s_bh)))
750#define B_LEVEL(p_s_bh) (blkh_level(B_BLK_HEAD(p_s_bh)))
751#define B_FREE_SPACE(p_s_bh) (blkh_free_space(B_BLK_HEAD(p_s_bh)))
752
753#define PUT_B_NR_ITEMS(p_s_bh,val) do { set_blkh_nr_item(B_BLK_HEAD(p_s_bh),val); } while (0)
754#define PUT_B_LEVEL(p_s_bh,val) do { set_blkh_level(B_BLK_HEAD(p_s_bh),val); } while (0)
755#define PUT_B_FREE_SPACE(p_s_bh,val) do { set_blkh_free_space(B_BLK_HEAD(p_s_bh),val); } while (0)
756
757
758#define B_PRIGHT_DELIM_KEY(p_s_bh) (&(blk_right_delim_key(B_BLK_HEAD(p_s_bh))))
759
760
761#define B_IS_ITEMS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) == DISK_LEAF_NODE_LEVEL)
762
763
764#define B_IS_KEYS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) > DISK_LEAF_NODE_LEVEL \
765 && B_LEVEL(p_s_bh) <= MAX_HEIGHT)
766
767
768
769
770
771
772
773
774
775struct stat_data_v1 {
776 __le16 sd_mode;
777 __le16 sd_nlink;
778 __le16 sd_uid;
779 __le16 sd_gid;
780 __le32 sd_size;
781 __le32 sd_atime;
782 __le32 sd_mtime;
783 __le32 sd_ctime;
784 union {
785 __le32 sd_rdev;
786 __le32 sd_blocks;
787 } __attribute__ ((__packed__)) u;
788 __le32 sd_first_direct_byte;
789
790
791
792
793
794
795
796
797} __attribute__ ((__packed__));
798
799#define SD_V1_SIZE (sizeof(struct stat_data_v1))
800#define stat_data_v1(ih) (ih_version (ih) == KEY_FORMAT_3_5)
801#define sd_v1_mode(sdp) (le16_to_cpu((sdp)->sd_mode))
802#define set_sd_v1_mode(sdp,v) ((sdp)->sd_mode = cpu_to_le16(v))
803#define sd_v1_nlink(sdp) (le16_to_cpu((sdp)->sd_nlink))
804#define set_sd_v1_nlink(sdp,v) ((sdp)->sd_nlink = cpu_to_le16(v))
805#define sd_v1_uid(sdp) (le16_to_cpu((sdp)->sd_uid))
806#define set_sd_v1_uid(sdp,v) ((sdp)->sd_uid = cpu_to_le16(v))
807#define sd_v1_gid(sdp) (le16_to_cpu((sdp)->sd_gid))
808#define set_sd_v1_gid(sdp,v) ((sdp)->sd_gid = cpu_to_le16(v))
809#define sd_v1_size(sdp) (le32_to_cpu((sdp)->sd_size))
810#define set_sd_v1_size(sdp,v) ((sdp)->sd_size = cpu_to_le32(v))
811#define sd_v1_atime(sdp) (le32_to_cpu((sdp)->sd_atime))
812#define set_sd_v1_atime(sdp,v) ((sdp)->sd_atime = cpu_to_le32(v))
813#define sd_v1_mtime(sdp) (le32_to_cpu((sdp)->sd_mtime))
814#define set_sd_v1_mtime(sdp,v) ((sdp)->sd_mtime = cpu_to_le32(v))
815#define sd_v1_ctime(sdp) (le32_to_cpu((sdp)->sd_ctime))
816#define set_sd_v1_ctime(sdp,v) ((sdp)->sd_ctime = cpu_to_le32(v))
817#define sd_v1_rdev(sdp) (le32_to_cpu((sdp)->u.sd_rdev))
818#define set_sd_v1_rdev(sdp,v) ((sdp)->u.sd_rdev = cpu_to_le32(v))
819#define sd_v1_blocks(sdp) (le32_to_cpu((sdp)->u.sd_blocks))
820#define set_sd_v1_blocks(sdp,v) ((sdp)->u.sd_blocks = cpu_to_le32(v))
821#define sd_v1_first_direct_byte(sdp) \
822 (le32_to_cpu((sdp)->sd_first_direct_byte))
823#define set_sd_v1_first_direct_byte(sdp,v) \
824 ((sdp)->sd_first_direct_byte = cpu_to_le32(v))
825
826
827
828
829
830#define REISERFS_IMMUTABLE_FL FS_IMMUTABLE_FL
831#define REISERFS_APPEND_FL FS_APPEND_FL
832#define REISERFS_SYNC_FL FS_SYNC_FL
833#define REISERFS_NOATIME_FL FS_NOATIME_FL
834#define REISERFS_NODUMP_FL FS_NODUMP_FL
835#define REISERFS_SECRM_FL FS_SECRM_FL
836#define REISERFS_UNRM_FL FS_UNRM_FL
837#define REISERFS_COMPR_FL FS_COMPR_FL
838#define REISERFS_NOTAIL_FL FS_NOTAIL_FL
839
840
841#define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FL | \
842 REISERFS_SYNC_FL | \
843 REISERFS_NOATIME_FL | \
844 REISERFS_NODUMP_FL | \
845 REISERFS_SECRM_FL | \
846 REISERFS_COMPR_FL | \
847 REISERFS_NOTAIL_FL )
848
849
850
851struct stat_data {
852 __le16 sd_mode;
853 __le16 sd_attrs;
854 __le32 sd_nlink;
855 __le64 sd_size;
856 __le32 sd_uid;
857 __le32 sd_gid;
858 __le32 sd_atime;
859 __le32 sd_mtime;
860 __le32 sd_ctime;
861 __le32 sd_blocks;
862 union {
863 __le32 sd_rdev;
864 __le32 sd_generation;
865
866
867
868
869
870
871
872
873
874 } __attribute__ ((__packed__)) u;
875} __attribute__ ((__packed__));
876
877
878
879#define SD_SIZE (sizeof(struct stat_data))
880#define SD_V2_SIZE SD_SIZE
881#define stat_data_v2(ih) (ih_version (ih) == KEY_FORMAT_3_6)
882#define sd_v2_mode(sdp) (le16_to_cpu((sdp)->sd_mode))
883#define set_sd_v2_mode(sdp,v) ((sdp)->sd_mode = cpu_to_le16(v))
884
885
886#define sd_v2_nlink(sdp) (le32_to_cpu((sdp)->sd_nlink))
887#define set_sd_v2_nlink(sdp,v) ((sdp)->sd_nlink = cpu_to_le32(v))
888#define sd_v2_size(sdp) (le64_to_cpu((sdp)->sd_size))
889#define set_sd_v2_size(sdp,v) ((sdp)->sd_size = cpu_to_le64(v))
890#define sd_v2_uid(sdp) (le32_to_cpu((sdp)->sd_uid))
891#define set_sd_v2_uid(sdp,v) ((sdp)->sd_uid = cpu_to_le32(v))
892#define sd_v2_gid(sdp) (le32_to_cpu((sdp)->sd_gid))
893#define set_sd_v2_gid(sdp,v) ((sdp)->sd_gid = cpu_to_le32(v))
894#define sd_v2_atime(sdp) (le32_to_cpu((sdp)->sd_atime))
895#define set_sd_v2_atime(sdp,v) ((sdp)->sd_atime = cpu_to_le32(v))
896#define sd_v2_mtime(sdp) (le32_to_cpu((sdp)->sd_mtime))
897#define set_sd_v2_mtime(sdp,v) ((sdp)->sd_mtime = cpu_to_le32(v))
898#define sd_v2_ctime(sdp) (le32_to_cpu((sdp)->sd_ctime))
899#define set_sd_v2_ctime(sdp,v) ((sdp)->sd_ctime = cpu_to_le32(v))
900#define sd_v2_blocks(sdp) (le32_to_cpu((sdp)->sd_blocks))
901#define set_sd_v2_blocks(sdp,v) ((sdp)->sd_blocks = cpu_to_le32(v))
902#define sd_v2_rdev(sdp) (le32_to_cpu((sdp)->u.sd_rdev))
903#define set_sd_v2_rdev(sdp,v) ((sdp)->u.sd_rdev = cpu_to_le32(v))
904#define sd_v2_generation(sdp) (le32_to_cpu((sdp)->u.sd_generation))
905#define set_sd_v2_generation(sdp,v) ((sdp)->u.sd_generation = cpu_to_le32(v))
906#define sd_v2_attrs(sdp) (le16_to_cpu((sdp)->sd_attrs))
907#define set_sd_v2_attrs(sdp,v) ((sdp)->sd_attrs = cpu_to_le16(v))
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925#define SD_OFFSET 0
926#define SD_UNIQUENESS 0
927#define DOT_OFFSET 1
928#define DOT_DOT_OFFSET 2
929#define DIRENTRY_UNIQUENESS 500
930
931
932#define FIRST_ITEM_OFFSET 1
933
934
935
936
937
938
939
940
941
942
943struct reiserfs_de_head {
944 __le32 deh_offset;
945 __le32 deh_dir_id;
946
947 __le32 deh_objectid;
948 __le16 deh_location;
949 __le16 deh_state;
950
951} __attribute__ ((__packed__));
952#define DEH_SIZE sizeof(struct reiserfs_de_head)
953#define deh_offset(p_deh) (le32_to_cpu((p_deh)->deh_offset))
954#define deh_dir_id(p_deh) (le32_to_cpu((p_deh)->deh_dir_id))
955#define deh_objectid(p_deh) (le32_to_cpu((p_deh)->deh_objectid))
956#define deh_location(p_deh) (le16_to_cpu((p_deh)->deh_location))
957#define deh_state(p_deh) (le16_to_cpu((p_deh)->deh_state))
958
959#define put_deh_offset(p_deh,v) ((p_deh)->deh_offset = cpu_to_le32((v)))
960#define put_deh_dir_id(p_deh,v) ((p_deh)->deh_dir_id = cpu_to_le32((v)))
961#define put_deh_objectid(p_deh,v) ((p_deh)->deh_objectid = cpu_to_le32((v)))
962#define put_deh_location(p_deh,v) ((p_deh)->deh_location = cpu_to_le16((v)))
963#define put_deh_state(p_deh,v) ((p_deh)->deh_state = cpu_to_le16((v)))
964
965
966#define EMPTY_DIR_SIZE \
967(DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen ("..")))
968
969
970#define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3)
971
972#define DEH_Statdata 0
973#define DEH_Visible 2
974
975
976#if BITS_PER_LONG == 64 || defined(__s390__) || defined(__hppa__)
977# define ADDR_UNALIGNED_BITS (3)
978#endif
979
980
981
982
983#ifdef ADDR_UNALIGNED_BITS
984
985# define aligned_address(addr) ((void *)((long)(addr) & ~((1UL << ADDR_UNALIGNED_BITS) - 1)))
986# define unaligned_offset(addr) (((int)((long)(addr) & ((1 << ADDR_UNALIGNED_BITS) - 1))) << 3)
987
988# define set_bit_unaligned(nr, addr) ext2_set_bit((nr) + unaligned_offset(addr), aligned_address(addr))
989# define clear_bit_unaligned(nr, addr) ext2_clear_bit((nr) + unaligned_offset(addr), aligned_address(addr))
990# define test_bit_unaligned(nr, addr) ext2_test_bit((nr) + unaligned_offset(addr), aligned_address(addr))
991
992#else
993
994# define set_bit_unaligned(nr, addr) ext2_set_bit(nr, addr)
995# define clear_bit_unaligned(nr, addr) ext2_clear_bit(nr, addr)
996# define test_bit_unaligned(nr, addr) ext2_test_bit(nr, addr)
997
998#endif
999
1000#define mark_de_with_sd(deh) set_bit_unaligned (DEH_Statdata, &((deh)->deh_state))
1001#define mark_de_without_sd(deh) clear_bit_unaligned (DEH_Statdata, &((deh)->deh_state))
1002#define mark_de_visible(deh) set_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1003#define mark_de_hidden(deh) clear_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1004
1005#define de_with_sd(deh) test_bit_unaligned (DEH_Statdata, &((deh)->deh_state))
1006#define de_visible(deh) test_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1007#define de_hidden(deh) !test_bit_unaligned (DEH_Visible, &((deh)->deh_state))
1008
1009extern void make_empty_dir_item_v1(char *body, __le32 dirid, __le32 objid,
1010 __le32 par_dirid, __le32 par_objid);
1011extern void make_empty_dir_item(char *body, __le32 dirid, __le32 objid,
1012 __le32 par_dirid, __le32 par_objid);
1013
1014
1015
1016#define B_I_PITEM(bh,ih) ( (bh)->b_data + ih_location(ih) )
1017#define B_I_DEH(bh,ih) ((struct reiserfs_de_head *)(B_I_PITEM(bh,ih)))
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029static inline int entry_length(const struct buffer_head *bh,
1030 const struct item_head *ih, int pos_in_item)
1031{
1032 struct reiserfs_de_head *deh;
1033
1034 deh = B_I_DEH(bh, ih) + pos_in_item;
1035 if (pos_in_item)
1036 return deh_location(deh - 1) - deh_location(deh);
1037
1038 return ih_item_len(ih) - deh_location(deh);
1039}
1040
1041
1042#define I_ENTRY_COUNT(ih) (ih_entry_count((ih)))
1043
1044
1045#define B_I_E_NAME(bh,ih,entry_num) ((char *)(bh->b_data + ih_location(ih) + deh_location(B_I_DEH(bh,ih)+(entry_num))))
1046
1047
1048#define REISERFS_MAX_NAME(block_size) 255
1049
1050
1051
1052
1053
1054struct reiserfs_dir_entry {
1055 struct buffer_head *de_bh;
1056 int de_item_num;
1057 struct item_head *de_ih;
1058 int de_entry_num;
1059 struct reiserfs_de_head *de_deh;
1060 int de_entrylen;
1061 int de_namelen;
1062 char *de_name;
1063 unsigned long *de_gen_number_bit_string;
1064
1065 __u32 de_dir_id;
1066 __u32 de_objectid;
1067
1068 struct cpu_key de_entry_key;
1069};
1070
1071
1072
1073
1074#define B_I_DEH_ENTRY_FILE_NAME(bh,ih,deh) (B_I_PITEM (bh, ih) + deh_location(deh))
1075
1076
1077#define I_DEH_N_ENTRY_FILE_NAME_LENGTH(ih,deh,entry_num) \
1078(I_DEH_N_ENTRY_LENGTH (ih, deh, entry_num) - (de_with_sd (deh) ? SD_SIZE : 0))
1079
1080
1081#define GET_HASH_VALUE(offset) ((offset) & 0x7fffff80LL)
1082
1083#define GET_GENERATION_NUMBER(offset) ((offset) & 0x7fLL)
1084#define MAX_GENERATION_NUMBER 127
1085
1086#define SET_GENERATION_NUMBER(offset,gen_number) (GET_HASH_VALUE(offset)|(gen_number))
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102struct disk_child {
1103 __le32 dc_block_number;
1104 __le16 dc_size;
1105 __le16 dc_reserved;
1106};
1107
1108#define DC_SIZE (sizeof(struct disk_child))
1109#define dc_block_number(dc_p) (le32_to_cpu((dc_p)->dc_block_number))
1110#define dc_size(dc_p) (le16_to_cpu((dc_p)->dc_size))
1111#define put_dc_block_number(dc_p, val) do { (dc_p)->dc_block_number = cpu_to_le32(val); } while(0)
1112#define put_dc_size(dc_p, val) do { (dc_p)->dc_size = cpu_to_le16(val); } while(0)
1113
1114
1115#define B_N_CHILD(p_s_bh,n_pos) ((struct disk_child *)\
1116((p_s_bh)->b_data+BLKH_SIZE+B_NR_ITEMS(p_s_bh)*KEY_SIZE+DC_SIZE*(n_pos)))
1117
1118
1119#define B_N_CHILD_NUM(p_s_bh,n_pos) (dc_block_number(B_N_CHILD(p_s_bh,n_pos)))
1120#define PUT_B_N_CHILD_NUM(p_s_bh,n_pos, val) (put_dc_block_number(B_N_CHILD(p_s_bh,n_pos), val ))
1121
1122
1123
1124#define MAX_CHILD_SIZE(bh) ((int)( (bh)->b_size - BLKH_SIZE ))
1125
1126
1127#define B_CHILD_SIZE(cur) (MAX_CHILD_SIZE(cur)-(B_FREE_SPACE(cur)))
1128
1129
1130#define MAX_NR_KEY(bh) ( (MAX_CHILD_SIZE(bh)-DC_SIZE)/(KEY_SIZE+DC_SIZE) )
1131#define MIN_NR_KEY(bh) (MAX_NR_KEY(bh)/2)
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145struct path_element {
1146 struct buffer_head *pe_buffer;
1147 int pe_position;
1148
1149};
1150
1151#define MAX_HEIGHT 5
1152#define EXTENDED_MAX_HEIGHT 7
1153#define FIRST_PATH_ELEMENT_OFFSET 2
1154
1155#define ILLEGAL_PATH_ELEMENT_OFFSET 1
1156#define MAX_FEB_SIZE 6
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175#define PATH_READA 0x1
1176#define PATH_READA_BACK 0x2
1177
1178struct treepath {
1179 int path_length;
1180 int reada;
1181 struct path_element path_elements[EXTENDED_MAX_HEIGHT];
1182 int pos_in_item;
1183};
1184
1185#define pos_in_item(path) ((path)->pos_in_item)
1186
1187#define INITIALIZE_PATH(var) \
1188struct treepath var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,}
1189
1190
1191#define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset))
1192
1193
1194#define PATH_OFFSET_PBUFFER(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_buffer)
1195
1196
1197#define PATH_OFFSET_POSITION(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_position)
1198
1199#define PATH_PLAST_BUFFER(p_s_path) (PATH_OFFSET_PBUFFER((p_s_path), (p_s_path)->path_length))
1200
1201
1202
1203
1204
1205
1206#define PATH_LAST_POSITION(p_s_path) (PATH_OFFSET_POSITION((p_s_path), (p_s_path)->path_length))
1207
1208#define PATH_PITEM_HEAD(p_s_path) B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_path),PATH_LAST_POSITION(p_s_path))
1209
1210
1211
1212#define PATH_H_PBUFFER(p_s_path, h) PATH_OFFSET_PBUFFER (p_s_path, p_s_path->path_length - (h))
1213#define PATH_H_PPARENT(path, h) PATH_H_PBUFFER (path, (h) + 1)
1214#define PATH_H_POSITION(path, h) PATH_OFFSET_POSITION (path, path->path_length - (h))
1215#define PATH_H_B_ITEM_ORDER(path, h) PATH_H_POSITION(path, h + 1)
1216
1217#define PATH_H_PATH_OFFSET(p_s_path, n_h) ((p_s_path)->path_length - (n_h))
1218
1219#define get_last_bh(path) PATH_PLAST_BUFFER(path)
1220#define get_ih(path) PATH_PITEM_HEAD(path)
1221#define get_item_pos(path) PATH_LAST_POSITION(path)
1222#define get_item(path) ((void *)B_N_PITEM(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION (path)))
1223#define item_moved(ih,path) comp_items(ih, path)
1224#define path_changed(ih,path) comp_items (ih, path)
1225
1226
1227
1228
1229
1230
1231#define UNFM_P_SIZE (sizeof(unp_t))
1232#define UNFM_P_SHIFT 2
1233
1234
1235#define INODE_PKEY(inode) ((struct reiserfs_key *)(REISERFS_I(inode)->i_key))
1236
1237#define MAX_UL_INT 0xffffffff
1238#define MAX_INT 0x7ffffff
1239#define MAX_US_INT 0xffff
1240
1241
1242#define U32_MAX (~(__u32)0)
1243
1244static inline loff_t max_reiserfs_offset(struct inode *inode)
1245{
1246 if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5)
1247 return (loff_t) U32_MAX;
1248
1249 return (loff_t) ((~(__u64) 0) >> 4);
1250}
1251
1252
1253#define MAX_KEY_OBJECTID MAX_UL_INT
1254
1255#define MAX_B_NUM MAX_UL_INT
1256#define MAX_FC_NUM MAX_US_INT
1257
1258
1259#define REISERFS_LINK_MAX (MAX_US_INT - 1000)
1260
1261
1262#define REISERFS_KERNEL_MEM 0
1263#define REISERFS_USER_MEM 1
1264
1265#define fs_generation(s) (REISERFS_SB(s)->s_generation_counter)
1266#define get_generation(s) atomic_read (&fs_generation(s))
1267#define FILESYSTEM_CHANGED_TB(tb) (get_generation((tb)->tb_sb) != (tb)->fs_gen)
1268#define __fs_changed(gen,s) (gen != get_generation (s))
1269#define fs_changed(gen,s) ({cond_resched(); __fs_changed(gen, s);})
1270
1271
1272
1273
1274
1275#define VI_TYPE_LEFT_MERGEABLE 1
1276#define VI_TYPE_RIGHT_MERGEABLE 2
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291struct virtual_item {
1292 int vi_index;
1293 unsigned short vi_type;
1294 unsigned short vi_item_len;
1295 struct item_head *vi_ih;
1296 const char *vi_item;
1297 const void *vi_new_data;
1298 void *vi_uarea;
1299};
1300
1301struct virtual_node {
1302 char *vn_free_ptr;
1303 unsigned short vn_nr_item;
1304 short vn_size;
1305 short vn_mode;
1306 short vn_affected_item_num;
1307 short vn_pos_in_item;
1308 struct item_head *vn_ins_ih;
1309 const void *vn_data;
1310 struct virtual_item *vn_vi;
1311};
1312
1313
1314struct direntry_uarea {
1315 int flags;
1316 __u16 entry_count;
1317 __u16 entry_sizes[1];
1318} __attribute__ ((__packed__));
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335#define MAX_FREE_BLOCK 7
1336
1337
1338#define MAX_AMOUNT_NEEDED 2
1339
1340
1341struct tree_balance {
1342 int tb_mode;
1343 int need_balance_dirty;
1344 struct super_block *tb_sb;
1345 struct reiserfs_transaction_handle *transaction_handle;
1346 struct treepath *tb_path;
1347 struct buffer_head *L[MAX_HEIGHT];
1348 struct buffer_head *R[MAX_HEIGHT];
1349 struct buffer_head *FL[MAX_HEIGHT];
1350 struct buffer_head *FR[MAX_HEIGHT];
1351 struct buffer_head *CFL[MAX_HEIGHT];
1352 struct buffer_head *CFR[MAX_HEIGHT];
1353
1354 struct buffer_head *FEB[MAX_FEB_SIZE];
1355
1356 struct buffer_head *used[MAX_FEB_SIZE];
1357 struct buffer_head *thrown[MAX_FEB_SIZE];
1358 int lnum[MAX_HEIGHT];
1359
1360
1361
1362
1363
1364
1365
1366
1367 int rnum[MAX_HEIGHT];
1368 int lkey[MAX_HEIGHT];
1369
1370 int rkey[MAX_HEIGHT];
1371 int insert_size[MAX_HEIGHT];
1372
1373 int blknum[MAX_HEIGHT];
1374
1375
1376
1377
1378
1379
1380 int cur_blknum;
1381 int s0num;
1382 int s1num;
1383 int s2num;
1384 int lbytes;
1385
1386
1387 int rbytes;
1388
1389
1390 int s1bytes;
1391
1392 int s2bytes;
1393 struct buffer_head *buf_to_free[MAX_FREE_BLOCK];
1394 char *vn_buf;
1395
1396
1397 int vn_buf_size;
1398 struct virtual_node *tb_vn;
1399
1400 int fs_gen;
1401
1402#ifdef DISPLACE_NEW_PACKING_LOCALITIES
1403 struct in_core_key key;
1404
1405#endif
1406};
1407
1408
1409
1410
1411#define M_INSERT 'i'
1412
1413
1414#define M_PASTE 'p'
1415
1416#define M_DELETE 'd'
1417
1418#define M_CUT 'c'
1419
1420
1421#define M_INTERNAL 'n'
1422
1423
1424
1425#define M_SKIP_BALANCING 's'
1426#define M_CONVERT 'v'
1427
1428
1429#define LEAF_FROM_S_TO_L 0
1430#define LEAF_FROM_S_TO_R 1
1431#define LEAF_FROM_R_TO_L 2
1432#define LEAF_FROM_L_TO_R 3
1433#define LEAF_FROM_S_TO_SNEW 4
1434
1435#define FIRST_TO_LAST 0
1436#define LAST_TO_FIRST 1
1437
1438
1439
1440struct buffer_info {
1441 struct tree_balance *tb;
1442 struct buffer_head *bi_bh;
1443 struct buffer_head *bi_parent;
1444 int bi_position;
1445};
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463struct item_operations {
1464 int (*bytes_number) (struct item_head * ih, int block_size);
1465 void (*decrement_key) (struct cpu_key *);
1466 int (*is_left_mergeable) (struct reiserfs_key * ih,
1467 unsigned long bsize);
1468 void (*print_item) (struct item_head *, char *item);
1469 void (*check_item) (struct item_head *, char *item);
1470
1471 int (*create_vi) (struct virtual_node * vn, struct virtual_item * vi,
1472 int is_affected, int insert_size);
1473 int (*check_left) (struct virtual_item * vi, int free,
1474 int start_skip, int end_skip);
1475 int (*check_right) (struct virtual_item * vi, int free);
1476 int (*part_size) (struct virtual_item * vi, int from, int to);
1477 int (*unit_num) (struct virtual_item * vi);
1478 void (*print_vi) (struct virtual_item * vi);
1479};
1480
1481extern struct item_operations *item_ops[TYPE_ANY + 1];
1482
1483#define op_bytes_number(ih,bsize) item_ops[le_ih_k_type (ih)]->bytes_number (ih, bsize)
1484#define op_is_left_mergeable(key,bsize) item_ops[le_key_k_type (le_key_version (key), key)]->is_left_mergeable (key, bsize)
1485#define op_print_item(ih,item) item_ops[le_ih_k_type (ih)]->print_item (ih, item)
1486#define op_check_item(ih,item) item_ops[le_ih_k_type (ih)]->check_item (ih, item)
1487#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)
1488#define op_check_left(vi,free,start_skip,end_skip) item_ops[(vi)->vi_index]->check_left (vi, free, start_skip, end_skip)
1489#define op_check_right(vi,free) item_ops[(vi)->vi_index]->check_right (vi, free)
1490#define op_part_size(vi,from,to) item_ops[(vi)->vi_index]->part_size (vi, from, to)
1491#define op_unit_num(vi) item_ops[(vi)->vi_index]->unit_num (vi)
1492#define op_print_vi(vi) item_ops[(vi)->vi_index]->print_vi (vi)
1493
1494#define COMP_SHORT_KEYS comp_short_keys
1495
1496
1497#define I_UNFM_NUM(p_s_ih) ( ih_item_len(p_s_ih) / UNFM_P_SIZE )
1498
1499
1500#define I_POS_UNFM_SIZE(ih,pos,size) (((pos) == I_UNFM_NUM(ih) - 1 ) ? (size) - ih_free_space(ih) : (size))
1501
1502
1503
1504
1505#define B_N_PITEM_HEAD(bh,item_num) ( (struct item_head * )((bh)->b_data + BLKH_SIZE) + (item_num) )
1506
1507
1508#define B_N_PDELIM_KEY(bh,item_num) ( (struct reiserfs_key * )((bh)->b_data + BLKH_SIZE) + (item_num) )
1509
1510
1511#define B_N_PKEY(bh,item_num) ( &(B_N_PITEM_HEAD(bh,item_num)->ih_key) )
1512
1513
1514#define B_N_PITEM(bh,item_num) ( (bh)->b_data + ih_location(B_N_PITEM_HEAD((bh),(item_num))))
1515
1516
1517#define B_N_STAT_DATA(bh,nr) \
1518( (struct stat_data *)((bh)->b_data + ih_location(B_N_PITEM_HEAD((bh),(nr))) ) )
1519
1520
1521
1522
1523#define B_I_STAT_DATA(bh, ih) ( (struct stat_data * )((bh)->b_data + ih_location(ih)) )
1524
1525
1526#define MAX_DIRECT_ITEM_LEN(size) ((size) - BLKH_SIZE - 2*IH_SIZE - SD_SIZE - UNFM_P_SIZE)
1527
1528
1529
1530
1531#define B_I_POS_UNFM_POINTER(bh,ih,pos) le32_to_cpu(*(((unp_t *)B_I_PITEM(bh,ih)) + (pos)))
1532#define PUT_B_I_POS_UNFM_POINTER(bh,ih,pos, val) do {*(((unp_t *)B_I_PITEM(bh,ih)) + (pos)) = cpu_to_le32(val); } while (0)
1533
1534struct reiserfs_iget_args {
1535 __u32 objectid;
1536 __u32 dirid;
1537};
1538
1539
1540
1541
1542
1543
1544#define get_journal_desc_magic(bh) (bh->b_data + bh->b_size - 12)
1545
1546#define journal_trans_half(blocksize) \
1547 ((blocksize - sizeof (struct reiserfs_journal_desc) + sizeof (__u32) - 12) / sizeof (__u32))
1548
1549
1550
1551
1552struct reiserfs_journal_desc {
1553 __le32 j_trans_id;
1554 __le32 j_len;
1555 __le32 j_mount_id;
1556 __le32 j_realblock[1];
1557};
1558
1559#define get_desc_trans_id(d) le32_to_cpu((d)->j_trans_id)
1560#define get_desc_trans_len(d) le32_to_cpu((d)->j_len)
1561#define get_desc_mount_id(d) le32_to_cpu((d)->j_mount_id)
1562
1563#define set_desc_trans_id(d,val) do { (d)->j_trans_id = cpu_to_le32 (val); } while (0)
1564#define set_desc_trans_len(d,val) do { (d)->j_len = cpu_to_le32 (val); } while (0)
1565#define set_desc_mount_id(d,val) do { (d)->j_mount_id = cpu_to_le32 (val); } while (0)
1566
1567
1568struct reiserfs_journal_commit {
1569 __le32 j_trans_id;
1570 __le32 j_len;
1571 __le32 j_realblock[1];
1572};
1573
1574#define get_commit_trans_id(c) le32_to_cpu((c)->j_trans_id)
1575#define get_commit_trans_len(c) le32_to_cpu((c)->j_len)
1576#define get_commit_mount_id(c) le32_to_cpu((c)->j_mount_id)
1577
1578#define set_commit_trans_id(c,val) do { (c)->j_trans_id = cpu_to_le32 (val); } while (0)
1579#define set_commit_trans_len(c,val) do { (c)->j_len = cpu_to_le32 (val); } while (0)
1580
1581
1582
1583
1584
1585struct reiserfs_journal_header {
1586 __le32 j_last_flush_trans_id;
1587 __le32 j_first_unflushed_offset;
1588 __le32 j_mount_id;
1589 struct journal_params jh_journal;
1590};
1591
1592
1593#define JOURNAL_BLOCK_COUNT 8192
1594#define JOURNAL_TRANS_MAX_DEFAULT 1024
1595#define JOURNAL_TRANS_MIN_DEFAULT 256
1596#define JOURNAL_MAX_BATCH_DEFAULT 900
1597#define JOURNAL_MIN_RATIO 2
1598#define JOURNAL_MAX_COMMIT_AGE 30
1599#define JOURNAL_MAX_TRANS_AGE 30
1600#define JOURNAL_PER_BALANCE_CNT (3 * (MAX_HEIGHT-2) + 9)
1601#ifdef CONFIG_QUOTA
1602
1603#define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? 2 : 0)
1604
1605#define REISERFS_QUOTA_INIT_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? \
1606(DQUOT_INIT_ALLOC*(JOURNAL_PER_BALANCE_CNT+2)+DQUOT_INIT_REWRITE+1) : 0)
1607
1608#define REISERFS_QUOTA_DEL_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? \
1609(DQUOT_DEL_ALLOC*(JOURNAL_PER_BALANCE_CNT+2)+DQUOT_DEL_REWRITE+1) : 0)
1610#else
1611#define REISERFS_QUOTA_TRANS_BLOCKS(s) 0
1612#define REISERFS_QUOTA_INIT_BLOCKS(s) 0
1613#define REISERFS_QUOTA_DEL_BLOCKS(s) 0
1614#endif
1615
1616
1617
1618
1619
1620
1621
1622#define REISERFS_MIN_BITMAP_NODES 10
1623#define REISERFS_MAX_BITMAP_NODES 100
1624
1625#define JBH_HASH_SHIFT 13
1626#define JBH_HASH_MASK 8191
1627
1628#define _jhashfn(sb,block) \
1629 (((unsigned long)sb>>L1_CACHE_SHIFT) ^ \
1630 (((block)<<(JBH_HASH_SHIFT - 6)) ^ ((block) >> 13) ^ ((block) << (JBH_HASH_SHIFT - 12))))
1631#define journal_hash(t,sb,block) ((t)[_jhashfn((sb),(block)) & JBH_HASH_MASK])
1632
1633
1634#define journal_find_get_block(s, block) __find_get_block(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
1635#define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
1636#define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
1637
1638enum reiserfs_bh_state_bits {
1639 BH_JDirty = BH_PrivateStart,
1640 BH_JDirty_wait,
1641 BH_JNew,
1642
1643
1644 BH_JPrepared,
1645 BH_JRestore_dirty,
1646 BH_JTest,
1647};
1648
1649BUFFER_FNS(JDirty, journaled);
1650TAS_BUFFER_FNS(JDirty, journaled);
1651BUFFER_FNS(JDirty_wait, journal_dirty);
1652TAS_BUFFER_FNS(JDirty_wait, journal_dirty);
1653BUFFER_FNS(JNew, journal_new);
1654TAS_BUFFER_FNS(JNew, journal_new);
1655BUFFER_FNS(JPrepared, journal_prepared);
1656TAS_BUFFER_FNS(JPrepared, journal_prepared);
1657BUFFER_FNS(JRestore_dirty, journal_restore_dirty);
1658TAS_BUFFER_FNS(JRestore_dirty, journal_restore_dirty);
1659BUFFER_FNS(JTest, journal_test);
1660TAS_BUFFER_FNS(JTest, journal_test);
1661
1662
1663
1664
1665struct reiserfs_transaction_handle {
1666 struct super_block *t_super;
1667
1668
1669
1670
1671
1672 int t_refcount;
1673 int t_blocks_logged;
1674 int t_blocks_allocated;
1675 unsigned long t_trans_id;
1676 void *t_handle_save;
1677 unsigned displace_new_blocks:1;
1678
1679 struct list_head t_list;
1680};
1681
1682
1683
1684
1685struct reiserfs_jh {
1686 struct reiserfs_journal_list *jl;
1687 struct buffer_head *bh;
1688 struct list_head list;
1689};
1690
1691void reiserfs_free_jh(struct buffer_head *bh);
1692int reiserfs_add_tail_list(struct inode *inode, struct buffer_head *bh);
1693int reiserfs_add_ordered_list(struct inode *inode, struct buffer_head *bh);
1694int journal_mark_dirty(struct reiserfs_transaction_handle *,
1695 struct super_block *, struct buffer_head *bh);
1696
1697static inline int reiserfs_file_data_log(struct inode *inode)
1698{
1699 if (reiserfs_data_log(inode->i_sb) ||
1700 (REISERFS_I(inode)->i_flags & i_data_log))
1701 return 1;
1702 return 0;
1703}
1704
1705static inline int reiserfs_transaction_running(struct super_block *s)
1706{
1707 struct reiserfs_transaction_handle *th = current->journal_info;
1708 if (th && th->t_super == s)
1709 return 1;
1710 if (th && th->t_super == NULL)
1711 BUG();
1712 return 0;
1713}
1714
1715static inline int reiserfs_transaction_free_space(struct reiserfs_transaction_handle *th)
1716{
1717 return th->t_blocks_allocated - th->t_blocks_logged;
1718}
1719
1720struct reiserfs_transaction_handle *reiserfs_persistent_transaction(struct
1721 super_block
1722 *,
1723 int count);
1724int reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *);
1725int reiserfs_commit_page(struct inode *inode, struct page *page,
1726 unsigned from, unsigned to);
1727int reiserfs_flush_old_commits(struct super_block *);
1728int reiserfs_commit_for_inode(struct inode *);
1729int reiserfs_inode_needs_commit(struct inode *);
1730void reiserfs_update_inode_transaction(struct inode *);
1731void reiserfs_wait_on_write_block(struct super_block *s);
1732void reiserfs_block_writes(struct reiserfs_transaction_handle *th);
1733void reiserfs_allow_writes(struct super_block *s);
1734void reiserfs_check_lock_depth(struct super_block *s, char *caller);
1735int reiserfs_prepare_for_journal(struct super_block *, struct buffer_head *bh,
1736 int wait);
1737void reiserfs_restore_prepared_buffer(struct super_block *,
1738 struct buffer_head *bh);
1739int journal_init(struct super_block *, const char *j_dev_name, int old_format,
1740 unsigned int);
1741int journal_release(struct reiserfs_transaction_handle *, struct super_block *);
1742int journal_release_error(struct reiserfs_transaction_handle *,
1743 struct super_block *);
1744int journal_end(struct reiserfs_transaction_handle *, struct super_block *,
1745 unsigned long);
1746int journal_end_sync(struct reiserfs_transaction_handle *, struct super_block *,
1747 unsigned long);
1748int journal_mark_freed(struct reiserfs_transaction_handle *,
1749 struct super_block *, b_blocknr_t blocknr);
1750int journal_transaction_should_end(struct reiserfs_transaction_handle *, int);
1751int reiserfs_in_journal(struct super_block *p_s_sb, unsigned int bmap_nr,
1752 int bit_nr, int searchall, b_blocknr_t *next);
1753int journal_begin(struct reiserfs_transaction_handle *,
1754 struct super_block *p_s_sb, unsigned long);
1755int journal_join_abort(struct reiserfs_transaction_handle *,
1756 struct super_block *p_s_sb, unsigned long);
1757void reiserfs_journal_abort(struct super_block *sb, int errno);
1758void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...);
1759int reiserfs_allocate_list_bitmaps(struct super_block *s,
1760 struct reiserfs_list_bitmap *, unsigned int);
1761
1762void add_save_link(struct reiserfs_transaction_handle *th,
1763 struct inode *inode, int truncate);
1764int remove_save_link(struct inode *inode, int truncate);
1765
1766
1767__u32 reiserfs_get_unused_objectid(struct reiserfs_transaction_handle *th);
1768void reiserfs_release_objectid(struct reiserfs_transaction_handle *th,
1769 __u32 objectid_to_release);
1770int reiserfs_convert_objectid_map_v1(struct super_block *);
1771
1772
1773int B_IS_IN_TREE(const struct buffer_head *);
1774extern void copy_item_head(struct item_head *p_v_to,
1775 const struct item_head *p_v_from);
1776
1777
1778extern int comp_short_keys(const struct reiserfs_key *le_key,
1779 const struct cpu_key *cpu_key);
1780extern void le_key2cpu_key(struct cpu_key *to, const struct reiserfs_key *from);
1781
1782
1783extern int comp_le_keys(const struct reiserfs_key *,
1784 const struct reiserfs_key *);
1785extern int comp_short_le_keys(const struct reiserfs_key *,
1786 const struct reiserfs_key *);
1787
1788
1789
1790
1791static inline int le_key_version(const struct reiserfs_key *key)
1792{
1793 int type;
1794
1795 type = offset_v2_k_type(&(key->u.k_offset_v2));
1796 if (type != TYPE_DIRECT && type != TYPE_INDIRECT
1797 && type != TYPE_DIRENTRY)
1798 return KEY_FORMAT_3_5;
1799
1800 return KEY_FORMAT_3_6;
1801
1802}
1803
1804static inline void copy_key(struct reiserfs_key *to,
1805 const struct reiserfs_key *from)
1806{
1807 memcpy(to, from, KEY_SIZE);
1808}
1809
1810int comp_items(const struct item_head *stored_ih, const struct treepath *p_s_path);
1811const struct reiserfs_key *get_rkey(const struct treepath *p_s_chk_path,
1812 const struct super_block *p_s_sb);
1813int search_by_key(struct super_block *, const struct cpu_key *,
1814 struct treepath *, int);
1815#define search_item(s,key,path) search_by_key (s, key, path, DISK_LEAF_NODE_LEVEL)
1816int search_for_position_by_key(struct super_block *p_s_sb,
1817 const struct cpu_key *p_s_cpu_key,
1818 struct treepath *p_s_search_path);
1819extern void decrement_bcount(struct buffer_head *p_s_bh);
1820void decrement_counters_in_path(struct treepath *p_s_search_path);
1821void pathrelse(struct treepath *p_s_search_path);
1822int reiserfs_check_path(struct treepath *p);
1823void pathrelse_and_restore(struct super_block *s, struct treepath *p_s_search_path);
1824
1825int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
1826 struct treepath *path,
1827 const struct cpu_key *key,
1828 struct item_head *ih,
1829 struct inode *inode, const char *body);
1830
1831int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th,
1832 struct treepath *path,
1833 const struct cpu_key *key,
1834 struct inode *inode,
1835 const char *body, int paste_size);
1836
1837int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
1838 struct treepath *path,
1839 struct cpu_key *key,
1840 struct inode *inode,
1841 struct page *page, loff_t new_file_size);
1842
1843int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
1844 struct treepath *path,
1845 const struct cpu_key *key,
1846 struct inode *inode, struct buffer_head *p_s_un_bh);
1847
1848void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
1849 struct inode *inode, struct reiserfs_key *key);
1850int reiserfs_delete_object(struct reiserfs_transaction_handle *th,
1851 struct inode *p_s_inode);
1852int reiserfs_do_truncate(struct reiserfs_transaction_handle *th,
1853 struct inode *p_s_inode, struct page *,
1854 int update_timestamps);
1855
1856#define i_block_size(inode) ((inode)->i_sb->s_blocksize)
1857#define file_size(inode) ((inode)->i_size)
1858#define tail_size(inode) (file_size (inode) & (i_block_size (inode) - 1))
1859
1860#define tail_has_to_be_packed(inode) (have_large_tails ((inode)->i_sb)?\
1861!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 )
1862
1863void padd_item(char *item, int total_length, int length);
1864
1865
1866
1867#define GET_BLOCK_NO_CREATE 0
1868#define GET_BLOCK_CREATE 1
1869#define GET_BLOCK_NO_HOLE 2
1870#define GET_BLOCK_READ_DIRECT 4
1871#define GET_BLOCK_NO_IMUX 8
1872#define GET_BLOCK_NO_DANGLE 16
1873
1874void reiserfs_read_locked_inode(struct inode *inode,
1875 struct reiserfs_iget_args *args);
1876int reiserfs_find_actor(struct inode *inode, void *p);
1877int reiserfs_init_locked_inode(struct inode *inode, void *p);
1878void reiserfs_delete_inode(struct inode *inode);
1879int reiserfs_write_inode(struct inode *inode, int);
1880int reiserfs_get_block(struct inode *inode, sector_t block,
1881 struct buffer_head *bh_result, int create);
1882struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
1883 int fh_len, int fh_type);
1884struct dentry *reiserfs_fh_to_parent(struct super_block *sb, struct fid *fid,
1885 int fh_len, int fh_type);
1886int reiserfs_encode_fh(struct dentry *dentry, __u32 * data, int *lenp,
1887 int connectable);
1888
1889int reiserfs_truncate_file(struct inode *, int update_timestamps);
1890void make_cpu_key(struct cpu_key *cpu_key, struct inode *inode, loff_t offset,
1891 int type, int key_length);
1892void make_le_item_head(struct item_head *ih, const struct cpu_key *key,
1893 int version,
1894 loff_t offset, int type, int length, int entry_count);
1895struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key);
1896
1897int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
1898 struct inode *dir, int mode,
1899 const char *symname, loff_t i_size,
1900 struct dentry *dentry, struct inode *inode);
1901
1902void reiserfs_update_sd_size(struct reiserfs_transaction_handle *th,
1903 struct inode *inode, loff_t size);
1904
1905static inline void reiserfs_update_sd(struct reiserfs_transaction_handle *th,
1906 struct inode *inode)
1907{
1908 reiserfs_update_sd_size(th, inode, inode->i_size);
1909}
1910
1911void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode);
1912void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs);
1913int reiserfs_setattr(struct dentry *dentry, struct iattr *attr);
1914
1915
1916void set_de_name_and_namelen(struct reiserfs_dir_entry *de);
1917int search_by_entry_key(struct super_block *sb, const struct cpu_key *key,
1918 struct treepath *path, struct reiserfs_dir_entry *de);
1919struct dentry *reiserfs_get_parent(struct dentry *);
1920
1921
1922#if defined( CONFIG_PROC_FS ) && defined( CONFIG_REISERFS_PROC_INFO )
1923#define REISERFS_PROC_INFO
1924#else
1925#undef REISERFS_PROC_INFO
1926#endif
1927
1928int reiserfs_proc_info_init(struct super_block *sb);
1929int reiserfs_proc_info_done(struct super_block *sb);
1930struct proc_dir_entry *reiserfs_proc_register_global(char *name,
1931 read_proc_t * func);
1932void reiserfs_proc_unregister_global(const char *name);
1933int reiserfs_proc_info_global_init(void);
1934int reiserfs_proc_info_global_done(void);
1935int reiserfs_global_version_in_proc(char *buffer, char **start, off_t offset,
1936 int count, int *eof, void *data);
1937
1938#if defined( REISERFS_PROC_INFO )
1939
1940#define PROC_EXP( e ) e
1941
1942#define __PINFO( sb ) REISERFS_SB(sb) -> s_proc_info_data
1943#define PROC_INFO_MAX( sb, field, value ) \
1944 __PINFO( sb ).field = \
1945 max( REISERFS_SB( sb ) -> s_proc_info_data.field, value )
1946#define PROC_INFO_INC( sb, field ) ( ++ ( __PINFO( sb ).field ) )
1947#define PROC_INFO_ADD( sb, field, val ) ( __PINFO( sb ).field += ( val ) )
1948#define PROC_INFO_BH_STAT( sb, bh, level ) \
1949 PROC_INFO_INC( sb, sbk_read_at[ ( level ) ] ); \
1950 PROC_INFO_ADD( sb, free_at[ ( level ) ], B_FREE_SPACE( bh ) ); \
1951 PROC_INFO_ADD( sb, items_at[ ( level ) ], B_NR_ITEMS( bh ) )
1952#else
1953#define PROC_EXP( e )
1954#define VOID_V ( ( void ) 0 )
1955#define PROC_INFO_MAX( sb, field, value ) VOID_V
1956#define PROC_INFO_INC( sb, field ) VOID_V
1957#define PROC_INFO_ADD( sb, field, val ) VOID_V
1958#define PROC_INFO_BH_STAT( p_s_sb, p_s_bh, n_node_level ) VOID_V
1959#endif
1960
1961
1962extern const struct inode_operations reiserfs_dir_inode_operations;
1963extern const struct inode_operations reiserfs_symlink_inode_operations;
1964extern const struct inode_operations reiserfs_special_inode_operations;
1965extern const struct file_operations reiserfs_dir_operations;
1966
1967
1968int direct2indirect(struct reiserfs_transaction_handle *, struct inode *,
1969 struct treepath *, struct buffer_head *, loff_t);
1970int indirect2direct(struct reiserfs_transaction_handle *, struct inode *,
1971 struct page *, struct treepath *, const struct cpu_key *,
1972 loff_t, char *);
1973void reiserfs_unmap_buffer(struct buffer_head *);
1974
1975
1976extern const struct inode_operations reiserfs_file_inode_operations;
1977extern const struct file_operations reiserfs_file_operations;
1978extern const struct address_space_operations reiserfs_address_space_operations;
1979
1980
1981
1982int fix_nodes(int n_op_mode, struct tree_balance *p_s_tb,
1983 struct item_head *p_s_ins_ih, const void *);
1984void unfix_nodes(struct tree_balance *);
1985
1986
1987void reiserfs_panic(struct super_block *s, const char *fmt, ...)
1988 __attribute__ ((noreturn));
1989void reiserfs_info(struct super_block *s, const char *fmt, ...);
1990void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...);
1991void print_indirect_item(struct buffer_head *bh, int item_num);
1992void store_print_tb(struct tree_balance *tb);
1993void print_cur_tb(char *mes);
1994void print_de(struct reiserfs_dir_entry *de);
1995void print_bi(struct buffer_info *bi, char *mes);
1996#define PRINT_LEAF_ITEMS 1
1997#define PRINT_DIRECTORY_ITEMS 2
1998#define PRINT_DIRECT_ITEMS 4
1999void print_block(struct buffer_head *bh, ...);
2000void print_bmap(struct super_block *s, int silent);
2001void print_bmap_block(int i, char *data, int size, int silent);
2002
2003void print_objectid_map(struct super_block *s);
2004void print_block_head(struct buffer_head *bh, char *mes);
2005void check_leaf(struct buffer_head *bh);
2006void check_internal(struct buffer_head *bh);
2007void print_statistics(struct super_block *s);
2008char *reiserfs_hashname(int code);
2009
2010
2011int leaf_move_items(int shift_mode, struct tree_balance *tb, int mov_num,
2012 int mov_bytes, struct buffer_head *Snew);
2013int leaf_shift_left(struct tree_balance *tb, int shift_num, int shift_bytes);
2014int leaf_shift_right(struct tree_balance *tb, int shift_num, int shift_bytes);
2015void leaf_delete_items(struct buffer_info *cur_bi, int last_first, int first,
2016 int del_num, int del_bytes);
2017void leaf_insert_into_buf(struct buffer_info *bi, int before,
2018 struct item_head *inserted_item_ih,
2019 const char *inserted_item_body, int zeros_number);
2020void leaf_paste_in_buffer(struct buffer_info *bi, int pasted_item_num,
2021 int pos_in_item, int paste_size, const char *body,
2022 int zeros_number);
2023void leaf_cut_from_buffer(struct buffer_info *bi, int cut_item_num,
2024 int pos_in_item, int cut_size);
2025void leaf_paste_entries(struct buffer_head *bh, int item_num, int before,
2026 int new_entry_count, struct reiserfs_de_head *new_dehs,
2027 const char *records, int paste_size);
2028
2029int balance_internal(struct tree_balance *, int, int, struct item_head *,
2030 struct buffer_head **);
2031
2032
2033void do_balance_mark_leaf_dirty(struct tree_balance *tb,
2034 struct buffer_head *bh, int flag);
2035#define do_balance_mark_internal_dirty do_balance_mark_leaf_dirty
2036#define do_balance_mark_sb_dirty do_balance_mark_leaf_dirty
2037
2038void do_balance(struct tree_balance *tb, struct item_head *ih,
2039 const char *body, int flag);
2040void reiserfs_invalidate_buffer(struct tree_balance *tb,
2041 struct buffer_head *bh);
2042
2043int get_left_neighbor_position(struct tree_balance *tb, int h);
2044int get_right_neighbor_position(struct tree_balance *tb, int h);
2045void replace_key(struct tree_balance *tb, struct buffer_head *, int,
2046 struct buffer_head *, int);
2047void make_empty_node(struct buffer_info *);
2048struct buffer_head *get_FEB(struct tree_balance *);
2049
2050
2051
2052
2053
2054struct __reiserfs_blocknr_hint {
2055 struct inode *inode;
2056 sector_t block;
2057 struct in_core_key key;
2058 struct treepath *path;
2059
2060 struct reiserfs_transaction_handle *th;
2061
2062 b_blocknr_t beg, end;
2063 b_blocknr_t search_start;
2064
2065
2066 int prealloc_size;
2067
2068
2069 unsigned formatted_node:1;
2070
2071 unsigned preallocate:1;
2072};
2073
2074typedef struct __reiserfs_blocknr_hint reiserfs_blocknr_hint_t;
2075
2076int reiserfs_parse_alloc_options(struct super_block *, char *);
2077void reiserfs_init_alloc_options(struct super_block *s);
2078
2079
2080
2081
2082
2083
2084__le32 reiserfs_choose_packing(struct inode *dir);
2085
2086int reiserfs_init_bitmap_cache(struct super_block *sb);
2087void reiserfs_free_bitmap_cache(struct super_block *sb);
2088void reiserfs_cache_bitmap_metadata(struct super_block *sb, struct buffer_head *bh, struct reiserfs_bitmap_info *info);
2089struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb, unsigned int bitmap);
2090int is_reusable(struct super_block *s, b_blocknr_t block, int bit_value);
2091void reiserfs_free_block(struct reiserfs_transaction_handle *th, struct inode *,
2092 b_blocknr_t, int for_unformatted);
2093int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *, b_blocknr_t *, int,
2094 int);
2095static inline int reiserfs_new_form_blocknrs(struct tree_balance *tb,
2096 b_blocknr_t * new_blocknrs,
2097 int amount_needed)
2098{
2099 reiserfs_blocknr_hint_t hint = {
2100 .th = tb->transaction_handle,
2101 .path = tb->tb_path,
2102 .inode = NULL,
2103 .key = tb->key,
2104 .block = 0,
2105 .formatted_node = 1
2106 };
2107 return reiserfs_allocate_blocknrs(&hint, new_blocknrs, amount_needed,
2108 0);
2109}
2110
2111static inline int reiserfs_new_unf_blocknrs(struct reiserfs_transaction_handle
2112 *th, struct inode *inode,
2113 b_blocknr_t * new_blocknrs,
2114 struct treepath *path,
2115 sector_t block)
2116{
2117 reiserfs_blocknr_hint_t hint = {
2118 .th = th,
2119 .path = path,
2120 .inode = inode,
2121 .block = block,
2122 .formatted_node = 0,
2123 .preallocate = 0
2124 };
2125 return reiserfs_allocate_blocknrs(&hint, new_blocknrs, 1, 0);
2126}
2127
2128#ifdef REISERFS_PREALLOCATE
2129static inline int reiserfs_new_unf_blocknrs2(struct reiserfs_transaction_handle
2130 *th, struct inode *inode,
2131 b_blocknr_t * new_blocknrs,
2132 struct treepath *path,
2133 sector_t block)
2134{
2135 reiserfs_blocknr_hint_t hint = {
2136 .th = th,
2137 .path = path,
2138 .inode = inode,
2139 .block = block,
2140 .formatted_node = 0,
2141 .preallocate = 1
2142 };
2143 return reiserfs_allocate_blocknrs(&hint, new_blocknrs, 1, 0);
2144}
2145
2146void reiserfs_discard_prealloc(struct reiserfs_transaction_handle *th,
2147 struct inode *inode);
2148void reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle *th);
2149#endif
2150
2151
2152__u32 keyed_hash(const signed char *msg, int len);
2153__u32 yura_hash(const signed char *msg, int len);
2154__u32 r5_hash(const signed char *msg, int len);
2155
2156
2157
2158
2159
2160#define reiserfs_test_and_set_le_bit ext2_set_bit
2161#define reiserfs_test_and_clear_le_bit ext2_clear_bit
2162#define reiserfs_test_le_bit ext2_test_bit
2163#define reiserfs_find_next_zero_le_bit ext2_find_next_zero_bit
2164
2165
2166
2167
2168
2169
2170
2171
2172#define SPARE_SPACE 500
2173
2174
2175int reiserfs_ioctl(struct inode *inode, struct file *filp,
2176 unsigned int cmd, unsigned long arg);
2177long reiserfs_compat_ioctl(struct file *filp,
2178 unsigned int cmd, unsigned long arg);
2179
2180
2181#define REISERFS_IOC_UNPACK _IOW(0xCD,1,long)
2182
2183
2184#define REISERFS_IOC_GETFLAGS FS_IOC_GETFLAGS
2185#define REISERFS_IOC_SETFLAGS FS_IOC_SETFLAGS
2186#define REISERFS_IOC_GETVERSION FS_IOC_GETVERSION
2187#define REISERFS_IOC_SETVERSION FS_IOC_SETVERSION
2188
2189
2190#define REISERFS_IOC32_UNPACK _IOW(0xCD, 1, int)
2191#define REISERFS_IOC32_GETFLAGS FS_IOC32_GETFLAGS
2192#define REISERFS_IOC32_SETFLAGS FS_IOC32_SETFLAGS
2193#define REISERFS_IOC32_GETVERSION FS_IOC32_GETVERSION
2194#define REISERFS_IOC32_SETVERSION FS_IOC32_SETVERSION
2195
2196
2197
2198
2199#define reiserfs_write_lock( sb ) lock_kernel()
2200#define reiserfs_write_unlock( sb ) unlock_kernel()
2201
2202
2203#define REISERFS_XATTR_DIR_SEM(s) (REISERFS_SB(s)->xattr_dir_sem)
2204
2205#endif
2206