1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #ifndef _LINUX_EXT2_FS_H
17 #define _LINUX_EXT2_FS_H
18
19 #include <linux/types.h>
20
21
22
23
24
25
26
27
28 #undef EXT2FS_DEBUG
29
30
31
32
33 #undef EXT2FS_DEBUG_CACHE
34
35
36
37
38 #undef EXT2FS_CHECK_CACHE
39
40
41
42
43 #undef EXT2FS_PRE_02B_COMPAT
44
45
46
47
48 #define EXT2_PREALLOCATE
49
50
51
52
53 #define EXT2FS_DATE "95/07/02"
54 #define EXT2FS_VERSION "0.5b"
55
56
57
58
59 #ifdef EXT2FS_DEBUG
60 # define ext2_debug(f, a...) { \
61 printk ("EXT2-fs DEBUG (%s, %d): %s:", \
62 __FILE__, __LINE__, __FUNCTION__); \
63 printk (f, ## a); \
64 }
65 #else
66 # define ext2_debug(f, a...)
67 #endif
68
69
70
71
72 #define EXT2_BAD_INO 1
73 #define EXT2_ROOT_INO 2
74 #define EXT2_ACL_IDX_INO 3
75 #define EXT2_ACL_DATA_INO 4
76 #define EXT2_BOOT_LOADER_INO 5
77 #define EXT2_UNDEL_DIR_INO 6
78 #define EXT2_FIRST_INO 11
79
80
81
82
83 #define EXT2_PRE_02B_MAGIC 0xEF51
84 #define EXT2_SUPER_MAGIC 0xEF53
85
86
87
88
89 #define EXT2_LINK_MAX 32000
90
91
92
93
94 #define EXT2_MIN_BLOCK_SIZE 1024
95 #define EXT2_MAX_BLOCK_SIZE 4096
96 #define EXT2_MIN_BLOCK_LOG_SIZE 10
97 #ifdef __KERNEL__
98 # define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize)
99 #else
100 # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
101 #endif
102 #define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry))
103 #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32))
104 #ifdef __KERNEL__
105 # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
106 #else
107 # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
108 #endif
109 #define EXT2_INODES_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_inode))
110 #ifdef __KERNEL__
111 #define EXT2_ADDR_PER_BLOCK_BITS(s) ((s)->u.ext2_sb.s_addr_per_block_bits)
112 #define EXT2_INODES_PER_BLOCK_BITS(s) ((s)->u.ext2_sb.s_inodes_per_block_bits)
113 #endif
114
115
116
117
118 #define EXT2_MIN_FRAG_SIZE 1024
119 #define EXT2_MAX_FRAG_SIZE 4096
120 #define EXT2_MIN_FRAG_LOG_SIZE 10
121 #ifdef __KERNEL__
122 # define EXT2_FRAG_SIZE(s) ((s)->u.ext2_sb.s_frag_size)
123 # define EXT2_FRAGS_PER_BLOCK(s) ((s)->u.ext2_sb.s_frags_per_block)
124 #else
125 # define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
126 # define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
127 #endif
128
129
130
131
132 struct ext2_acl_header
133 {
134 __u32 aclh_size;
135 __u32 aclh_file_count;
136 __u32 aclh_acle_count;
137 __u32 aclh_first_acle;
138 };
139
140 struct ext2_acl_entry
141 {
142 __u32 acle_size;
143 __u16 acle_perms;
144 __u16 acle_type;
145 __u16 acle_tag;
146 __u16 acle_pad1;
147 __u32 acle_next;
148
149 };
150
151
152
153
154 struct ext2_old_group_desc
155 {
156 __u32 bg_block_bitmap;
157 __u32 bg_inode_bitmap;
158 __u32 bg_inode_table;
159 __u16 bg_free_blocks_count;
160 __u16 bg_free_inodes_count;
161 };
162
163 struct ext2_group_desc
164 {
165 __u32 bg_block_bitmap;
166 __u32 bg_inode_bitmap;
167 __u32 bg_inode_table;
168 __u16 bg_free_blocks_count;
169 __u16 bg_free_inodes_count;
170 __u16 bg_used_dirs_count;
171 __u16 bg_pad;
172 __u32 bg_reserved[3];
173 };
174
175
176
177
178 #ifdef __KERNEL__
179 # define EXT2_BLOCKS_PER_GROUP(s) ((s)->u.ext2_sb.s_blocks_per_group)
180 # define EXT2_DESC_PER_BLOCK(s) ((s)->u.ext2_sb.s_desc_per_block)
181 # define EXT2_INODES_PER_GROUP(s) ((s)->u.ext2_sb.s_inodes_per_group)
182 # define EXT2_DESC_PER_BLOCK_BITS(s) ((s)->u.ext2_sb.s_desc_per_block_bits)
183 #else
184 # define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
185 # define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
186 # define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
187 #endif
188
189
190
191
192 #define EXT2_NDIR_BLOCKS 12
193 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
194 #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
195 #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
196 #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
197
198
199
200
201 #define EXT2_SECRM_FL 0x00000001
202 #define EXT2_UNRM_FL 0x00000002
203 #define EXT2_COMPR_FL 0x00000004
204 #define EXT2_SYNC_FL 0x00000008
205 #define EXT2_IMMUTABLE_FL 0x00000010
206 #define EXT2_APPEND_FL 0x00000020
207 #define EXT2_NODUMP_FL 0x00000040
208
209
210
211
212 #define EXT2_IOC_GETFLAGS _IOR('f', 1, long)
213 #define EXT2_IOC_SETFLAGS _IOW('f', 2, long)
214 #define EXT2_IOC_GETVERSION _IOR('v', 1, long)
215 #define EXT2_IOC_SETVERSION _IOW('v', 2, long)
216
217
218
219
220 struct ext2_inode {
221 __u16 i_mode;
222 __u16 i_uid;
223 __u32 i_size;
224 __u32 i_atime;
225 __u32 i_ctime;
226 __u32 i_mtime;
227 __u32 i_dtime;
228 __u16 i_gid;
229 __u16 i_links_count;
230 __u32 i_blocks;
231 __u32 i_flags;
232 union {
233 struct {
234 __u32 l_i_reserved1;
235 } linux1;
236 struct {
237 __u32 h_i_translator;
238 } hurd1;
239 struct {
240 __u32 m_i_reserved1;
241 } masix1;
242 } osd1;
243 __u32 i_block[EXT2_N_BLOCKS];
244 __u32 i_version;
245 __u32 i_file_acl;
246 __u32 i_dir_acl;
247 __u32 i_faddr;
248 union {
249 struct {
250 __u8 l_i_frag;
251 __u8 l_i_fsize;
252 __u16 i_pad1;
253 __u32 l_i_reserved2[2];
254 } linux2;
255 struct {
256 __u8 h_i_frag;
257 __u8 h_i_fsize;
258 __u16 h_i_mode_high;
259 __u16 h_i_uid_high;
260 __u16 h_i_gid_high;
261 __u32 h_i_author;
262 } hurd2;
263 struct {
264 __u8 m_i_frag;
265 __u8 m_i_fsize;
266 __u16 m_pad1;
267 __u32 m_i_reserved2[2];
268 } masix2;
269 } osd2;
270 };
271
272 #if defined(__KERNEL__) || defined(__linux__)
273 #define i_reserved1 osd1.linux1.l_i_reserved1
274 #define i_frag osd2.linux2.l_i_frag
275 #define i_fsize osd2.linux2.l_i_fsize
276 #define i_reserved2 osd2.linux2.l_i_reserved2
277 #endif
278
279 #ifdef __hurd__
280 #define i_translator osd1.hurd1.h_i_translator
281 #define i_frag osd2.hurd2.h_i_frag;
282 #define i_fsize osd2.hurd2.h_i_fsize;
283 #define i_uid_high osd2.hurd2.h_i_uid_high
284 #define i_gid_high osd2.hurd2.h_i_gid_high
285 #define i_author osd2.hurd2.h_i_author
286 #endif
287
288 #ifdef __masix__
289 #define i_reserved1 osd1.masix1.m_i_reserved1
290 #define i_frag osd2.masix2.m_i_frag
291 #define i_fsize osd2.masix2.m_i_fsize
292 #define i_reserved2 osd2.masix2.m_i_reserved2
293 #endif
294
295
296
297
298 #define EXT2_VALID_FS 0x0001
299 #define EXT2_ERROR_FS 0x0002
300
301
302
303
304 #define EXT2_MOUNT_CHECK_NORMAL 0x0001
305 #define EXT2_MOUNT_CHECK_STRICT 0x0002
306 #define EXT2_MOUNT_CHECK (EXT2_MOUNT_CHECK_NORMAL | \
307 EXT2_MOUNT_CHECK_STRICT)
308 #define EXT2_MOUNT_GRPID 0x0004
309 #define EXT2_MOUNT_DEBUG 0x0008
310 #define EXT2_MOUNT_ERRORS_CONT 0x0010
311 #define EXT2_MOUNT_ERRORS_RO 0x0020
312 #define EXT2_MOUNT_ERRORS_PANIC 0x0040
313 #define EXT2_MOUNT_MINIX_DF 0x0080
314
315 #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
316 #define set_opt(o, opt) o |= EXT2_MOUNT_##opt
317 #define test_opt(sb, opt) ((sb)->u.ext2_sb.s_mount_opt & \
318 EXT2_MOUNT_##opt)
319
320
321
322 #define EXT2_DFL_MAX_MNT_COUNT 20
323 #define EXT2_DFL_CHECKINTERVAL 0
324
325
326
327
328 #define EXT2_ERRORS_CONTINUE 1
329 #define EXT2_ERRORS_RO 2
330 #define EXT2_ERRORS_PANIC 3
331 #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
332
333
334
335
336 struct ext2_super_block {
337 __u32 s_inodes_count;
338 __u32 s_blocks_count;
339 __u32 s_r_blocks_count;
340 __u32 s_free_blocks_count;
341 __u32 s_free_inodes_count;
342 __u32 s_first_data_block;
343 __u32 s_log_block_size;
344 __s32 s_log_frag_size;
345 __u32 s_blocks_per_group;
346 __u32 s_frags_per_group;
347 __u32 s_inodes_per_group;
348 __u32 s_mtime;
349 __u32 s_wtime;
350 __u16 s_mnt_count;
351 __s16 s_max_mnt_count;
352 __u16 s_magic;
353 __u16 s_state;
354 __u16 s_errors;
355 __u16 s_pad;
356 __u32 s_lastcheck;
357 __u32 s_checkinterval;
358 __u32 s_creator_os;
359 __u32 s_rev_level;
360 __u16 s_def_resuid;
361 __u16 s_def_resgid;
362 __u32 s_reserved[235];
363 };
364
365 #define EXT2_OS_LINUX 0
366 #define EXT2_OS_HURD 1
367 #define EXT2_OS_MASIX 2
368
369 #define EXT2_CURRENT_REV 0
370
371 #define EXT2_DEF_RESUID 0
372 #define EXT2_DEF_RESGID 0
373
374
375
376
377 #define EXT2_NAME_LEN 255
378
379 struct ext2_dir_entry {
380 __u32 inode;
381 __u16 rec_len;
382 __u16 name_len;
383 char name[EXT2_NAME_LEN];
384 };
385
386
387
388
389
390
391 #define EXT2_DIR_PAD 4
392 #define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
393 #define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
394 ~EXT2_DIR_ROUND)
395
396 #ifdef __KERNEL__
397
398
399
400
401
402
403
404
405 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
406 # define NORET_TYPE __volatile__
407 # define ATTRIB_NORET
408 # define NORET_AND
409 #else
410 # define NORET_TYPE
411 # define ATTRIB_NORET __attribute__((noreturn))
412 # define NORET_AND noreturn,
413 #endif
414
415
416 extern int ext2_permission (struct inode *, int);
417
418
419 extern int ext2_new_block (struct super_block *, unsigned long,
420 __u32 *, __u32 *);
421 extern void ext2_free_blocks (struct super_block *, unsigned long,
422 unsigned long);
423 extern unsigned long ext2_count_free_blocks (struct super_block *);
424 extern void ext2_check_blocks_bitmap (struct super_block *);
425
426
427 extern unsigned long ext2_count_free (struct buffer_head *, unsigned);
428
429
430 extern int ext2_check_dir_entry (char *, struct inode *,
431 struct ext2_dir_entry *, struct buffer_head *,
432 unsigned long);
433
434
435 extern int ext2_read (struct inode *, struct file *, char *, int);
436 extern int ext2_write (struct inode *, struct file *, char *, int);
437
438
439 extern int ext2_sync_file (struct inode *, struct file *);
440
441
442 extern struct inode * ext2_new_inode (const struct inode *, int);
443 extern void ext2_free_inode (struct inode *);
444 extern unsigned long ext2_count_free_inodes (struct super_block *);
445 extern void ext2_check_inodes_bitmap (struct super_block *);
446
447
448 extern int ext2_bmap (struct inode *, int);
449
450 extern struct buffer_head * ext2_getblk (struct inode *, long, int, int *);
451 extern struct buffer_head * ext2_bread (struct inode *, int, int, int *);
452
453 extern int ext2_getcluster (struct inode * inode, long block);
454 extern void ext2_read_inode (struct inode *);
455 extern void ext2_write_inode (struct inode *);
456 extern void ext2_put_inode (struct inode *);
457 extern int ext2_sync_inode (struct inode *);
458 extern void ext2_discard_prealloc (struct inode *);
459
460
461 extern int ext2_ioctl (struct inode *, struct file *, unsigned int,
462 unsigned long);
463
464
465 extern void ext2_release (struct inode *, struct file *);
466 extern int ext2_lookup (struct inode *,const char *, int, struct inode **);
467 extern int ext2_create (struct inode *,const char *, int, int,
468 struct inode **);
469 extern int ext2_mkdir (struct inode *, const char *, int, int);
470 extern int ext2_rmdir (struct inode *, const char *, int);
471 extern int ext2_unlink (struct inode *, const char *, int);
472 extern int ext2_symlink (struct inode *, const char *, int, const char *);
473 extern int ext2_link (struct inode *, struct inode *, const char *, int);
474 extern int ext2_mknod (struct inode *, const char *, int, int, int);
475 extern int ext2_rename (struct inode *, const char *, int,
476 struct inode *, const char *, int);
477
478
479 extern void ext2_error (struct super_block *, const char *, const char *, ...)
480 __attribute__ ((format (printf, 3, 4)));
481 extern NORET_TYPE void ext2_panic (struct super_block *, const char *,
482 const char *, ...)
483 __attribute__ ((NORET_AND format (printf, 3, 4)));
484 extern void ext2_warning (struct super_block *, const char *, const char *, ...)
485 __attribute__ ((format (printf, 3, 4)));
486 extern void ext2_put_super (struct super_block *);
487 extern void ext2_write_super (struct super_block *);
488 extern int ext2_remount (struct super_block *, int *, char *);
489 extern struct super_block * ext2_read_super (struct super_block *,void *,int);
490 extern void ext2_statfs (struct super_block *, struct statfs *, int);
491
492
493 extern void ext2_truncate (struct inode *);
494
495
496
497
498
499
500 extern struct inode_operations ext2_dir_inode_operations;
501
502
503 extern struct inode_operations ext2_file_inode_operations;
504
505
506 extern struct inode_operations ext2_symlink_inode_operations;
507
508 #endif
509
510 #endif