1 /*
2     core.h -- reiserfs general code
3     Copyright (C) 2001, 2002 Yury Umanets <torque@ukrpost.net>, see COPYING for
4     licensing and copyright details.
5 */
6 
7 #ifndef CORE_H
8 #define CORE_H
9 
10 #include <dal/dal.h>
11 
12 #include "endian.h"
13 #include "hashes.h"
14 #include "block.h"
15 #include "bitmap.h"
16 #include "journal.h"
17 #include "gauge.h"
18 #include "filesystem.h"
19 
20 #define FS_CLEAN					1
21 #define FS_DIRTY					2
22 
23 #define FS_CONSISTENT					0
24 #define FS_CORRUPTED					1
25 
26 #define FS_SUPER_DIRTY					(1)
27 #define FS_BITMAP_DIRTY					(1 << 1)
28 #define FS_JOURNAL_DIRTY				(1 << 2)
29 
30 #define SUPER_V1_SIZE					(sizeof(reiserfs_super_v1_t))
31 #define SUPER_V2_SIZE					(sizeof(reiserfs_super_t))
32 
33 #define get_sb_jp(sb)					(&((sb)->s_v1.sb_journal))
34 
35 #define get_sb_block_count(sb)				get_le32(sb, s_v1.sb_block_count)
36 #define set_sb_block_count(sb, val)			set_le32(sb, s_v1.sb_block_count, val)
37 
38 #define get_sb_free_blocks(sb)				get_le32(sb, s_v1.sb_free_blocks)
39 #define set_sb_free_blocks(sb, val)			set_le32(sb, s_v1.sb_free_blocks, val)
40 
41 #define get_sb_root_block(sb)				get_le32(sb, s_v1.sb_root_block)
42 #define set_sb_root_block(sb, val)			set_le32(sb, s_v1.sb_root_block, val)
43 
44 #define get_sb_mount_id(sb)				get_le32(sb, s_v1.sb_mountid)
45 #define set_sb_mount_id(sb, val)			set_le32(sb, s_v1.sb_mountid, val)
46 
47 #define get_sb_block_size(sb)				get_le16(sb, s_v1.sb_block_size)
48 #define set_sb_block_size(sb, val)			set_le16(sb, s_v1.sb_block_size, val)
49 
50 #define get_sb_oid_maxsize(sb)				get_le16(sb, s_v1.sb_oid_maxsize)
51 #define set_sb_oid_maxsize(sb, val)			set_le16(sb, s_v1.sb_oid_maxsize, val)
52 
53 #define get_sb_oid_cursize(sb)				get_le16(sb, s_v1.sb_oid_cursize)
54 #define set_sb_oid_cursize(sb, val)			set_le16(sb, s_v1.sb_oid_cursize, val)
55 
56 #define get_sb_umount_state(sb)				get_le16(sb, s_v1.sb_umount_state)
57 #define set_sb_umount_state(sb, val)			set_le16(sb, s_v1.sb_umount_state, val)
58 
59 #define get_sb_fs_state(sb)				get_le16(sb, s_v1.sb_fs_state)
60 #define set_sb_fs_state(sb, val)			set_le16(sb, s_v1.sb_fs_state, val)
61 
62 #define get_sb_hash_code(sb)				get_le32(sb, s_v1.sb_hash_function_code)
63 #define set_sb_hash_code(sb, val)			set_le32(sb, s_v1.sb_hash_function_code, val)
64 
65 #define get_sb_tree_height(sb)				get_le16(sb, s_v1.sb_tree_height)
66 #define set_sb_tree_height(sb, val)			set_le16(sb, s_v1.sb_tree_height, val)
67 
68 #define get_sb_bmap_nr(sb)				get_le16(sb, s_v1.sb_bmap_nr)
69 #define set_sb_bmap_nr(sb, val)				set_le16(sb, s_v1.sb_bmap_nr, val)
70 
71 #define get_sb_format(sb)				get_le16(sb, s_v1.sb_format)
72 #define set_sb_format(sb, val)				set_le16(sb, s_v1.sb_format, val)
73 
74 #define get_sb_reserved_for_journal(sb)			get_le16(sb, s_v1.sb_reserved_for_journal)
75 #define set_sb_reserved_for_journal(sb,val)		set_le16(sb, s_v1.sb_reserved_for_journal,val)
76 
77 #define get_sb_objectid_map(sb) \
78     ((uint32_t *)((char *)(sb) + \
79     (sb->s_v1.sb_format == FS_FORMAT_3_6 ? \
80     SUPER_V2_SIZE : SUPER_V1_SIZE)))
81 
82 #define reiserfs_fs_super_dirty(fs)			(FS_SUPER_DIRTY & fs->flags)
83 #define reiserfs_fs_bitmap_dirty(fs)			(FS_BITMAP_DIRTY & fs->flags)
84 #define reiserfs_fs_journal_dirty(fs)			(FS_JOURNAL_DIRTY & fs->flags)
85 
86 #define reiserfs_fs_mark_super_dirty(fs)		(fs->flags |= FS_SUPER_DIRTY)
87 #define reiserfs_fs_mark_bitmap_dirty(fs)		(fs->flags |= FS_BITMAP_DIRTY)
88 #define reiserfs_fs_mark_journal_dirty(fs)		(fs->flags |= FS_JOURNAL_DIRTY)
89 
90 #define reiserfs_fs_mark_super_clean(fs)		(fs->flags &= ~FS_SUPER_DIRTY)
91 #define reiserfs_fs_mark_bitmap_clean(fs)		(fs->flags &= ~FS_BITMAP_DIRTY)
92 #define reiserfs_fs_mark_journal_clean(fs)		(fs->flags &= ~FS_JOURNAL_DIRTY)
93 
94 extern dal_t *reiserfs_fs_host_dal(reiserfs_fs_t *fs);
95 
96 extern int reiserfs_fs_clobber(dal_t *dal);
97 extern int reiserfs_fs_clobber_skipped(dal_t *dal);
98 extern blk_t reiserfs_fs_probe(dal_t *dal);
99 
100 extern reiserfs_fs_t *reiserfs_fs_open(dal_t *host_dal, dal_t *journal_dal);
101 extern reiserfs_fs_t *reiserfs_fs_open_fast(dal_t *host_dal, dal_t *journal_dal);
102 
103 extern reiserfs_fs_t *reiserfs_fs_create(dal_t *host_dal, dal_t *journal_dal,
104     blk_t start, blk_t max_trans, blk_t len, size_t blocksize, int format,
105     reiserfs_hash_t hash, const char *label, const char *uuid, blk_t fs_len);
106 
107 extern int reiserfs_fs_sync(reiserfs_fs_t *fs);
108 extern void reiserfs_fs_close(reiserfs_fs_t *fs);
109 
110 extern int reiserfs_fs_resize_smart(reiserfs_fs_t *fs, long start, long end);
111 extern int reiserfs_fs_resize_dumb(reiserfs_fs_t *fs, blk_t fs_len);
112 
113 extern reiserfs_fs_t *reiserfs_fs_copy(reiserfs_fs_t *src_fs, dal_t *dst_dal);
114 
115 extern int reiserfs_fs_is_consistent(reiserfs_fs_t *fs);
116 extern int reiserfs_fs_is_resizeable(reiserfs_fs_t *fs);
117 
118 extern int reiserfs_fs_format(reiserfs_fs_t *fs);
119 
120 extern const char *reiserfs_fs_long_format(reiserfs_fs_t *fs);
121 extern const char *reiserfs_fs_long_format_str(int format);
122 
123 extern const char *reiserfs_fs_short_format(reiserfs_fs_t *fs);
124 extern const char *reiserfs_fs_short_format_str(int format);
125 extern int reiserfs_fs_format_from_str(const char *format);
126 
127 extern reiserfs_hash_t reiserfs_fs_hash(reiserfs_fs_t *fs);
128 extern const char *reiserfs_fs_hash_str(reiserfs_hash_t hash);
129 extern reiserfs_hash_t reiserfs_fs_hash_from_str(const char *hash);
130 
131 extern int reiserfs_fs_state(reiserfs_fs_t *fs);
132 extern int reiserfs_fs_state_update(reiserfs_fs_t *fs, uint32_t state);
133 extern const char *reiserfs_fs_state_str(uint32_t state);
134 
135 extern size_t reiserfs_fs_block_size(reiserfs_fs_t *fs);
136 
137 extern blk_t reiserfs_fs_size(reiserfs_fs_t *fs);
138 extern blk_t reiserfs_fs_min_size(reiserfs_fs_t *fs);
139 extern blk_t reiserfs_fs_free_size(reiserfs_fs_t *fs);
140 extern blk_t reiserfs_fs_metadata_size(reiserfs_fs_t *fs);
141 
142 extern reiserfs_hash_func_t reiserfs_fs_hash_func(reiserfs_hash_t hash_code);
143 extern uint32_t reiserfs_fs_hash_value(reiserfs_fs_t *fs, const char *name);
144 
145 extern char *reiserfs_fs_label(reiserfs_fs_t *fs);
146 extern void reiserfs_fs_label_update(reiserfs_fs_t *fs, const char *label);
147 extern char *reiserfs_fs_uuid(reiserfs_fs_t *fs);
148 extern void reiserfs_fs_uuid_update(reiserfs_fs_t *fs, const char *uuid);
149 
150 extern int reiserfs_fs_set_root(reiserfs_fs_t *fs, blk_t blk);
151 extern dal_t *reiserfs_fs_host_dal(reiserfs_fs_t *fs);
152 
153 extern void *reiserfs_fs_get_data(reiserfs_fs_t *fs);
154 extern void reiserfs_fs_set_data(reiserfs_fs_t *fs, void *data);
155 
156 /* Journal functions */
157 extern blk_t reiserfs_fs_journal_size(reiserfs_fs_t *fs);
158 extern blk_t reiserfs_fs_journal_offset(reiserfs_fs_t *fs);
159 extern int reiserfs_fs_journal_opened(reiserfs_fs_t *fs);
160 
161 #define reiserfs_fs_journal_relocated(fs) reiserfs_fs_journal_kind(fs)
162 #define reiserfs_fs_journal_standard(fs) (!reiserfs_fs_journal_kind(fs))
163 
164 extern int reiserfs_fs_journal_kind(reiserfs_fs_t *fs);
165 extern const char *reiserfs_fs_journal_kind_str(int relocated);
166 
167 extern int reiserfs_fs_journal_open(reiserfs_fs_t *fs, dal_t *dal);
168 extern int reiserfs_fs_journal_reopen(reiserfs_fs_t *fs, dal_t *dal);
169 extern int reiserfs_fs_journal_create(reiserfs_fs_t *fs, dal_t *dal, blk_t start,
170     blk_t len, blk_t max_trans);
171 
172 extern int reiserfs_fs_journal_recreate(reiserfs_fs_t *fs, dal_t *dal,
173     blk_t start, blk_t len, blk_t max_trans);
174 
175 extern int reiserfs_fs_journal_sync(reiserfs_fs_t *fs);
176 extern void reiserfs_fs_journal_close(reiserfs_fs_t *fs);
177 extern reiserfs_journal_t *reiserfs_fs_journal(reiserfs_fs_t *fs);
178 
179 extern int reiserfs_fs_journal_tune(reiserfs_fs_t *fs, dal_t *dal,
180     blk_t start, blk_t len, blk_t max_trans);
181 
182 /* Bitmap functions */
183 extern int reiserfs_fs_bitmap_opened(reiserfs_fs_t *fs);
184 extern void reiserfs_fs_bitmap_use_block(reiserfs_fs_t *fs, blk_t block);
185 extern void reiserfs_fs_bitmap_unuse_block(reiserfs_fs_t *fs, blk_t block);
186 extern int reiserfs_fs_bitmap_test_block(reiserfs_fs_t *fs, blk_t block);
187 
188 extern blk_t reiserfs_fs_bitmap_find_free_block(reiserfs_fs_t *fs,
189     blk_t start);
190 
191 extern blk_t reiserfs_fs_bitmap_calc_used(reiserfs_fs_t *fs);
192 extern blk_t reiserfs_fs_bitmap_calc_used(reiserfs_fs_t *fs);
193 extern blk_t reiserfs_fs_bitmap_used(reiserfs_fs_t *fs);
194 extern blk_t reiserfs_fs_bitmap_unused(reiserfs_fs_t *fs);
195 extern int reiserfs_fs_bitmap_check(reiserfs_fs_t *fs);
196 extern int reiserfs_fs_bitmap_open(reiserfs_fs_t *fs);
197 
198 extern int reiserfs_fs_bitmap_create(reiserfs_fs_t *fs, size_t blocksize,
199     blk_t fs_len);
200 
201 extern int reiserfs_fs_bitmap_resize(reiserfs_fs_t *fs, long start, long end);
202 extern int reiserfs_fs_bitmap_sync(reiserfs_fs_t *fs);
203 extern void reiserfs_fs_bitmap_close(reiserfs_fs_t *fs);
204 extern int reiserfs_fs_bitmap_reopen(reiserfs_fs_t *fs);
205 extern reiserfs_bitmap_t *reiserfs_fs_bitmap(reiserfs_fs_t *fs);
206 
207 /* Superblock functions */
208 extern int reiserfs_fs_super_sync(reiserfs_fs_t *fs);
209 extern int reiserfs_fs_super_open(reiserfs_fs_t *fs);
210 
211 extern int reiserfs_fs_super_create(reiserfs_fs_t *fs, int format,
212     reiserfs_hash_t hash, const char *label, const char *uuid, size_t blocksize,
213     blk_t start, blk_t len, blk_t fs_len, int relocated);
214 
215 extern void reiserfs_fs_super_close(reiserfs_fs_t *fs);
216 
217 extern reiserfs_super_t *reiserfs_fs_super(reiserfs_fs_t *fs);
218 
219 /* Tree functions */
220 extern int reiserfs_fs_tree_open(reiserfs_fs_t *fs);
221 extern int reiserfs_fs_tree_create(reiserfs_fs_t *fs);
222 extern void reiserfs_fs_tree_close(reiserfs_fs_t *fs);
223 extern void *reiserfs_fs_tree(reiserfs_fs_t *fs);
224 
225 #endif
226 
227