diff options
Diffstat (limited to 'fs/ext4/ext4.h')
-rw-r--r-- | fs/ext4/ext4.h | 167 |
1 files changed, 145 insertions, 22 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bf938cf7c5f0..60bd31026e7c 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -29,6 +29,9 @@ | |||
29 | #include <linux/wait.h> | 29 | #include <linux/wait.h> |
30 | #include <linux/blockgroup_lock.h> | 30 | #include <linux/blockgroup_lock.h> |
31 | #include <linux/percpu_counter.h> | 31 | #include <linux/percpu_counter.h> |
32 | #ifdef __KERNEL__ | ||
33 | #include <linux/compat.h> | ||
34 | #endif | ||
32 | 35 | ||
33 | /* | 36 | /* |
34 | * The fourth extended filesystem constants/structures | 37 | * The fourth extended filesystem constants/structures |
@@ -54,10 +57,10 @@ | |||
54 | #endif | 57 | #endif |
55 | 58 | ||
56 | #define EXT4_ERROR_INODE(inode, fmt, a...) \ | 59 | #define EXT4_ERROR_INODE(inode, fmt, a...) \ |
57 | ext4_error_inode(__func__, (inode), (fmt), ## a); | 60 | ext4_error_inode(__func__, (inode), (fmt), ## a) |
58 | 61 | ||
59 | #define EXT4_ERROR_FILE(file, fmt, a...) \ | 62 | #define EXT4_ERROR_FILE(file, fmt, a...) \ |
60 | ext4_error_file(__func__, (file), (fmt), ## a); | 63 | ext4_error_file(__func__, (file), (fmt), ## a) |
61 | 64 | ||
62 | /* data type for block offset of block group */ | 65 | /* data type for block offset of block group */ |
63 | typedef int ext4_grpblk_t; | 66 | typedef int ext4_grpblk_t; |
@@ -72,7 +75,7 @@ typedef __u32 ext4_lblk_t; | |||
72 | typedef unsigned int ext4_group_t; | 75 | typedef unsigned int ext4_group_t; |
73 | 76 | ||
74 | /* | 77 | /* |
75 | * Flags used in mballoc's allocation_context flags field. | 78 | * Flags used in mballoc's allocation_context flags field. |
76 | * | 79 | * |
77 | * Also used to show what's going on for debugging purposes when the | 80 | * Also used to show what's going on for debugging purposes when the |
78 | * flag field is exported via the traceport interface | 81 | * flag field is exported via the traceport interface |
@@ -126,6 +129,29 @@ struct ext4_allocation_request { | |||
126 | }; | 129 | }; |
127 | 130 | ||
128 | /* | 131 | /* |
132 | * Logical to physical block mapping, used by ext4_map_blocks() | ||
133 | * | ||
134 | * This structure is used to pass requests into ext4_map_blocks() as | ||
135 | * well as to store the information returned by ext4_map_blocks(). It | ||
136 | * takes less room on the stack than a struct buffer_head. | ||
137 | */ | ||
138 | #define EXT4_MAP_NEW (1 << BH_New) | ||
139 | #define EXT4_MAP_MAPPED (1 << BH_Mapped) | ||
140 | #define EXT4_MAP_UNWRITTEN (1 << BH_Unwritten) | ||
141 | #define EXT4_MAP_BOUNDARY (1 << BH_Boundary) | ||
142 | #define EXT4_MAP_UNINIT (1 << BH_Uninit) | ||
143 | #define EXT4_MAP_FLAGS (EXT4_MAP_NEW | EXT4_MAP_MAPPED |\ | ||
144 | EXT4_MAP_UNWRITTEN | EXT4_MAP_BOUNDARY |\ | ||
145 | EXT4_MAP_UNINIT) | ||
146 | |||
147 | struct ext4_map_blocks { | ||
148 | ext4_fsblk_t m_pblk; | ||
149 | ext4_lblk_t m_lblk; | ||
150 | unsigned int m_len; | ||
151 | unsigned int m_flags; | ||
152 | }; | ||
153 | |||
154 | /* | ||
129 | * For delayed allocation tracking | 155 | * For delayed allocation tracking |
130 | */ | 156 | */ |
131 | struct mpage_da_data { | 157 | struct mpage_da_data { |
@@ -321,6 +347,83 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) | |||
321 | return flags & EXT4_OTHER_FLMASK; | 347 | return flags & EXT4_OTHER_FLMASK; |
322 | } | 348 | } |
323 | 349 | ||
350 | /* | ||
351 | * Inode flags used for atomic set/get | ||
352 | */ | ||
353 | enum { | ||
354 | EXT4_INODE_SECRM = 0, /* Secure deletion */ | ||
355 | EXT4_INODE_UNRM = 1, /* Undelete */ | ||
356 | EXT4_INODE_COMPR = 2, /* Compress file */ | ||
357 | EXT4_INODE_SYNC = 3, /* Synchronous updates */ | ||
358 | EXT4_INODE_IMMUTABLE = 4, /* Immutable file */ | ||
359 | EXT4_INODE_APPEND = 5, /* writes to file may only append */ | ||
360 | EXT4_INODE_NODUMP = 6, /* do not dump file */ | ||
361 | EXT4_INODE_NOATIME = 7, /* do not update atime */ | ||
362 | /* Reserved for compression usage... */ | ||
363 | EXT4_INODE_DIRTY = 8, | ||
364 | EXT4_INODE_COMPRBLK = 9, /* One or more compressed clusters */ | ||
365 | EXT4_INODE_NOCOMPR = 10, /* Don't compress */ | ||
366 | EXT4_INODE_ECOMPR = 11, /* Compression error */ | ||
367 | /* End compression flags --- maybe not all used */ | ||
368 | EXT4_INODE_INDEX = 12, /* hash-indexed directory */ | ||
369 | EXT4_INODE_IMAGIC = 13, /* AFS directory */ | ||
370 | EXT4_INODE_JOURNAL_DATA = 14, /* file data should be journaled */ | ||
371 | EXT4_INODE_NOTAIL = 15, /* file tail should not be merged */ | ||
372 | EXT4_INODE_DIRSYNC = 16, /* dirsync behaviour (directories only) */ | ||
373 | EXT4_INODE_TOPDIR = 17, /* Top of directory hierarchies*/ | ||
374 | EXT4_INODE_HUGE_FILE = 18, /* Set to each huge file */ | ||
375 | EXT4_INODE_EXTENTS = 19, /* Inode uses extents */ | ||
376 | EXT4_INODE_EA_INODE = 21, /* Inode used for large EA */ | ||
377 | EXT4_INODE_EOFBLOCKS = 22, /* Blocks allocated beyond EOF */ | ||
378 | EXT4_INODE_RESERVED = 31, /* reserved for ext4 lib */ | ||
379 | }; | ||
380 | |||
381 | #define TEST_FLAG_VALUE(FLAG) (EXT4_##FLAG##_FL == (1 << EXT4_INODE_##FLAG)) | ||
382 | #define CHECK_FLAG_VALUE(FLAG) if (!TEST_FLAG_VALUE(FLAG)) { \ | ||
383 | printk(KERN_EMERG "EXT4 flag fail: " #FLAG ": %d %d\n", \ | ||
384 | EXT4_##FLAG##_FL, EXT4_INODE_##FLAG); BUG_ON(1); } | ||
385 | |||
386 | /* | ||
387 | * Since it's pretty easy to mix up bit numbers and hex values, and we | ||
388 | * can't do a compile-time test for ENUM values, we use a run-time | ||
389 | * test to make sure that EXT4_XXX_FL is consistent with respect to | ||
390 | * EXT4_INODE_XXX. If all is well the printk and BUG_ON will all drop | ||
391 | * out so it won't cost any extra space in the compiled kernel image. | ||
392 | * But it's important that these values are the same, since we are | ||
393 | * using EXT4_INODE_XXX to test for the flag values, but EXT4_XX_FL | ||
394 | * must be consistent with the values of FS_XXX_FL defined in | ||
395 | * include/linux/fs.h and the on-disk values found in ext2, ext3, and | ||
396 | * ext4 filesystems, and of course the values defined in e2fsprogs. | ||
397 | * | ||
398 | * It's not paranoia if the Murphy's Law really *is* out to get you. :-) | ||
399 | */ | ||
400 | static inline void ext4_check_flag_values(void) | ||
401 | { | ||
402 | CHECK_FLAG_VALUE(SECRM); | ||
403 | CHECK_FLAG_VALUE(UNRM); | ||
404 | CHECK_FLAG_VALUE(COMPR); | ||
405 | CHECK_FLAG_VALUE(SYNC); | ||
406 | CHECK_FLAG_VALUE(IMMUTABLE); | ||
407 | CHECK_FLAG_VALUE(APPEND); | ||
408 | CHECK_FLAG_VALUE(NODUMP); | ||
409 | CHECK_FLAG_VALUE(NOATIME); | ||
410 | CHECK_FLAG_VALUE(DIRTY); | ||
411 | CHECK_FLAG_VALUE(COMPRBLK); | ||
412 | CHECK_FLAG_VALUE(NOCOMPR); | ||
413 | CHECK_FLAG_VALUE(ECOMPR); | ||
414 | CHECK_FLAG_VALUE(INDEX); | ||
415 | CHECK_FLAG_VALUE(IMAGIC); | ||
416 | CHECK_FLAG_VALUE(JOURNAL_DATA); | ||
417 | CHECK_FLAG_VALUE(NOTAIL); | ||
418 | CHECK_FLAG_VALUE(DIRSYNC); | ||
419 | CHECK_FLAG_VALUE(TOPDIR); | ||
420 | CHECK_FLAG_VALUE(HUGE_FILE); | ||
421 | CHECK_FLAG_VALUE(EXTENTS); | ||
422 | CHECK_FLAG_VALUE(EA_INODE); | ||
423 | CHECK_FLAG_VALUE(EOFBLOCKS); | ||
424 | CHECK_FLAG_VALUE(RESERVED); | ||
425 | } | ||
426 | |||
324 | /* Used to pass group descriptor data when online resize is done */ | 427 | /* Used to pass group descriptor data when online resize is done */ |
325 | struct ext4_new_group_input { | 428 | struct ext4_new_group_input { |
326 | __u32 group; /* Group number for this data */ | 429 | __u32 group; /* Group number for this data */ |
@@ -332,6 +435,18 @@ struct ext4_new_group_input { | |||
332 | __u16 unused; | 435 | __u16 unused; |
333 | }; | 436 | }; |
334 | 437 | ||
438 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | ||
439 | struct compat_ext4_new_group_input { | ||
440 | u32 group; | ||
441 | compat_u64 block_bitmap; | ||
442 | compat_u64 inode_bitmap; | ||
443 | compat_u64 inode_table; | ||
444 | u32 blocks_count; | ||
445 | u16 reserved_blocks; | ||
446 | u16 unused; | ||
447 | }; | ||
448 | #endif | ||
449 | |||
335 | /* The struct ext4_new_group_input in kernel space, with free_blocks_count */ | 450 | /* The struct ext4_new_group_input in kernel space, with free_blocks_count */ |
336 | struct ext4_new_group_data { | 451 | struct ext4_new_group_data { |
337 | __u32 group; | 452 | __u32 group; |
@@ -355,7 +470,7 @@ struct ext4_new_group_data { | |||
355 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ | 470 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ |
356 | EXT4_GET_BLOCKS_CREATE) | 471 | EXT4_GET_BLOCKS_CREATE) |
357 | /* Caller is from the delayed allocation writeout path, | 472 | /* Caller is from the delayed allocation writeout path, |
358 | so set the magic i_delalloc_reserve_flag after taking the | 473 | so set the magic i_delalloc_reserve_flag after taking the |
359 | inode allocation semaphore for */ | 474 | inode allocation semaphore for */ |
360 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004 | 475 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004 |
361 | /* caller is from the direct IO path, request to creation of an | 476 | /* caller is from the direct IO path, request to creation of an |
@@ -398,6 +513,7 @@ struct ext4_new_group_data { | |||
398 | #define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12) | 513 | #define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12) |
399 | #define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent) | 514 | #define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent) |
400 | 515 | ||
516 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | ||
401 | /* | 517 | /* |
402 | * ioctl commands in 32 bit emulation | 518 | * ioctl commands in 32 bit emulation |
403 | */ | 519 | */ |
@@ -408,11 +524,13 @@ struct ext4_new_group_data { | |||
408 | #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) | 524 | #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) |
409 | #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) | 525 | #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) |
410 | #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) | 526 | #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) |
527 | #define EXT4_IOC32_GROUP_ADD _IOW('f', 8, struct compat_ext4_new_group_input) | ||
411 | #ifdef CONFIG_JBD2_DEBUG | 528 | #ifdef CONFIG_JBD2_DEBUG |
412 | #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) | 529 | #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) |
413 | #endif | 530 | #endif |
414 | #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION | 531 | #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION |
415 | #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION | 532 | #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION |
533 | #endif | ||
416 | 534 | ||
417 | 535 | ||
418 | /* | 536 | /* |
@@ -616,9 +734,8 @@ struct ext4_ext_cache { | |||
616 | */ | 734 | */ |
617 | struct ext4_inode_info { | 735 | struct ext4_inode_info { |
618 | __le32 i_data[15]; /* unconverted */ | 736 | __le32 i_data[15]; /* unconverted */ |
619 | __u32 i_flags; | ||
620 | ext4_fsblk_t i_file_acl; | ||
621 | __u32 i_dtime; | 737 | __u32 i_dtime; |
738 | ext4_fsblk_t i_file_acl; | ||
622 | 739 | ||
623 | /* | 740 | /* |
624 | * i_block_group is the number of the block group which contains | 741 | * i_block_group is the number of the block group which contains |
@@ -629,6 +746,7 @@ struct ext4_inode_info { | |||
629 | */ | 746 | */ |
630 | ext4_group_t i_block_group; | 747 | ext4_group_t i_block_group; |
631 | unsigned long i_state_flags; /* Dynamic state flags */ | 748 | unsigned long i_state_flags; /* Dynamic state flags */ |
749 | unsigned long i_flags; | ||
632 | 750 | ||
633 | ext4_lblk_t i_dir_start_lookup; | 751 | ext4_lblk_t i_dir_start_lookup; |
634 | #ifdef CONFIG_EXT4_FS_XATTR | 752 | #ifdef CONFIG_EXT4_FS_XATTR |
@@ -1062,22 +1180,25 @@ enum { | |||
1062 | EXT4_STATE_DA_ALLOC_CLOSE, /* Alloc DA blks on close */ | 1180 | EXT4_STATE_DA_ALLOC_CLOSE, /* Alloc DA blks on close */ |
1063 | EXT4_STATE_EXT_MIGRATE, /* Inode is migrating */ | 1181 | EXT4_STATE_EXT_MIGRATE, /* Inode is migrating */ |
1064 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ | 1182 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ |
1183 | EXT4_STATE_NEWENTRY, /* File just added to dir */ | ||
1065 | }; | 1184 | }; |
1066 | 1185 | ||
1067 | static inline int ext4_test_inode_state(struct inode *inode, int bit) | 1186 | #define EXT4_INODE_BIT_FNS(name, field) \ |
1068 | { | 1187 | static inline int ext4_test_inode_##name(struct inode *inode, int bit) \ |
1069 | return test_bit(bit, &EXT4_I(inode)->i_state_flags); | 1188 | { \ |
1070 | } | 1189 | return test_bit(bit, &EXT4_I(inode)->i_##field); \ |
1071 | 1190 | } \ | |
1072 | static inline void ext4_set_inode_state(struct inode *inode, int bit) | 1191 | static inline void ext4_set_inode_##name(struct inode *inode, int bit) \ |
1073 | { | 1192 | { \ |
1074 | set_bit(bit, &EXT4_I(inode)->i_state_flags); | 1193 | set_bit(bit, &EXT4_I(inode)->i_##field); \ |
1194 | } \ | ||
1195 | static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \ | ||
1196 | { \ | ||
1197 | clear_bit(bit, &EXT4_I(inode)->i_##field); \ | ||
1075 | } | 1198 | } |
1076 | 1199 | ||
1077 | static inline void ext4_clear_inode_state(struct inode *inode, int bit) | 1200 | EXT4_INODE_BIT_FNS(flag, flags) |
1078 | { | 1201 | EXT4_INODE_BIT_FNS(state, state_flags) |
1079 | clear_bit(bit, &EXT4_I(inode)->i_state_flags); | ||
1080 | } | ||
1081 | #else | 1202 | #else |
1082 | /* Assume that user mode programs are passing in an ext4fs superblock, not | 1203 | /* Assume that user mode programs are passing in an ext4fs superblock, not |
1083 | * a kernel struct super_block. This will allow us to call the feature-test | 1204 | * a kernel struct super_block. This will allow us to call the feature-test |
@@ -1264,7 +1385,7 @@ struct ext4_dir_entry_2 { | |||
1264 | 1385 | ||
1265 | #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ | 1386 | #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ |
1266 | EXT4_FEATURE_COMPAT_DIR_INDEX) && \ | 1387 | EXT4_FEATURE_COMPAT_DIR_INDEX) && \ |
1267 | (EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) | 1388 | ext4_test_inode_flag((dir), EXT4_INODE_INDEX)) |
1268 | #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) | 1389 | #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) |
1269 | #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) | 1390 | #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) |
1270 | 1391 | ||
@@ -1678,6 +1799,7 @@ struct ext4_group_info { | |||
1678 | ext4_grpblk_t bb_first_free; /* first free block */ | 1799 | ext4_grpblk_t bb_first_free; /* first free block */ |
1679 | ext4_grpblk_t bb_free; /* total free blocks */ | 1800 | ext4_grpblk_t bb_free; /* total free blocks */ |
1680 | ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ | 1801 | ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ |
1802 | ext4_grpblk_t bb_largest_free_order;/* order of largest frag in BG */ | ||
1681 | struct list_head bb_prealloc_list; | 1803 | struct list_head bb_prealloc_list; |
1682 | #ifdef DOUBLE_CHECK | 1804 | #ifdef DOUBLE_CHECK |
1683 | void *bb_bitmap; | 1805 | void *bb_bitmap; |
@@ -1772,9 +1894,8 @@ extern int ext4_ext_tree_init(handle_t *handle, struct inode *); | |||
1772 | extern int ext4_ext_writepage_trans_blocks(struct inode *, int); | 1894 | extern int ext4_ext_writepage_trans_blocks(struct inode *, int); |
1773 | extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, | 1895 | extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, |
1774 | int chunk); | 1896 | int chunk); |
1775 | extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 1897 | extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, |
1776 | ext4_lblk_t iblock, unsigned int max_blocks, | 1898 | struct ext4_map_blocks *map, int flags); |
1777 | struct buffer_head *bh_result, int flags); | ||
1778 | extern void ext4_ext_truncate(struct inode *); | 1899 | extern void ext4_ext_truncate(struct inode *); |
1779 | extern void ext4_ext_init(struct super_block *); | 1900 | extern void ext4_ext_init(struct super_block *); |
1780 | extern void ext4_ext_release(struct super_block *); | 1901 | extern void ext4_ext_release(struct super_block *); |
@@ -1782,6 +1903,8 @@ extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, | |||
1782 | loff_t len); | 1903 | loff_t len); |
1783 | extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, | 1904 | extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, |
1784 | ssize_t len); | 1905 | ssize_t len); |
1906 | extern int ext4_map_blocks(handle_t *handle, struct inode *inode, | ||
1907 | struct ext4_map_blocks *map, int flags); | ||
1785 | extern int ext4_get_blocks(handle_t *handle, struct inode *inode, | 1908 | extern int ext4_get_blocks(handle_t *handle, struct inode *inode, |
1786 | sector_t block, unsigned int max_blocks, | 1909 | sector_t block, unsigned int max_blocks, |
1787 | struct buffer_head *bh, int flags); | 1910 | struct buffer_head *bh, int flags); |