forked from Ninals-GitHub/Learning-Ext2-Filesystem
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathme2fs.h
665 lines (596 loc) · 23.3 KB
/
me2fs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
/*********************************************************************************
File : me2fs.h
Description : Defines for my ext2 file system
*********************************************************************************/
#ifndef __ME2FS_H__
#define __ME2FS_H__
#include <linux/types.h>
#include <linux/unistd.h>
#include <linux/fs.h>
#include <linux/buffer_head.h>
#include <linux/blockgroup_lock.h>
#include <linux/rbtree.h>
#include <uapi/linux/magic.h>
#include <linux/sysfs.h>
#include <linux/kobject.h>
#include <linux/completion.h>
/*
==================================================================================
Prototype Statement
==================================================================================
*/
/*
==================================================================================
DEFINES
==================================================================================
*/
#define ME2FS_SUPER_MAGIC EXT2_SUPER_MAGIC /* 0xEF53 */
#define ME2FS_OLD_REV 0
#define ME2FS_DYNAMIC_REV 1
#define ME2FS_NDIR_BLOCKS ( 12 )
#define ME2FS_IND_BLOCK ME2FS_NDIR_BLOCKS
#define ME2FS_2IND_BLOCK ( ME2FS_IND_BLOCK + 1 )
#define ME2FS_3IND_BLOCK ( ME2FS_2IND_BLOCK + 1 )
#define ME2FS_NR_BLOCKS ( ME2FS_3IND_BLOCK + 1 )
/*
----------------------------------------------------------------------------------
Special Inode Number
----------------------------------------------------------------------------------
*/
#define ME2FS_EXT2_BAD_INO 1 /* bad blocks inode */
#define ME2FS_EXT2_ROOT_INO 2
#define ME2FS_EXT2_BL_INO 5 /* boot loader inode */
#define ME2FS_EXT2_UNDEL_DIR_INO 6 /* undelete directory inode */
#define EXT2_BAD_INO ME2FS_EXT2_BAD_INO
#define EXT2_ROOT_INO ME2FS_EXT2_ROOT_INO
#define EXT2_BL_INO ME2FS_EXT2_BL_INO
#define EXT2_UNDEL_DIR_INO ME2FS_EXT2_UNDEL_DIR_INO
/*
----------------------------------------------------------------------------------
Maximal Count of Links to a File
----------------------------------------------------------------------------------
*/
#define ME2FS_LINK_MAX 32000
/*
----------------------------------------------------------------------------------
Maximum Name Length
----------------------------------------------------------------------------------
*/
#define ME2FS_NAME_LEN ( 255 )
/*
----------------------------------------------------------------------------------
Reservation Window
----------------------------------------------------------------------------------
*/
/* reservation window */
struct ext2_reserve_window
{
unsigned long _rsv_start; /* first byte reserved */
unsigned long _rsv_end; /* last byte reserved or 0 */
};
/* node of reservation window */
struct ext2_reserve_window_node
{
struct rb_node rsv_node;
__u32 rsv_goal_size;
__u32 rsv_alloc_hit;
struct ext2_reserve_window rsv_window;
};
/*
----------------------------------------------------------------------------------
Block Allocation Information
----------------------------------------------------------------------------------
*/
struct ext2_block_alloc_info
{
struct ext2_reserve_window_node rsv_window_node;
__u32 last_alloc_logical_block;
unsigned long last_alloc_physical_block;
};
#define rsv_start rsv_window._rsv_start
#define rsv_end rsv_window._rsv_end
/*
----------------------------------------------------------------------------------
Ext2 Block Group Descriptor
----------------------------------------------------------------------------------
*/
struct ext2_group_desc
{
__le32 bg_block_bitmap;
__le32 bg_inode_bitmap;
__le32 bg_inode_table;
__le16 bg_free_blocks_count;
__le16 bg_free_inodes_count;
__le16 bg_used_dirs_count;
__le16 bg_pad;
__le32 bg_reserved[ 3 ];
};
/*
----------------------------------------------------------------------------------
Ioctl
----------------------------------------------------------------------------------
*/
/* ioctl commands */
#define EXT2_IOC_GETFLAGS FS_IOC_GETFLAGS
#define EXT2_IOC_SETFLAGS FS_IOC_SETFLAGS
#define EXT2_IOC_GETVERSION FS_IOC_GETVERSION
#define EXT2_IOC_SETVERSION FS_IOC_SETVERSION
#define EXT2_IOC_GETRSVSZ _IOR( 'f', 5, long )
#define EXT2_IOC_SETRSVSZ _IOW( 'f', 6, long )
/* ioctl commands in 32 bit emulation */
#define EXT2_IOC32_GETFLAGS FS_IOC32_GETFLAGS
#define EXT2_IOC32_SETFLAGS FS_IOC32_SETFLAGS
#define EXT2_IOC32_GETVERSION FS_IOC32_GETVERSION
#define EXT2_IOC32_SETVERSION FS_IOC32_SETVERSION
/*
----------------------------------------------------------------------------------
Ext2 Inode
----------------------------------------------------------------------------------
*/
struct ext2_inode
{
__le16 i_mode; /* file mode */
__le16 i_uid; /* low 16 bits of owner uid */
__le32 i_size; /* size in bytes */
__le32 i_atime; /* access time */
__le32 i_ctime; /* creation time */
__le32 i_mtime; /* modification time */
__le32 i_dtime; /* deletion time */
__le16 i_gid; /* low 16 bits of group id */
__le16 i_links_count; /* links count */
__le32 i_blocks;
__le32 i_flags; /* file flags */
union
{
struct
{
__le32 l_i_reserved1; /* for linux */
} linux1;
struct
{
__le32 h_i_translator; /* for hurd */
} hurd1;
struct
{
__le32 m_i_reserved1; /* for masix */
} masix1;
} osd1;
__le32 i_block[ ME2FS_NR_BLOCKS ]; /* pointers to blocks */
__le32 i_generation; /* file version (for NFS) */
__le32 i_file_acl; /* file access control */
__le32 i_dir_acl; /* directory access control */
/* file:higher 32byte of file size */
__le32 i_faddr; /* fragment address */
union
{
struct
{
__u8 l_i_frag; /* fragment number */
__u8 l_i_fsize; /* fragment size */
__u16 i_pad1;
__le16 l_i_uid_high; /* reserved */
__le16 l_i_gid_high; /* reserved */
__u32 l_i_reserved2;
} linux2;
struct
{
__u8 h_i_frag; /* fragment number */
__u8 h_i_fsize; /* fragment size */
__le16 h_i_mode_high;
__le16 h_i_uid_high;
__le16 h_i_gid_high;
__u32 h_i_reserved2;
} hurd2;
struct
{
__u8 m_i_frag; /* fragment number */
__u8 m_i_fsize; /* fragment size */
__u16 m_pad1;
__u32 m_i_reserved2[ 2 ];
} masix2;
} osd2;
};
/* i_flags */
#define EXT2_SECRM_FL FS_SECRM_FL /* secure deletion */
#define EXT2_UNRM_FL FS_UNRM_FL /* undelete */
#define EXT2_COMPR_FL FS_COMPR_FL /* compress file */
#define EXT2_SYNC_FL FS_SYNC_FL /* synchronous updates */
#define EXT2_IMMUTABLE_FL FS_IMMUTABLE_FL /* immutable file */
#define EXT2_APPEND_FL FS_APPEND_FL /* write to file may only append */
#define EXT2_NODUMP_FL FS_NODUMP_FL /* do not dump file */
#define EXT2_NOATIME_FL FS_NOATIME_FL /* do not update atime */
/* i_flags reserved for compression usage */
#define EXT2_DIRTY_FL FS_DIRTY_FL
#define EXT2_COMPRBLK_FL FS_COMPRBLK_FL /* one or more compressed cluster */
#define EXT2_NOCOMP_FL FS_NOCOMP_FL /* dont compress */
#define EXT2_ECOMPR_FL FS_ECOMPR_FL /* comression error */
/* i_flags end compression flags */
#define EXT2_BTREE_FL FS_BTREE_FL /* bree format dir */
#define EXT2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */
#define EXT2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */
#define EXT2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* for ext3 */
#define EXT2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */
#define EXT2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour(directorys only*/
#define EXT2_TOPDIR_FL FS_TOPDIR_FL /* top of directory herarchies */
#define EXT2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */
#define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE
#define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE
/* flags that should be inherited by new inodes from their parent */
#define EXT2_FL_INHERITED ( EXT2_SECRM_FL | EXT2_UNRM_FL | \
EXT2_COMPR_FL | EXT2_SYNC_FL | \
EXT2_NODUMP_FL | EXT2_NOATIME_FL | \
EXT2_COMPRBLK_FL | EXT2_JOURNAL_DATA_FL | \
EXT2_NOCOMP_FL | EXT2_NOTAIL_FL | \
EXT2_DIRSYNC_FL )
/* flags that are appropriate for regular files */
#define EXT2_REG_FLMASK ( ~( EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL ) )
/* flags that are appropriate for non-dir/regular files */
#define EXT2_OTHER_FLMASK ( EXT2_NODUMP_FL | EXT2_TOPDIR_FL )
/*
---------------------------------------------------------------------------------
Me2fs(Ext2) Inode Inoformation
---------------------------------------------------------------------------------
*/
struct me2fs_inode_info
{
__le32 i_data[ ME2FS_NR_BLOCKS ];
__u32 i_flags;
__u32 i_faddr;
__u8 i_frag_no;
__u8 i_frag_size;
__u16 i_state;
__u32 i_file_acl;
__u32 i_dir_acl;
__u32 i_dtime;
__u32 i_dir_start_lookup;
struct inode vfs_inode;
/* ------------------------------------------------------------------------ */
/* lock */
/* ------------------------------------------------------------------------ */
rwlock_t i_meta_lock;
struct mutex truncate_mutex;
/* ------------------------------------------------------------------------ */
/* block reservation information */
/* ------------------------------------------------------------------------ */
__u32 i_block_group;
struct ext2_block_alloc_info *i_block_alloc_info;
};
/* inode dynamic state flags */
#define EXT2_STATE_NEW 0x00000001
/*
---------------------------------------------------------------------------------
Ext2 Super Block
---------------------------------------------------------------------------------
*/
struct ext2_super_block
{
__le32 s_inodes_count;
__le32 s_blocks_count;
__le32 s_r_blocks_count; /* reserved blocks count */
__le32 s_free_blocks_count;
__le32 s_free_inodes_count;
__le32 s_first_data_block;
__le32 s_log_block_size;
__le32 s_log_frag_size;
__le32 s_blocks_per_group;
__le32 s_frags_per_group;
__le32 s_inodes_per_group;
__le32 s_mtime; /* mount time */
__le32 s_wtime; /* write time */
__le16 s_mnt_count;
__le16 s_max_mnt_count;
__le16 s_magic;
__le16 s_state; /* file system state */
__le16 s_errors; /* behaviour when detecting error */
__le16 s_minor_rev_level; /* minor revision level */
__le32 s_lastcheck; /* time of last check */
__le32 s_checkinterval; /* max. time between checks */
__le32 s_creator_os;
__le16 s_rev_level; /* revision level */
__le16 s_def_resuid; /* default uid for reserved blocks */
__le16 s_def_resgid; /* default gid for reserved blocks */
/* ------------------------------------------------------------------------ */
/* Dynamic Revision */
/* ------------------------------------------------------------------------ */
__le32 s_first_ino; /* first non-reserved inode */
__le16 s_inode_size; /* size of inode structure */
__le16 s_block_group_nr; /* block group # of this superblock */
__le32 s_feature_compat; /* compatible feature set */
__le32 s_feature_incompat; /* incompatible feature set */
__le32 s_feature_ro_compat; /* readonly-compatible feature set */
__u8 s_uuid[ 16 ]; /* 128-bit uuid for volume */
char s_volume_name[ 16 ]; /* volume name */
char s_last_mounted[ 64 ]; /* directory where last mounted */
__le32 s_algorithm_usage_bitmap; /* For compression */
/* ------------------------------------------------------------------------ */
/* Peformance Hints */
/* ------------------------------------------------------------------------ */
__u8 s_prealloc_blocks; /* # of blocks to try to preallocate*/
__u8 s_prealloc_dir_blocks; /* # of preaalocat for dirs */
__u16 s_padding1;
/* ------------------------------------------------------------------------ */
/* Journaling Support */
/* ------------------------------------------------------------------------ */
__u8 s_journal_uuid[ 16 ]; /* uuid of journal superblock */
__u32 s_journal_inum; /* inode number of journal file */
__u32 s_journal_dev; /* device number of journal file */
__u32 s_last_orphan; /* start of list of inodes to delete*/
/* ------------------------------------------------------------------------ */
/* Directory Indexing Support */
/* ------------------------------------------------------------------------ */
__u32 s_hash_seed[ 4 ]; /* HTREE hash seed */
__u8 s_def_hash_version; /* default hash version */
__u8 s_reserved_char_pad;
__u16 s_reserved_word_pad;
/* ------------------------------------------------------------------------ */
/* Other options */
/* ------------------------------------------------------------------------ */
__le32 s_default_mount_opts;
__le32 s_first_meta_bg; /* first metablock block group */
__u32 s_reserved[ 190 ]; /* padding to the end */
};
/* defines for s_state */
#define EXT2_VALID_FS ( 1 )
#define EXT2_ERROR_FS ( 2 )
/* defines for s_errors */
#define EXT2_ERRORS_CONTINUE ( 1 )
#define EXT2_ERRORS_RO ( 2 )
#define EXT2_ERRORS_PANIC ( 3 )
/* defines for s_creator_os */
#define EXT2_OS_LINUX ( 0 )
#define EXT2_OS_HURD ( 1 )
#define EXT2_OS_MASIX ( 2 )
#define EXT2_OS_FREEBSD ( 3 )
#define EXT2_OS_LITES ( 4 )
/* defines for s_rev_level */
#define EXT2_GOOD_OLD_REV ( 0 )
#define EXT2_DYNAMIC_REV ( 1 )
/* defines for s_def_resuid */
#define EXT2_DEF_RESUID ( 0 )
/* defines for s_def_resgid */
#define EXT2_DEF_RESGID ( 0 )
/* defines for s_feature_compat */
#define EXT2_FEATURE_COMPAT_DIR_PREALLOC ( 0x0001 )
#define EXT2_FEATURE_COMPAT_IMAGC_INODES ( 0x0002 )
#define EXT2_FEATURE_COMPAT_HAS_JOURNAL ( 0x0004 )
#define EXT2_FEATURE_COMPAT_EXT_ATTR ( 0x0008 )
#define EXT2_FEATURE_COMPAT_RESIZE_INO ( 0x0010 )
#define EXT2_FEATURE_COMPAT_DIR_INDEX ( 0x0020 )
#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR
/* defines for s_feature_ro_compat */
#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER ( 0x0001 )
#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE ( 0x0002 )
#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR ( 0x0004 )
#define EXT2_FEATURE_RO_COMPAT_ANY ( 0xFFFFFFFF )
#define EXT2_FEATURE_RO_COMPAT_SUPP ( EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER | \
EXT2_FEATURE_RO_COMPAT_LARGE_FILE | \
EXT2_FEATURE_RO_COMPAT_BTREE_DIR )
#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP
/* defines for s_feature_incompat */
#define EXT2_FEATURE_INCOMPAT_COMPRESSION ( 0x0001 )
#define EXT2_FEATURE_INCOMPAT_FILETYPE ( 0x0002 )
#define EXT2_FEATURE_INCOMPAT_RECOVER ( 0x0004 )
#define EXT2_FEATURE_INCOMPAT_JOURNAL_DEV ( 0x0008 )
#define EXT2_FEATURE_INCOMPAT_META_BG ( 0x0010 )
#define EXT2_FEATURE_INCOMPAT_SUPP ( EXT2_FEATURE_INCOMPAT_FILETYPE | \
EXT2_FEATURE_INCOMPAT_META_BG )
#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP
/* defines for s_default_mount_opts and s_mount_opts */
#define EXT2_MOUNT_CHECK ( 0x00000001 )
#define EXT2_MOUNT_OLDALLOC ( 0x00000002 )
#define EXT2_MOUNT_GRPID ( 0x00000004 )
#define EXT2_MOUNT_DEBUG ( 0x00000008 )
#define EXT2_MOUNT_ERRORS_CONT ( 0x00000010 )
#define EXT2_MOUNT_ERRORS_RO ( 0x00000020 )
#define EXT2_MOUNT_ERRORS_PANIC ( 0x00000040 )
#define EXT2_MOUNT_MINIX_DF ( 0x00000080 )
#define EXT2_MOUNT_NOBH ( 0x00000100 )
#define EXT2_MOUNT_NO_UID32 ( 0x00000200 )
#define EXT2_MOUNT_XATTR_USER ( 0x00004000 )
#define EXT2_MOUNT_POSIX_ACL ( 0x00008000 )
#define EXT2_MOUNT_XIP ( 0x00010000 )
#define EXT2_MOUNT_USRQUOTA ( 0x00020000 )
#define EXT2_MOUNT_GRPQUOTA ( 0x00040000 )
#define EXT2_MOUNT_RESERVATION ( 0x00080000 )
/* default mount options */
#define EXT2_DEFM_DEBUG ( 0x0001 )
#define EXT2_DEFM_BSDGROUPS ( 0x0002 )
#define EXT2_DEFM_XATTR_USER ( 0x0004 )
#define EXT2_DEFM_ACL ( 0x0008 )
#define EXT2_DEFM_UID16 ( 0x0010 )
/* not useed by ext2, but reserved for use by ext3 */
#define EXT2_DEFM_JMODE ( 0x0060 )
#define EXT2_DEFM_JMODE_DATA ( 0x0020 )
#define EXT2_DEFM_JMODE_ORDERED ( 0x0040 )
#define EXT2_DEFM_JMODE_WBACK ( 0x0060 )
/*
---------------------------------------------------------------------------------
Me2fs(Ext2) Super Block Information
---------------------------------------------------------------------------------
*/
struct me2fs_sb_info
{
/* ------------------------------------------------------------------------ */
/* buffer cache information */
/* ------------------------------------------------------------------------ */
struct ext2_super_block *s_esb;
struct buffer_head *s_sbh;
struct buffer_head **s_group_desc;
/* ------------------------------------------------------------------------ */
/* disk informaiont cache */
/* ------------------------------------------------------------------------ */
/* super block */
unsigned long s_sb_block;
unsigned long s_mount_opt;
unsigned short s_mount_state;
/* inode */
unsigned short s_inode_size;
unsigned int s_first_ino;
unsigned long s_inodes_per_group;
unsigned long s_inodes_per_block;
unsigned long s_itb_per_group;
/* group */
unsigned long s_groups_count;
unsigned long s_blocks_per_group;
unsigned long s_desc_per_block; /* # of group desc per block*/
unsigned long s_gdb_count; /* # of group desc blocks */
/* fragment */
unsigned long s_frag_size;
unsigned long s_frags_per_block;
unsigned long s_frags_per_group;
/* defaults */
kuid_t s_resuid;
kgid_t s_resgid;
/* overhead */
unsigned long s_overhead_last; /* last calculated overhead */
unsigned long s_blocks_last; /* last seen block count */
/* ------------------------------------------------------------------------ */
/* lock */
/* ------------------------------------------------------------------------ */
struct blockgroup_lock *s_blockgroup_lock;
struct percpu_counter s_freeblocks_counter;
struct percpu_counter s_freeinodes_counter;
struct percpu_counter s_dirs_counter;
/* for s_mount_state, s_blocks_last, s_overhead_last and msi->s_esb itself */
spinlock_t s_lock;
spinlock_t s_rsv_window_lock;
/* ------------------------------------------------------------------------ */
/* procfs */
/* ------------------------------------------------------------------------ */
struct proc_dir_entry *s_proc;
/* ------------------------------------------------------------------------ */
/* sysfs */
/* ------------------------------------------------------------------------ */
struct kobject s_kobj;
struct completion s_kobj_unregister;
/* ------------------------------------------------------------------------ */
/* block reservation window */
/* ------------------------------------------------------------------------ */
struct rb_root s_rsv_window_root;
struct ext2_reserve_window_node s_rsv_window_head;
};
/* EXT2_RESERVATION to reserve data blocks for expanding files */
#define EXT2_DEFAULT_RESERVE_BLOCKS 8
/* max window size : 1024(direct blocks) + 3([t,d]indirect blocks */
#define EXT2_MAX_RESERVE_BLOCKS 1027
#define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0
/*
----------------------------------------------------------------------------------
Ext2 Directory Entry
----------------------------------------------------------------------------------
*/
struct ext2_dir_entry
{
__le32 inode;
__le16 rec_len;
__u8 name_len;
__u8 file_type;
char name[ ];
};
/* defines for file_type */
enum
{
EXT2_FT_UNKNOWN = 0,
EXT2_FT_REG_FILE = 1,
EXT2_FT_DIR = 2,
EXT2_FT_CHRDEV = 3,
EXT2_FT_BLKDEV = 4,
EXT2_FT_FIFO = 5,
EXT2_FT_SOCK = 6,
EXT2_FT_SYMLINK = 7,
EXT2_FT_MAX
};
#define ME2FS_DIR_REC_LEN( name_len ) (((name_len) + 8 + (4 - 1)) & ~(4 -1 ))
/*
==================================================================================
Management
==================================================================================
*/
/*
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Function :ME2FS_SB
Input :struct super_block *sb
< vfs super block >
Output :void
Return :struct me2fs_inode_info *
< me2fs inode information
Description :get me2fs_sb_info from vfs super block
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/
static inline struct me2fs_sb_info *ME2FS_SB( struct super_block *sb )
{
return( ( struct me2fs_sb_info* )sb->s_fs_info );
}
/*
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Function :ME2FS_I
Input :struct inode *inode
< vfs inode >
Output :void
Return :struct me2fs_inode_info *
< me2fs inode information
Description :get me2fs_inode_inof from vfs inode
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/
static inline struct me2fs_inode_info *ME2FS_I( struct inode *inode )
{
return( container_of( inode, struct me2fs_inode_info, vfs_inode ) );
}
/*
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Function :ext2GetFirstBlockNum
Input :struct super_block *sb
< vfs super block >
unsined long group_no
< group number to get its first block >
Output :void
Return :unsigned long
< first block number >
Description :get first block number of the group
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/
static inline unsigned long
ext2GetFirstBlockNum( struct super_block *sb, unsigned long group_no )
{
unsigned long first_block_num;
first_block_num = group_no * le32_to_cpu( ME2FS_SB( sb )->s_blocks_per_group )
+ le32_to_cpu( ME2FS_SB( sb )->s_esb->s_first_data_block );
return( first_block_num );
}
/*
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Function :getSbBlockGroupLock
Input :struct me2fs_sb_info *msi
< me2fs super block information >
unsigned long block group
< block group number >
Output :void
Return :spinlock_t*
< spin lock >
Description :lock for block group modification
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/
static inline spinlock_t*
getSbBlockGroupLock( struct me2fs_sb_info *msi, unsigned long block_group )
{
spinlock_t *lock;
lock = bgl_lock_ptr( msi->s_blockgroup_lock, ( unsigned int )block_group );
return( lock );
}
/*
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Function :me2fsGetProcRoot
Input :void
Output :void
Return :struct proc_dir_entry
< me2fs proc root >
Description :get proc root of me2fs
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/
struct proc_dir_entry* me2fsGetProcRoot( void );
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
< Open Functions >
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
#endif // __ME2FS_H__