diff options
Diffstat (limited to 'include/linux/ext4_fs.h')
| -rw-r--r-- | include/linux/ext4_fs.h | 104 |
1 files changed, 100 insertions, 4 deletions
diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h index de1f9f78625a..cdee7aaa57aa 100644 --- a/include/linux/ext4_fs.h +++ b/include/linux/ext4_fs.h | |||
| @@ -71,7 +71,7 @@ | |||
| 71 | /* | 71 | /* |
| 72 | * Maximal count of links to a file | 72 | * Maximal count of links to a file |
| 73 | */ | 73 | */ |
| 74 | #define EXT4_LINK_MAX 32000 | 74 | #define EXT4_LINK_MAX 65000 |
| 75 | 75 | ||
| 76 | /* | 76 | /* |
| 77 | * Macro-instructions used to manage several block sizes | 77 | * Macro-instructions used to manage several block sizes |
| @@ -102,6 +102,7 @@ | |||
| 102 | EXT4_GOOD_OLD_FIRST_INO : \ | 102 | EXT4_GOOD_OLD_FIRST_INO : \ |
| 103 | (s)->s_first_ino) | 103 | (s)->s_first_ino) |
| 104 | #endif | 104 | #endif |
| 105 | #define EXT4_BLOCK_ALIGN(size, blkbits) ALIGN((size), (1 << (blkbits))) | ||
| 105 | 106 | ||
| 106 | /* | 107 | /* |
| 107 | * Macro-instructions used to manage fragments | 108 | * Macro-instructions used to manage fragments |
| @@ -201,6 +202,7 @@ struct ext4_group_desc | |||
| 201 | #define EXT4_STATE_JDATA 0x00000001 /* journaled data exists */ | 202 | #define EXT4_STATE_JDATA 0x00000001 /* journaled data exists */ |
| 202 | #define EXT4_STATE_NEW 0x00000002 /* inode is newly created */ | 203 | #define EXT4_STATE_NEW 0x00000002 /* inode is newly created */ |
| 203 | #define EXT4_STATE_XATTR 0x00000004 /* has in-inode xattrs */ | 204 | #define EXT4_STATE_XATTR 0x00000004 /* has in-inode xattrs */ |
| 205 | #define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */ | ||
| 204 | 206 | ||
| 205 | /* Used to pass group descriptor data when online resize is done */ | 207 | /* Used to pass group descriptor data when online resize is done */ |
| 206 | struct ext4_new_group_input { | 208 | struct ext4_new_group_input { |
| @@ -225,6 +227,11 @@ struct ext4_new_group_data { | |||
| 225 | __u32 free_blocks_count; | 227 | __u32 free_blocks_count; |
| 226 | }; | 228 | }; |
| 227 | 229 | ||
| 230 | /* | ||
| 231 | * Following is used by preallocation code to tell get_blocks() that we | ||
| 232 | * want uninitialzed extents. | ||
| 233 | */ | ||
| 234 | #define EXT4_CREATE_UNINITIALIZED_EXT 2 | ||
| 228 | 235 | ||
| 229 | /* | 236 | /* |
| 230 | * ioctl commands | 237 | * ioctl commands |
| @@ -237,7 +244,7 @@ struct ext4_new_group_data { | |||
| 237 | #define EXT4_IOC_GROUP_ADD _IOW('f', 8,struct ext4_new_group_input) | 244 | #define EXT4_IOC_GROUP_ADD _IOW('f', 8,struct ext4_new_group_input) |
| 238 | #define EXT4_IOC_GETVERSION_OLD FS_IOC_GETVERSION | 245 | #define EXT4_IOC_GETVERSION_OLD FS_IOC_GETVERSION |
| 239 | #define EXT4_IOC_SETVERSION_OLD FS_IOC_SETVERSION | 246 | #define EXT4_IOC_SETVERSION_OLD FS_IOC_SETVERSION |
| 240 | #ifdef CONFIG_JBD_DEBUG | 247 | #ifdef CONFIG_JBD2_DEBUG |
| 241 | #define EXT4_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) | 248 | #define EXT4_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) |
| 242 | #endif | 249 | #endif |
| 243 | #define EXT4_IOC_GETRSVSZ _IOR('f', 5, long) | 250 | #define EXT4_IOC_GETRSVSZ _IOR('f', 5, long) |
| @@ -253,7 +260,7 @@ struct ext4_new_group_data { | |||
| 253 | #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) | 260 | #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) |
| 254 | #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) | 261 | #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) |
| 255 | #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) | 262 | #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) |
| 256 | #ifdef CONFIG_JBD_DEBUG | 263 | #ifdef CONFIG_JBD2_DEBUG |
| 257 | #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) | 264 | #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) |
| 258 | #endif | 265 | #endif |
| 259 | #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION | 266 | #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION |
| @@ -282,7 +289,7 @@ struct ext4_inode { | |||
| 282 | __le16 i_uid; /* Low 16 bits of Owner Uid */ | 289 | __le16 i_uid; /* Low 16 bits of Owner Uid */ |
| 283 | __le32 i_size; /* Size in bytes */ | 290 | __le32 i_size; /* Size in bytes */ |
| 284 | __le32 i_atime; /* Access time */ | 291 | __le32 i_atime; /* Access time */ |
| 285 | __le32 i_ctime; /* Creation time */ | 292 | __le32 i_ctime; /* Inode Change time */ |
| 286 | __le32 i_mtime; /* Modification time */ | 293 | __le32 i_mtime; /* Modification time */ |
| 287 | __le32 i_dtime; /* Deletion Time */ | 294 | __le32 i_dtime; /* Deletion Time */ |
| 288 | __le16 i_gid; /* Low 16 bits of Group Id */ | 295 | __le16 i_gid; /* Low 16 bits of Group Id */ |
| @@ -331,10 +338,85 @@ struct ext4_inode { | |||
| 331 | } osd2; /* OS dependent 2 */ | 338 | } osd2; /* OS dependent 2 */ |
| 332 | __le16 i_extra_isize; | 339 | __le16 i_extra_isize; |
| 333 | __le16 i_pad1; | 340 | __le16 i_pad1; |
| 341 | __le32 i_ctime_extra; /* extra Change time (nsec << 2 | epoch) */ | ||
| 342 | __le32 i_mtime_extra; /* extra Modification time(nsec << 2 | epoch) */ | ||
| 343 | __le32 i_atime_extra; /* extra Access time (nsec << 2 | epoch) */ | ||
| 344 | __le32 i_crtime; /* File Creation time */ | ||
| 345 | __le32 i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */ | ||
| 334 | }; | 346 | }; |
| 335 | 347 | ||
| 336 | #define i_size_high i_dir_acl | 348 | #define i_size_high i_dir_acl |
| 337 | 349 | ||
| 350 | #define EXT4_EPOCH_BITS 2 | ||
| 351 | #define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1) | ||
| 352 | #define EXT4_NSEC_MASK (~0UL << EXT4_EPOCH_BITS) | ||
| 353 | |||
| 354 | /* | ||
| 355 | * Extended fields will fit into an inode if the filesystem was formatted | ||
| 356 | * with large inodes (-I 256 or larger) and there are not currently any EAs | ||
| 357 | * consuming all of the available space. For new inodes we always reserve | ||
| 358 | * enough space for the kernel's known extended fields, but for inodes | ||
| 359 | * created with an old kernel this might not have been the case. None of | ||
| 360 | * the extended inode fields is critical for correct filesystem operation. | ||
| 361 | * This macro checks if a certain field fits in the inode. Note that | ||
| 362 | * inode-size = GOOD_OLD_INODE_SIZE + i_extra_isize | ||
| 363 | */ | ||
| 364 | #define EXT4_FITS_IN_INODE(ext4_inode, einode, field) \ | ||
| 365 | ((offsetof(typeof(*ext4_inode), field) + \ | ||
| 366 | sizeof((ext4_inode)->field)) \ | ||
| 367 | <= (EXT4_GOOD_OLD_INODE_SIZE + \ | ||
| 368 | (einode)->i_extra_isize)) \ | ||
| 369 | |||
| 370 | static inline __le32 ext4_encode_extra_time(struct timespec *time) | ||
| 371 | { | ||
| 372 | return cpu_to_le32((sizeof(time->tv_sec) > 4 ? | ||
| 373 | time->tv_sec >> 32 : 0) | | ||
| 374 | ((time->tv_nsec << 2) & EXT4_NSEC_MASK)); | ||
| 375 | } | ||
| 376 | |||
| 377 | static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) | ||
| 378 | { | ||
| 379 | if (sizeof(time->tv_sec) > 4) | ||
| 380 | time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) | ||
| 381 | << 32; | ||
| 382 | time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> 2; | ||
| 383 | } | ||
| 384 | |||
| 385 | #define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \ | ||
| 386 | do { \ | ||
| 387 | (raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec); \ | ||
| 388 | if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) \ | ||
| 389 | (raw_inode)->xtime ## _extra = \ | ||
| 390 | ext4_encode_extra_time(&(inode)->xtime); \ | ||
| 391 | } while (0) | ||
| 392 | |||
| 393 | #define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode) \ | ||
| 394 | do { \ | ||
| 395 | if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \ | ||
| 396 | (raw_inode)->xtime = cpu_to_le32((einode)->xtime.tv_sec); \ | ||
| 397 | if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \ | ||
| 398 | (raw_inode)->xtime ## _extra = \ | ||
| 399 | ext4_encode_extra_time(&(einode)->xtime); \ | ||
| 400 | } while (0) | ||
| 401 | |||
| 402 | #define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode) \ | ||
| 403 | do { \ | ||
| 404 | (inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime); \ | ||
| 405 | if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) \ | ||
| 406 | ext4_decode_extra_time(&(inode)->xtime, \ | ||
| 407 | raw_inode->xtime ## _extra); \ | ||
| 408 | } while (0) | ||
| 409 | |||
| 410 | #define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \ | ||
| 411 | do { \ | ||
| 412 | if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \ | ||
| 413 | (einode)->xtime.tv_sec = \ | ||
| 414 | (signed)le32_to_cpu((raw_inode)->xtime); \ | ||
| 415 | if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \ | ||
| 416 | ext4_decode_extra_time(&(einode)->xtime, \ | ||
| 417 | raw_inode->xtime ## _extra); \ | ||
| 418 | } while (0) | ||
| 419 | |||
| 338 | #if defined(__KERNEL__) || defined(__linux__) | 420 | #if defined(__KERNEL__) || defined(__linux__) |
| 339 | #define i_reserved1 osd1.linux1.l_i_reserved1 | 421 | #define i_reserved1 osd1.linux1.l_i_reserved1 |
| 340 | #define i_frag osd2.linux2.l_i_frag | 422 | #define i_frag osd2.linux2.l_i_frag |
| @@ -533,6 +615,13 @@ static inline struct ext4_inode_info *EXT4_I(struct inode *inode) | |||
| 533 | return container_of(inode, struct ext4_inode_info, vfs_inode); | 615 | return container_of(inode, struct ext4_inode_info, vfs_inode); |
| 534 | } | 616 | } |
| 535 | 617 | ||
| 618 | static inline struct timespec ext4_current_time(struct inode *inode) | ||
| 619 | { | ||
| 620 | return (inode->i_sb->s_time_gran < NSEC_PER_SEC) ? | ||
| 621 | current_fs_time(inode->i_sb) : CURRENT_TIME_SEC; | ||
| 622 | } | ||
| 623 | |||
| 624 | |||
| 536 | static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) | 625 | static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) |
| 537 | { | 626 | { |
| 538 | return ino == EXT4_ROOT_INO || | 627 | return ino == EXT4_ROOT_INO || |
| @@ -603,6 +692,8 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) | |||
| 603 | #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 | 692 | #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 |
| 604 | #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 | 693 | #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 |
| 605 | #define EXT4_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 | 694 | #define EXT4_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 |
| 695 | #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK 0x0020 | ||
| 696 | #define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE 0x0040 | ||
| 606 | 697 | ||
| 607 | #define EXT4_FEATURE_INCOMPAT_COMPRESSION 0x0001 | 698 | #define EXT4_FEATURE_INCOMPAT_COMPRESSION 0x0001 |
| 608 | #define EXT4_FEATURE_INCOMPAT_FILETYPE 0x0002 | 699 | #define EXT4_FEATURE_INCOMPAT_FILETYPE 0x0002 |
| @@ -620,6 +711,8 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) | |||
| 620 | EXT4_FEATURE_INCOMPAT_64BIT) | 711 | EXT4_FEATURE_INCOMPAT_64BIT) |
| 621 | #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ | 712 | #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ |
| 622 | EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ | 713 | EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ |
| 714 | EXT4_FEATURE_RO_COMPAT_DIR_NLINK | \ | ||
| 715 | EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE | \ | ||
| 623 | EXT4_FEATURE_RO_COMPAT_BTREE_DIR) | 716 | EXT4_FEATURE_RO_COMPAT_BTREE_DIR) |
| 624 | 717 | ||
| 625 | /* | 718 | /* |
| @@ -862,6 +955,7 @@ extern int ext4_change_inode_journal_flag(struct inode *, int); | |||
| 862 | extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *); | 955 | extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *); |
| 863 | extern void ext4_truncate (struct inode *); | 956 | extern void ext4_truncate (struct inode *); |
| 864 | extern void ext4_set_inode_flags(struct inode *); | 957 | extern void ext4_set_inode_flags(struct inode *); |
| 958 | extern void ext4_get_inode_flags(struct ext4_inode_info *); | ||
| 865 | extern void ext4_set_aops(struct inode *inode); | 959 | extern void ext4_set_aops(struct inode *inode); |
| 866 | extern int ext4_writepage_trans_blocks(struct inode *); | 960 | extern int ext4_writepage_trans_blocks(struct inode *); |
| 867 | extern int ext4_block_truncate_page(handle_t *handle, struct page *page, | 961 | extern int ext4_block_truncate_page(handle_t *handle, struct page *page, |
| @@ -983,6 +1077,8 @@ extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 983 | extern void ext4_ext_truncate(struct inode *, struct page *); | 1077 | extern void ext4_ext_truncate(struct inode *, struct page *); |
| 984 | extern void ext4_ext_init(struct super_block *); | 1078 | extern void ext4_ext_init(struct super_block *); |
| 985 | extern void ext4_ext_release(struct super_block *); | 1079 | extern void ext4_ext_release(struct super_block *); |
| 1080 | extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, | ||
| 1081 | loff_t len); | ||
| 986 | static inline int | 1082 | static inline int |
| 987 | ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, | 1083 | ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, |
| 988 | unsigned long max_blocks, struct buffer_head *bh, | 1084 | unsigned long max_blocks, struct buffer_head *bh, |
