diff options
Diffstat (limited to 'fs/ext4/ext4.h')
-rw-r--r-- | fs/ext4/ext4.h | 109 |
1 files changed, 94 insertions, 15 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 413321ff1e2..74414884580 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -344,6 +344,83 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) | |||
344 | return flags & EXT4_OTHER_FLMASK; | 344 | return flags & EXT4_OTHER_FLMASK; |
345 | } | 345 | } |
346 | 346 | ||
347 | /* | ||
348 | * Inode flags used for atomic set/get | ||
349 | */ | ||
350 | enum { | ||
351 | EXT4_INODE_SECRM = 0, /* Secure deletion */ | ||
352 | EXT4_INODE_UNRM = 1, /* Undelete */ | ||
353 | EXT4_INODE_COMPR = 2, /* Compress file */ | ||
354 | EXT4_INODE_SYNC = 3, /* Synchronous updates */ | ||
355 | EXT4_INODE_IMMUTABLE = 4, /* Immutable file */ | ||
356 | EXT4_INODE_APPEND = 5, /* writes to file may only append */ | ||
357 | EXT4_INODE_NODUMP = 6, /* do not dump file */ | ||
358 | EXT4_INODE_NOATIME = 7, /* do not update atime */ | ||
359 | /* Reserved for compression usage... */ | ||
360 | EXT4_INODE_DIRTY = 8, | ||
361 | EXT4_INODE_COMPRBLK = 9, /* One or more compressed clusters */ | ||
362 | EXT4_INODE_NOCOMPR = 10, /* Don't compress */ | ||
363 | EXT4_INODE_ECOMPR = 11, /* Compression error */ | ||
364 | /* End compression flags --- maybe not all used */ | ||
365 | EXT4_INODE_INDEX = 12, /* hash-indexed directory */ | ||
366 | EXT4_INODE_IMAGIC = 13, /* AFS directory */ | ||
367 | EXT4_INODE_JOURNAL_DATA = 14, /* file data should be journaled */ | ||
368 | EXT4_INODE_NOTAIL = 15, /* file tail should not be merged */ | ||
369 | EXT4_INODE_DIRSYNC = 16, /* dirsync behaviour (directories only) */ | ||
370 | EXT4_INODE_TOPDIR = 17, /* Top of directory hierarchies*/ | ||
371 | EXT4_INODE_HUGE_FILE = 18, /* Set to each huge file */ | ||
372 | EXT4_INODE_EXTENTS = 19, /* Inode uses extents */ | ||
373 | EXT4_INODE_EA_INODE = 21, /* Inode used for large EA */ | ||
374 | EXT4_INODE_EOFBLOCKS = 22, /* Blocks allocated beyond EOF */ | ||
375 | EXT4_INODE_RESERVED = 31, /* reserved for ext4 lib */ | ||
376 | }; | ||
377 | |||
378 | #define TEST_FLAG_VALUE(FLAG) (EXT4_##FLAG##_FL == (1 << EXT4_INODE_##FLAG)) | ||
379 | #define CHECK_FLAG_VALUE(FLAG) if (!TEST_FLAG_VALUE(FLAG)) { \ | ||
380 | printk(KERN_EMERG "EXT4 flag fail: " #FLAG ": %d %d\n", \ | ||
381 | EXT4_##FLAG##_FL, EXT4_INODE_##FLAG); BUG_ON(1); } | ||
382 | |||
383 | /* | ||
384 | * Since it's pretty easy to mix up bit numbers and hex values, and we | ||
385 | * can't do a compile-time test for ENUM values, we use a run-time | ||
386 | * test to make sure that EXT4_XXX_FL is consistent with respect to | ||
387 | * EXT4_INODE_XXX. If all is well the printk and BUG_ON will all drop | ||
388 | * out so it won't cost any extra space in the compiled kernel image. | ||
389 | * But it's important that these values are the same, since we are | ||
390 | * using EXT4_INODE_XXX to test for the flag values, but EXT4_XX_FL | ||
391 | * must be consistent with the values of FS_XXX_FL defined in | ||
392 | * include/linux/fs.h and the on-disk values found in ext2, ext3, and | ||
393 | * ext4 filesystems, and of course the values defined in e2fsprogs. | ||
394 | * | ||
395 | * It's not paranoia if the Murphy's Law really *is* out to get you. :-) | ||
396 | */ | ||
397 | static inline void ext4_check_flag_values(void) | ||
398 | { | ||
399 | CHECK_FLAG_VALUE(SECRM); | ||
400 | CHECK_FLAG_VALUE(UNRM); | ||
401 | CHECK_FLAG_VALUE(COMPR); | ||
402 | CHECK_FLAG_VALUE(SYNC); | ||
403 | CHECK_FLAG_VALUE(IMMUTABLE); | ||
404 | CHECK_FLAG_VALUE(APPEND); | ||
405 | CHECK_FLAG_VALUE(NODUMP); | ||
406 | CHECK_FLAG_VALUE(NOATIME); | ||
407 | CHECK_FLAG_VALUE(DIRTY); | ||
408 | CHECK_FLAG_VALUE(COMPRBLK); | ||
409 | CHECK_FLAG_VALUE(NOCOMPR); | ||
410 | CHECK_FLAG_VALUE(ECOMPR); | ||
411 | CHECK_FLAG_VALUE(INDEX); | ||
412 | CHECK_FLAG_VALUE(IMAGIC); | ||
413 | CHECK_FLAG_VALUE(JOURNAL_DATA); | ||
414 | CHECK_FLAG_VALUE(NOTAIL); | ||
415 | CHECK_FLAG_VALUE(DIRSYNC); | ||
416 | CHECK_FLAG_VALUE(TOPDIR); | ||
417 | CHECK_FLAG_VALUE(HUGE_FILE); | ||
418 | CHECK_FLAG_VALUE(EXTENTS); | ||
419 | CHECK_FLAG_VALUE(EA_INODE); | ||
420 | CHECK_FLAG_VALUE(EOFBLOCKS); | ||
421 | CHECK_FLAG_VALUE(RESERVED); | ||
422 | } | ||
423 | |||
347 | /* Used to pass group descriptor data when online resize is done */ | 424 | /* Used to pass group descriptor data when online resize is done */ |
348 | struct ext4_new_group_input { | 425 | struct ext4_new_group_input { |
349 | __u32 group; /* Group number for this data */ | 426 | __u32 group; /* Group number for this data */ |
@@ -639,9 +716,8 @@ struct ext4_ext_cache { | |||
639 | */ | 716 | */ |
640 | struct ext4_inode_info { | 717 | struct ext4_inode_info { |
641 | __le32 i_data[15]; /* unconverted */ | 718 | __le32 i_data[15]; /* unconverted */ |
642 | __u32 i_flags; | ||
643 | ext4_fsblk_t i_file_acl; | ||
644 | __u32 i_dtime; | 719 | __u32 i_dtime; |
720 | ext4_fsblk_t i_file_acl; | ||
645 | 721 | ||
646 | /* | 722 | /* |
647 | * i_block_group is the number of the block group which contains | 723 | * i_block_group is the number of the block group which contains |
@@ -652,6 +728,7 @@ struct ext4_inode_info { | |||
652 | */ | 728 | */ |
653 | ext4_group_t i_block_group; | 729 | ext4_group_t i_block_group; |
654 | unsigned long i_state_flags; /* Dynamic state flags */ | 730 | unsigned long i_state_flags; /* Dynamic state flags */ |
731 | unsigned long i_flags; | ||
655 | 732 | ||
656 | ext4_lblk_t i_dir_start_lookup; | 733 | ext4_lblk_t i_dir_start_lookup; |
657 | #ifdef CONFIG_EXT4_FS_XATTR | 734 | #ifdef CONFIG_EXT4_FS_XATTR |
@@ -1087,20 +1164,22 @@ enum { | |||
1087 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ | 1164 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ |
1088 | }; | 1165 | }; |
1089 | 1166 | ||
1090 | static inline int ext4_test_inode_state(struct inode *inode, int bit) | 1167 | #define EXT4_INODE_BIT_FNS(name, field) \ |
1091 | { | 1168 | static inline int ext4_test_inode_##name(struct inode *inode, int bit) \ |
1092 | return test_bit(bit, &EXT4_I(inode)->i_state_flags); | 1169 | { \ |
1170 | return test_bit(bit, &EXT4_I(inode)->i_##field); \ | ||
1171 | } \ | ||
1172 | static inline void ext4_set_inode_##name(struct inode *inode, int bit) \ | ||
1173 | { \ | ||
1174 | set_bit(bit, &EXT4_I(inode)->i_##field); \ | ||
1175 | } \ | ||
1176 | static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \ | ||
1177 | { \ | ||
1178 | clear_bit(bit, &EXT4_I(inode)->i_##field); \ | ||
1093 | } | 1179 | } |
1094 | 1180 | ||
1095 | static inline void ext4_set_inode_state(struct inode *inode, int bit) | 1181 | EXT4_INODE_BIT_FNS(flag, flags) |
1096 | { | 1182 | EXT4_INODE_BIT_FNS(state, state_flags) |
1097 | set_bit(bit, &EXT4_I(inode)->i_state_flags); | ||
1098 | } | ||
1099 | |||
1100 | static inline void ext4_clear_inode_state(struct inode *inode, int bit) | ||
1101 | { | ||
1102 | clear_bit(bit, &EXT4_I(inode)->i_state_flags); | ||
1103 | } | ||
1104 | #else | 1183 | #else |
1105 | /* Assume that user mode programs are passing in an ext4fs superblock, not | 1184 | /* Assume that user mode programs are passing in an ext4fs superblock, not |
1106 | * a kernel struct super_block. This will allow us to call the feature-test | 1185 | * a kernel struct super_block. This will allow us to call the feature-test |
@@ -1287,7 +1366,7 @@ struct ext4_dir_entry_2 { | |||
1287 | 1366 | ||
1288 | #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ | 1367 | #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ |
1289 | EXT4_FEATURE_COMPAT_DIR_INDEX) && \ | 1368 | EXT4_FEATURE_COMPAT_DIR_INDEX) && \ |
1290 | (EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) | 1369 | ext4_test_inode_flag((dir), EXT4_INODE_INDEX)) |
1291 | #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) | 1370 | #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) |
1292 | #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) | 1371 | #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) |
1293 | 1372 | ||