00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _LINUX_EXT3_FS_H
00017 #define _LINUX_EXT3_FS_H
00018
00019 #include <linux/types.h>
00020 #include <linux/magic.h>
00021
00022 #if defined(CONFIG_ETRAX_ARCH_V32) || defined(CONFIG_ETRAX_ARCH_V10)
00023 #include <asm-generic/bitops/ext2-non-atomic.h>
00024 #endif
00025
00026
00027
00028
00029
00030
00031
00032 #undef EXT3FS_DEBUG
00033
00034
00035
00036
00037 #define EXT3_DEFAULT_RESERVE_BLOCKS 8
00038
00039 #define EXT3_MAX_RESERVE_BLOCKS 1027
00040 #define EXT3_RESERVE_WINDOW_NOT_ALLOCATED 0
00041
00042
00043
00044 #define CONFIG_EXT3_INDEX
00045
00046
00047
00048
00049 #ifdef EXT3FS_DEBUG
00050 #define ext3_debug(f, a...) \
00051 do { \
00052 printk (KERN_DEBUG "EXT3-fs DEBUG (%s, %d): %s:", \
00053 __FILE__, __LINE__, __FUNCTION__); \
00054 printk (KERN_DEBUG f, ## a); \
00055 } while (0)
00056 #else
00057 #define ext3_debug(f, a...) do {} while (0)
00058 #endif
00059
00060
00061
00062
00063 #define EXT3_BAD_INO 1
00064 #define EXT3_ROOT_INO 2
00065 #define EXT3_BOOT_LOADER_INO 5
00066 #define EXT3_UNDEL_DIR_INO 6
00067 #define EXT3_RESIZE_INO 7
00068 #define EXT3_JOURNAL_INO 8
00069
00070
00071 #define EXT3_GOOD_OLD_FIRST_INO 11
00072
00073
00074
00075
00076 #define EXT3_LINK_MAX 32000
00077
00078
00079
00080
00081 #define EXT3_MIN_BLOCK_SIZE 1024
00082 #define EXT3_MAX_BLOCK_SIZE 4096
00083 #define EXT3_MIN_BLOCK_LOG_SIZE 10
00084 #ifdef __KERNEL__
00085 # define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize)
00086 #else
00087 # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size)
00088 #endif
00089 #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32))
00090 #ifdef __KERNEL__
00091 # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
00092 #else
00093 # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
00094 #endif
00095 #ifdef __KERNEL__
00096 #define EXT3_ADDR_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_addr_per_block_bits)
00097 #define EXT3_INODE_SIZE(s) (EXT3_SB(s)->s_inode_size)
00098 #define EXT3_FIRST_INO(s) (EXT3_SB(s)->s_first_ino)
00099 #else
00100 #define EXT3_INODE_SIZE(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \
00101 EXT3_GOOD_OLD_INODE_SIZE : \
00102 (s)->s_inode_size)
00103 #define EXT3_FIRST_INO(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \
00104 EXT3_GOOD_OLD_FIRST_INO : \
00105 (s)->s_first_ino)
00106 #endif
00107
00108
00109
00110
00111 #define EXT3_MIN_FRAG_SIZE 1024
00112 #define EXT3_MAX_FRAG_SIZE 4096
00113 #define EXT3_MIN_FRAG_LOG_SIZE 10
00114 #ifdef __KERNEL__
00115 # define EXT3_FRAG_SIZE(s) (EXT3_SB(s)->s_frag_size)
00116 # define EXT3_FRAGS_PER_BLOCK(s) (EXT3_SB(s)->s_frags_per_block)
00117 #else
00118 # define EXT3_FRAG_SIZE(s) (EXT3_MIN_FRAG_SIZE << (s)->s_log_frag_size)
00119 # define EXT3_FRAGS_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / EXT3_FRAG_SIZE(s))
00120 #endif
00121
00122
00123
00124
00125 struct ext3_group_desc
00126 {
00127 __le32 bg_block_bitmap;
00128 __le32 bg_inode_bitmap;
00129 __le32 bg_inode_table;
00130 __le16 bg_free_blocks_count;
00131 __le16 bg_free_inodes_count;
00132 __le16 bg_used_dirs_count;
00133 __u16 bg_pad;
00134 __le32 bg_reserved[3];
00135 };
00136
00137
00138
00139
00140 #ifdef __KERNEL__
00141 # define EXT3_BLOCKS_PER_GROUP(s) (EXT3_SB(s)->s_blocks_per_group)
00142 # define EXT3_DESC_PER_BLOCK(s) (EXT3_SB(s)->s_desc_per_block)
00143 # define EXT3_INODES_PER_GROUP(s) (EXT3_SB(s)->s_inodes_per_group)
00144 # define EXT3_DESC_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_desc_per_block_bits)
00145 #else
00146 # define EXT3_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
00147 # define EXT3_DESC_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_group_desc))
00148 # define EXT3_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
00149 #endif
00150
00151
00152
00153
00154 #define EXT3_NDIR_BLOCKS 12
00155 #define EXT3_IND_BLOCK EXT3_NDIR_BLOCKS
00156 #define EXT3_DIND_BLOCK (EXT3_IND_BLOCK + 1)
00157 #define EXT3_TIND_BLOCK (EXT3_DIND_BLOCK + 1)
00158 #define EXT3_N_BLOCKS (EXT3_TIND_BLOCK + 1)
00159
00160
00161
00162
00163 #define EXT3_SECRM_FL 0x00000001
00164 #define EXT3_UNRM_FL 0x00000002
00165 #define EXT3_COMPR_FL 0x00000004
00166 #define EXT3_SYNC_FL 0x00000008
00167 #define EXT3_IMMUTABLE_FL 0x00000010
00168 #define EXT3_APPEND_FL 0x00000020
00169 #define EXT3_NODUMP_FL 0x00000040
00170 #define EXT3_NOATIME_FL 0x00000080
00171
00172 #define EXT3_DIRTY_FL 0x00000100
00173 #define EXT3_COMPRBLK_FL 0x00000200
00174 #define EXT3_NOCOMPR_FL 0x00000400
00175 #define EXT3_ECOMPR_FL 0x00000800
00176
00177 #define EXT3_INDEX_FL 0x00001000
00178 #define EXT3_IMAGIC_FL 0x00002000
00179 #define EXT3_JOURNAL_DATA_FL 0x00004000
00180 #define EXT3_NOTAIL_FL 0x00008000
00181 #define EXT3_DIRSYNC_FL 0x00010000
00182 #define EXT3_TOPDIR_FL 0x00020000
00183 #define EXT3_RESERVED_FL 0x80000000
00184
00185 #define EXT3_FL_USER_VISIBLE 0x0003DFFF
00186 #define EXT3_FL_USER_MODIFIABLE 0x000380FF
00187
00188
00189
00190
00191 #define EXT3_STATE_JDATA 0x00000001
00192 #define EXT3_STATE_NEW 0x00000002
00193 #define EXT3_STATE_XATTR 0x00000004
00194
00195
00196 struct ext3_new_group_input {
00197 __u32 group;
00198 __u32 block_bitmap;
00199 __u32 inode_bitmap;
00200 __u32 inode_table;
00201 __u32 blocks_count;
00202 __u16 reserved_blocks;
00203 __u16 unused;
00204 };
00205
00206
00207 struct ext3_new_group_data {
00208 __u32 group;
00209 __u32 block_bitmap;
00210 __u32 inode_bitmap;
00211 __u32 inode_table;
00212 __u32 blocks_count;
00213 __u16 reserved_blocks;
00214 __u16 unused;
00215 __u32 free_blocks_count;
00216 };
00217
00218
00219
00220
00221
00222 #define EXT3_IOC_GETFLAGS FS_IOC_GETFLAGS
00223 #define EXT3_IOC_SETFLAGS FS_IOC_SETFLAGS
00224 #define EXT3_IOC_GETVERSION _IOR('f', 3, long)
00225 #define EXT3_IOC_SETVERSION _IOW('f', 4, long)
00226 #define EXT3_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long)
00227 #define EXT3_IOC_GROUP_ADD _IOW('f', 8,struct ext3_new_group_input)
00228 #define EXT3_IOC_GETVERSION_OLD FS_IOC_GETVERSION
00229 #define EXT3_IOC_SETVERSION_OLD FS_IOC_SETVERSION
00230 #ifdef CONFIG_JBD_DEBUG
00231 #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long)
00232 #endif
00233 #define EXT3_IOC_GETRSVSZ _IOR('f', 5, long)
00234 #define EXT3_IOC_SETRSVSZ _IOW('f', 6, long)
00235
00236
00237
00238
00239 #define EXT3_IOC32_GETFLAGS FS_IOC32_GETFLAGS
00240 #define EXT3_IOC32_SETFLAGS FS_IOC32_SETFLAGS
00241 #define EXT3_IOC32_GETVERSION _IOR('f', 3, int)
00242 #define EXT3_IOC32_SETVERSION _IOW('f', 4, int)
00243 #define EXT3_IOC32_GETRSVSZ _IOR('f', 5, int)
00244 #define EXT3_IOC32_SETRSVSZ _IOW('f', 6, int)
00245 #define EXT3_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int)
00246 #ifdef CONFIG_JBD_DEBUG
00247 #define EXT3_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int)
00248 #endif
00249 #define EXT3_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION
00250 #define EXT3_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION
00251
00252
00253
00254
00255
00256 struct ext3_mount_options {
00257 unsigned long s_mount_opt;
00258 uid_t s_resuid;
00259 gid_t s_resgid;
00260 unsigned long s_commit_interval;
00261 #ifdef CONFIG_QUOTA
00262 int s_jquota_fmt;
00263 char *s_qf_names[MAXQUOTAS];
00264 #endif
00265 };
00266
00267
00268
00269
00270 struct ext3_inode {
00271 __le16 i_mode;
00272 __le16 i_uid;
00273 __le32 i_size;
00274 __le32 i_atime;
00275 __le32 i_ctime;
00276 __le32 i_mtime;
00277 __le32 i_dtime;
00278 __le16 i_gid;
00279 __le16 i_links_count;
00280 __le32 i_blocks;
00281 __le32 i_flags;
00282 union {
00283 struct {
00284 __u32 l_i_reserved1;
00285 } linux1;
00286 struct {
00287 __u32 h_i_translator;
00288 } hurd1;
00289 struct {
00290 __u32 m_i_reserved1;
00291 } masix1;
00292 } osd1;
00293 __le32 i_block[EXT3_N_BLOCKS];
00294 __le32 i_generation;
00295 __le32 i_file_acl;
00296 __le32 i_dir_acl;
00297 __le32 i_faddr;
00298 union {
00299 struct {
00300 __u8 l_i_frag;
00301 __u8 l_i_fsize;
00302 __u16 i_pad1;
00303 __le16 l_i_uid_high;
00304 __le16 l_i_gid_high;
00305 __u32 l_i_reserved2;
00306 } linux2;
00307 struct {
00308 __u8 h_i_frag;
00309 __u8 h_i_fsize;
00310 __u16 h_i_mode_high;
00311 __u16 h_i_uid_high;
00312 __u16 h_i_gid_high;
00313 __u32 h_i_author;
00314 } hurd2;
00315 struct {
00316 __u8 m_i_frag;
00317 __u8 m_i_fsize;
00318 __u16 m_pad1;
00319 __u32 m_i_reserved2[2];
00320 } masix2;
00321 } osd2;
00322 __le16 i_extra_isize;
00323 __le16 i_pad1;
00324 };
00325
00326 #define i_size_high i_dir_acl
00327
00328 #if defined(__KERNEL__) || defined(__linux__)
00329 #define i_reserved1 osd1.linux1.l_i_reserved1
00330 #define i_frag osd2.linux2.l_i_frag
00331 #define i_fsize osd2.linux2.l_i_fsize
00332 #define i_uid_low i_uid
00333 #define i_gid_low i_gid
00334 #define i_uid_high osd2.linux2.l_i_uid_high
00335 #define i_gid_high osd2.linux2.l_i_gid_high
00336 #define i_reserved2 osd2.linux2.l_i_reserved2
00337
00338 #elif defined(__GNU__)
00339
00340 #define i_translator osd1.hurd1.h_i_translator
00341 #define i_frag osd2.hurd2.h_i_frag;
00342 #define i_fsize osd2.hurd2.h_i_fsize;
00343 #define i_uid_high osd2.hurd2.h_i_uid_high
00344 #define i_gid_high osd2.hurd2.h_i_gid_high
00345 #define i_author osd2.hurd2.h_i_author
00346
00347 #elif defined(__masix__)
00348
00349 #define i_reserved1 osd1.masix1.m_i_reserved1
00350 #define i_frag osd2.masix2.m_i_frag
00351 #define i_fsize osd2.masix2.m_i_fsize
00352 #define i_reserved2 osd2.masix2.m_i_reserved2
00353
00354 #endif
00355
00356
00357
00358
00359 #define EXT3_VALID_FS 0x0001
00360 #define EXT3_ERROR_FS 0x0002
00361 #define EXT3_ORPHAN_FS 0x0004
00362
00363
00364
00365
00366 #define EXT3_MOUNT_CHECK 0x00001
00367 #define EXT3_MOUNT_OLDALLOC 0x00002
00368 #define EXT3_MOUNT_GRPID 0x00004
00369 #define EXT3_MOUNT_DEBUG 0x00008
00370 #define EXT3_MOUNT_ERRORS_CONT 0x00010
00371 #define EXT3_MOUNT_ERRORS_RO 0x00020
00372 #define EXT3_MOUNT_ERRORS_PANIC 0x00040
00373 #define EXT3_MOUNT_MINIX_DF 0x00080
00374 #define EXT3_MOUNT_NOLOAD 0x00100
00375 #define EXT3_MOUNT_ABORT 0x00200
00376 #define EXT3_MOUNT_DATA_FLAGS 0x00C00
00377 #define EXT3_MOUNT_JOURNAL_DATA 0x00400
00378 #define EXT3_MOUNT_ORDERED_DATA 0x00800
00379 #define EXT3_MOUNT_WRITEBACK_DATA 0x00C00
00380 #define EXT3_MOUNT_UPDATE_JOURNAL 0x01000
00381 #define EXT3_MOUNT_NO_UID32 0x02000
00382 #define EXT3_MOUNT_XATTR_USER 0x04000
00383 #define EXT3_MOUNT_POSIX_ACL 0x08000
00384 #define EXT3_MOUNT_RESERVATION 0x10000
00385 #define EXT3_MOUNT_BARRIER 0x20000
00386 #define EXT3_MOUNT_NOBH 0x40000
00387 #define EXT3_MOUNT_QUOTA 0x80000
00388 #define EXT3_MOUNT_USRQUOTA 0x100000
00389 #define EXT3_MOUNT_GRPQUOTA 0x200000
00390
00391
00392 #ifndef _LINUX_EXT2_FS_H
00393 #define clear_opt(o, opt) o &= ~EXT3_MOUNT_##opt
00394 #define set_opt(o, opt) o |= EXT3_MOUNT_##opt
00395 #define test_opt(sb, opt) (EXT3_SB(sb)->s_mount_opt & \
00396 EXT3_MOUNT_##opt)
00397 #else
00398 #define EXT2_MOUNT_NOLOAD EXT3_MOUNT_NOLOAD
00399 #define EXT2_MOUNT_ABORT EXT3_MOUNT_ABORT
00400 #define EXT2_MOUNT_DATA_FLAGS EXT3_MOUNT_DATA_FLAGS
00401 #endif
00402
00403 #define ext3_set_bit ext2_set_bit
00404 #define ext3_set_bit_atomic ext2_set_bit_atomic
00405 #define ext3_clear_bit ext2_clear_bit
00406 #define ext3_clear_bit_atomic ext2_clear_bit_atomic
00407 #define ext3_test_bit ext2_test_bit
00408 #define ext3_find_first_zero_bit ext2_find_first_zero_bit
00409 #define ext3_find_next_zero_bit ext2_find_next_zero_bit
00410
00411
00412
00413
00414 #define EXT3_DFL_MAX_MNT_COUNT 20
00415 #define EXT3_DFL_CHECKINTERVAL 0
00416
00417
00418
00419
00420 #define EXT3_ERRORS_CONTINUE 1
00421 #define EXT3_ERRORS_RO 2
00422 #define EXT3_ERRORS_PANIC 3
00423 #define EXT3_ERRORS_DEFAULT EXT3_ERRORS_CONTINUE
00424
00425
00426
00427
00428 struct ext3_super_block {
00429 __le32 s_inodes_count;
00430 __le32 s_blocks_count;
00431 __le32 s_r_blocks_count;
00432 __le32 s_free_blocks_count;
00433 __le32 s_free_inodes_count;
00434 __le32 s_first_data_block;
00435 __le32 s_log_block_size;
00436 __le32 s_log_frag_size;
00437 __le32 s_blocks_per_group;
00438 __le32 s_frags_per_group;
00439 __le32 s_inodes_per_group;
00440 __le32 s_mtime;
00441 __le32 s_wtime;
00442 __le16 s_mnt_count;
00443 __le16 s_max_mnt_count;
00444 __le16 s_magic;
00445 __le16 s_state;
00446 __le16 s_errors;
00447 __le16 s_minor_rev_level;
00448 __le32 s_lastcheck;
00449 __le32 s_checkinterval;
00450 __le32 s_creator_os;
00451 __le32 s_rev_level;
00452 __le16 s_def_resuid;
00453 __le16 s_def_resgid;
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467 __le32 s_first_ino;
00468 __le16 s_inode_size;
00469 __le16 s_block_group_nr;
00470 __le32 s_feature_compat;
00471 __le32 s_feature_incompat;
00472 __le32 s_feature_ro_compat;
00473 __u8 s_uuid[16];
00474 char s_volume_name[16];
00475 char s_last_mounted[64];
00476 __le32 s_algorithm_usage_bitmap;
00477
00478
00479
00480
00481 __u8 s_prealloc_blocks;
00482 __u8 s_prealloc_dir_blocks;
00483 __le16 s_reserved_gdt_blocks;
00484
00485
00486
00487 __u8 s_journal_uuid[16];
00488 __le32 s_journal_inum;
00489 __le32 s_journal_dev;
00490 __le32 s_last_orphan;
00491 __le32 s_hash_seed[4];
00492 __u8 s_def_hash_version;
00493 __u8 s_reserved_char_pad;
00494 __u16 s_reserved_word_pad;
00495 __le32 s_default_mount_opts;
00496 __le32 s_first_meta_bg;
00497 __u32 s_reserved[190];
00498 };
00499
00500 #ifdef __KERNEL__
00501 #include <linux/ext3_fs_i.h>
00502 #include <linux/ext3_fs_sb.h>
00503 static inline struct ext3_sb_info * EXT3_SB(struct super_block *sb)
00504 {
00505 return sb->s_fs_info;
00506 }
00507 static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
00508 {
00509 return container_of(inode, struct ext3_inode_info, vfs_inode);
00510 }
00511
00512 static inline int ext3_valid_inum(struct super_block *sb, unsigned long ino)
00513 {
00514 return ino == EXT3_ROOT_INO ||
00515 ino == EXT3_JOURNAL_INO ||
00516 ino == EXT3_RESIZE_INO ||
00517 (ino >= EXT3_FIRST_INO(sb) &&
00518 ino <= le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count));
00519 }
00520 #else
00521
00522
00523
00524 #define EXT3_SB(sb) (sb)
00525 #endif
00526
00527 #define NEXT_ORPHAN(inode) EXT3_I(inode)->i_dtime
00528
00529
00530
00531
00532 #define EXT3_OS_LINUX 0
00533 #define EXT3_OS_HURD 1
00534 #define EXT3_OS_MASIX 2
00535 #define EXT3_OS_FREEBSD 3
00536 #define EXT3_OS_LITES 4
00537
00538
00539
00540
00541 #define EXT3_GOOD_OLD_REV 0
00542 #define EXT3_DYNAMIC_REV 1
00543
00544 #define EXT3_CURRENT_REV EXT3_GOOD_OLD_REV
00545 #define EXT3_MAX_SUPP_REV EXT3_DYNAMIC_REV
00546
00547 #define EXT3_GOOD_OLD_INODE_SIZE 128
00548
00549
00550
00551
00552
00553 #define EXT3_HAS_COMPAT_FEATURE(sb,mask) \
00554 ( EXT3_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
00555 #define EXT3_HAS_RO_COMPAT_FEATURE(sb,mask) \
00556 ( EXT3_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
00557 #define EXT3_HAS_INCOMPAT_FEATURE(sb,mask) \
00558 ( EXT3_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
00559 #define EXT3_SET_COMPAT_FEATURE(sb,mask) \
00560 EXT3_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
00561 #define EXT3_SET_RO_COMPAT_FEATURE(sb,mask) \
00562 EXT3_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
00563 #define EXT3_SET_INCOMPAT_FEATURE(sb,mask) \
00564 EXT3_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
00565 #define EXT3_CLEAR_COMPAT_FEATURE(sb,mask) \
00566 EXT3_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
00567 #define EXT3_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
00568 EXT3_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
00569 #define EXT3_CLEAR_INCOMPAT_FEATURE(sb,mask) \
00570 EXT3_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
00571
00572 #define EXT3_FEATURE_COMPAT_DIR_PREALLOC 0x0001
00573 #define EXT3_FEATURE_COMPAT_IMAGIC_INODES 0x0002
00574 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
00575 #define EXT3_FEATURE_COMPAT_EXT_ATTR 0x0008
00576 #define EXT3_FEATURE_COMPAT_RESIZE_INODE 0x0010
00577 #define EXT3_FEATURE_COMPAT_DIR_INDEX 0x0020
00578
00579 #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
00580 #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
00581 #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
00582
00583 #define EXT3_FEATURE_INCOMPAT_COMPRESSION 0x0001
00584 #define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002
00585 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004
00586 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
00587 #define EXT3_FEATURE_INCOMPAT_META_BG 0x0010
00588
00589 #define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR
00590 #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \
00591 EXT3_FEATURE_INCOMPAT_RECOVER| \
00592 EXT3_FEATURE_INCOMPAT_META_BG)
00593 #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
00594 EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
00595 EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
00596
00597
00598
00599
00600 #define EXT3_DEF_RESUID 0
00601 #define EXT3_DEF_RESGID 0
00602
00603
00604
00605
00606 #define EXT3_DEFM_DEBUG 0x0001
00607 #define EXT3_DEFM_BSDGROUPS 0x0002
00608 #define EXT3_DEFM_XATTR_USER 0x0004
00609 #define EXT3_DEFM_ACL 0x0008
00610 #define EXT3_DEFM_UID16 0x0010
00611 #define EXT3_DEFM_JMODE 0x0060
00612 #define EXT3_DEFM_JMODE_DATA 0x0020
00613 #define EXT3_DEFM_JMODE_ORDERED 0x0040
00614 #define EXT3_DEFM_JMODE_WBACK 0x0060
00615
00616
00617
00618
00619 #define EXT3_NAME_LEN 255
00620
00621 struct ext3_dir_entry {
00622 __le32 inode;
00623 __le16 rec_len;
00624 __le16 name_len;
00625 char name[EXT3_NAME_LEN];
00626 };
00627
00628
00629
00630
00631
00632
00633
00634 struct ext3_dir_entry_2 {
00635 __le32 inode;
00636 __le16 rec_len;
00637 __u8 name_len;
00638 __u8 file_type;
00639 char name[EXT3_NAME_LEN];
00640 };
00641
00642
00643
00644
00645
00646 #define EXT3_FT_UNKNOWN 0
00647 #define EXT3_FT_REG_FILE 1
00648 #define EXT3_FT_DIR 2
00649 #define EXT3_FT_CHRDEV 3
00650 #define EXT3_FT_BLKDEV 4
00651 #define EXT3_FT_FIFO 5
00652 #define EXT3_FT_SOCK 6
00653 #define EXT3_FT_SYMLINK 7
00654
00655 #define EXT3_FT_MAX 8
00656
00657
00658
00659
00660
00661
00662 #define EXT3_DIR_PAD 4
00663 #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1)
00664 #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \
00665 ~EXT3_DIR_ROUND)
00666
00667
00668
00669
00670
00671 #ifdef CONFIG_EXT3_INDEX
00672 #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \
00673 EXT3_FEATURE_COMPAT_DIR_INDEX) && \
00674 (EXT3_I(dir)->i_flags & EXT3_INDEX_FL))
00675 #define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX)
00676 #define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1)
00677 #else
00678 #define is_dx(dir) 0
00679 #define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX)
00680 #define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2)
00681 #endif
00682
00683
00684
00685 #define DX_HASH_LEGACY 0
00686 #define DX_HASH_HALF_MD4 1
00687 #define DX_HASH_TEA 2
00688
00689 #ifdef __KERNEL__
00690
00691
00692 struct dx_hash_info
00693 {
00694 u32 hash;
00695 u32 minor_hash;
00696 int hash_version;
00697 u32 *seed;
00698 };
00699
00700 #define EXT3_HTREE_EOF 0x7fffffff
00701
00702
00703
00704
00705 #define HASH_NB_ALWAYS 1
00706
00707
00708
00709
00710
00711 struct ext3_iloc
00712 {
00713 struct buffer_head *bh;
00714 unsigned long offset;
00715 unsigned long block_group;
00716 };
00717
00718 static inline struct ext3_inode *ext3_raw_inode(struct ext3_iloc *iloc)
00719 {
00720 return (struct ext3_inode *) (iloc->bh->b_data + iloc->offset);
00721 }
00722
00723
00724
00725
00726
00727
00728 struct dir_private_info {
00729 struct rb_root root;
00730 struct rb_node *curr_node;
00731 struct fname *extra_fname;
00732 loff_t last_pos;
00733 __u32 curr_hash;
00734 __u32 curr_minor_hash;
00735 __u32 next_hash;
00736 };
00737
00738
00739 static inline ext3_fsblk_t
00740 ext3_group_first_block_no(struct super_block *sb, unsigned long group_no)
00741 {
00742 return group_no * (ext3_fsblk_t)EXT3_BLOCKS_PER_GROUP(sb) +
00743 le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block);
00744 }
00745
00746
00747
00748
00749 #define ERR_BAD_DX_DIR -75000
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759 # define NORET_TYPE
00760 # define ATTRIB_NORET __attribute__((noreturn))
00761 # define NORET_AND noreturn,
00762
00763
00764 extern int ext3_bg_has_super(struct super_block *sb, int group);
00765 extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group);
00766 extern ext3_fsblk_t ext3_new_block (handle_t *handle, struct inode *inode,
00767 ext3_fsblk_t goal, int *errp);
00768 extern ext3_fsblk_t ext3_new_blocks (handle_t *handle, struct inode *inode,
00769 ext3_fsblk_t goal, unsigned long *count, int *errp);
00770 extern void ext3_free_blocks (handle_t *handle, struct inode *inode,
00771 ext3_fsblk_t block, unsigned long count);
00772 extern void ext3_free_blocks_sb (handle_t *handle, struct super_block *sb,
00773 ext3_fsblk_t block, unsigned long count,
00774 unsigned long *pdquot_freed_blocks);
00775 extern ext3_fsblk_t ext3_count_free_blocks (struct super_block *);
00776 extern void ext3_check_blocks_bitmap (struct super_block *);
00777 extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
00778 unsigned int block_group,
00779 struct buffer_head ** bh);
00780 extern int ext3_should_retry_alloc(struct super_block *sb, int *retries);
00781 extern void ext3_init_block_alloc_info(struct inode *);
00782 extern void ext3_rsv_window_add(struct super_block *sb, struct ext3_reserve_window_node *rsv);
00783
00784
00785 extern int ext3_check_dir_entry(const char *, struct inode *,
00786 struct ext3_dir_entry_2 *,
00787 struct buffer_head *, unsigned long);
00788 extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
00789 __u32 minor_hash,
00790 struct ext3_dir_entry_2 *dirent);
00791 extern void ext3_htree_free_dir_info(struct dir_private_info *p);
00792
00793
00794 extern int ext3_sync_file (struct file *, struct dentry *, int);
00795
00796
00797 extern int ext3fs_dirhash(const char *name, int len, struct
00798 dx_hash_info *hinfo);
00799
00800
00801 extern struct inode * ext3_new_inode (handle_t *, struct inode *, int);
00802 extern void ext3_free_inode (handle_t *, struct inode *);
00803 extern struct inode * ext3_orphan_get (struct super_block *, unsigned long);
00804 extern unsigned long ext3_count_free_inodes (struct super_block *);
00805 extern unsigned long ext3_count_dirs (struct super_block *);
00806 extern void ext3_check_inodes_bitmap (struct super_block *);
00807 extern unsigned long ext3_count_free (struct buffer_head *, unsigned);
00808
00809
00810
00811 int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
00812 struct buffer_head *bh, ext3_fsblk_t blocknr);
00813 struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
00814 struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
00815 int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
00816 sector_t iblock, unsigned long maxblocks, struct buffer_head *bh_result,
00817 int create, int extend_disksize);
00818
00819 extern void ext3_read_inode (struct inode *);
00820 extern int ext3_write_inode (struct inode *, int);
00821 extern int ext3_setattr (struct dentry *, struct iattr *);
00822 extern void ext3_delete_inode (struct inode *);
00823 extern int ext3_sync_inode (handle_t *, struct inode *);
00824 extern void ext3_discard_reservation (struct inode *);
00825 extern void ext3_dirty_inode(struct inode *);
00826 extern int ext3_change_inode_journal_flag(struct inode *, int);
00827 extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);
00828 extern void ext3_truncate (struct inode *);
00829 extern void ext3_set_inode_flags(struct inode *);
00830 extern void ext3_set_aops(struct inode *inode);
00831
00832
00833 extern int ext3_ioctl (struct inode *, struct file *, unsigned int,
00834 unsigned long);
00835 extern long ext3_compat_ioctl (struct file *, unsigned int, unsigned long);
00836
00837
00838 extern int ext3_orphan_add(handle_t *, struct inode *);
00839 extern int ext3_orphan_del(handle_t *, struct inode *);
00840 extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
00841 __u32 start_minor_hash, __u32 *next_hash);
00842
00843
00844 extern int ext3_group_add(struct super_block *sb,
00845 struct ext3_new_group_data *input);
00846 extern int ext3_group_extend(struct super_block *sb,
00847 struct ext3_super_block *es,
00848 ext3_fsblk_t n_blocks_count);
00849
00850
00851 extern void ext3_error (struct super_block *, const char *, const char *, ...)
00852 __attribute__ ((format (printf, 3, 4)));
00853 extern void __ext3_std_error (struct super_block *, const char *, int);
00854 extern void ext3_abort (struct super_block *, const char *, const char *, ...)
00855 __attribute__ ((format (printf, 3, 4)));
00856 extern void ext3_warning (struct super_block *, const char *, const char *, ...)
00857 __attribute__ ((format (printf, 3, 4)));
00858 extern void ext3_update_dynamic_rev (struct super_block *sb);
00859
00860 #define ext3_std_error(sb, errno) \
00861 do { \
00862 if ((errno)) \
00863 __ext3_std_error((sb), __FUNCTION__, (errno)); \
00864 } while (0)
00865
00866
00867
00868
00869
00870
00871 extern const struct file_operations ext3_dir_operations;
00872
00873
00874 extern struct inode_operations ext3_file_inode_operations;
00875 extern const struct file_operations ext3_file_operations;
00876
00877
00878 extern struct inode_operations ext3_dir_inode_operations;
00879 extern struct inode_operations ext3_special_inode_operations;
00880
00881
00882 extern struct inode_operations ext3_symlink_inode_operations;
00883 extern struct inode_operations ext3_fast_symlink_inode_operations;
00884
00885
00886 #endif
00887
00888 #endif