13dcf5451SChristoph Hellwig /* 23dcf5451SChristoph Hellwig * ext4.h 33dcf5451SChristoph Hellwig * 43dcf5451SChristoph Hellwig * Copyright (C) 1992, 1993, 1994, 1995 53dcf5451SChristoph Hellwig * Remy Card (card@masi.ibp.fr) 63dcf5451SChristoph Hellwig * Laboratoire MASI - Institut Blaise Pascal 73dcf5451SChristoph Hellwig * Universite Pierre et Marie Curie (Paris VI) 83dcf5451SChristoph Hellwig * 93dcf5451SChristoph Hellwig * from 103dcf5451SChristoph Hellwig * 113dcf5451SChristoph Hellwig * linux/include/linux/minix_fs.h 123dcf5451SChristoph Hellwig * 133dcf5451SChristoph Hellwig * Copyright (C) 1991, 1992 Linus Torvalds 143dcf5451SChristoph Hellwig */ 153dcf5451SChristoph Hellwig 163dcf5451SChristoph Hellwig #ifndef _EXT4_H 173dcf5451SChristoph Hellwig #define _EXT4_H 183dcf5451SChristoph Hellwig 193dcf5451SChristoph Hellwig #include <linux/types.h> 203dcf5451SChristoph Hellwig #include <linux/blkdev.h> 213dcf5451SChristoph Hellwig #include <linux/magic.h> 222ccb5fb9SAneesh Kumar K.V #include <linux/jbd2.h> 2360e58e0fSMingming Cao #include <linux/quota.h> 24d444c3c3STheodore Ts'o #include <linux/rwsem.h> 25d444c3c3STheodore Ts'o #include <linux/rbtree.h> 26d444c3c3STheodore Ts'o #include <linux/seqlock.h> 27d444c3c3STheodore Ts'o #include <linux/mutex.h> 28ca0faba0STheodore Ts'o #include <linux/timer.h> 29ca0faba0STheodore Ts'o #include <linux/wait.h> 30ca0faba0STheodore Ts'o #include <linux/blockgroup_lock.h> 31ca0faba0STheodore Ts'o #include <linux/percpu_counter.h> 324d92dc0fSBen Hutchings #ifdef __KERNEL__ 334d92dc0fSBen Hutchings #include <linux/compat.h> 344d92dc0fSBen Hutchings #endif 353dcf5451SChristoph Hellwig 363dcf5451SChristoph Hellwig /* 378a35694eSShen Feng * The fourth extended filesystem constants/structures 383dcf5451SChristoph Hellwig */ 393dcf5451SChristoph Hellwig 403dcf5451SChristoph Hellwig /* 413dcf5451SChristoph Hellwig * Define EXT4FS_DEBUG to produce debug messages 423dcf5451SChristoph Hellwig */ 433dcf5451SChristoph Hellwig #undef EXT4FS_DEBUG 443dcf5451SChristoph Hellwig 453dcf5451SChristoph Hellwig /* 463dcf5451SChristoph Hellwig * Debug code 473dcf5451SChristoph Hellwig */ 483dcf5451SChristoph Hellwig #ifdef EXT4FS_DEBUG 493dcf5451SChristoph Hellwig #define ext4_debug(f, a...) \ 503dcf5451SChristoph Hellwig do { \ 513dcf5451SChristoph Hellwig printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:", \ 524db9c54aSStoyan Gaydarov __FILE__, __LINE__, __func__); \ 533dcf5451SChristoph Hellwig printk(KERN_DEBUG f, ## a); \ 543dcf5451SChristoph Hellwig } while (0) 553dcf5451SChristoph Hellwig #else 563dcf5451SChristoph Hellwig #define ext4_debug(f, a...) do {} while (0) 573dcf5451SChristoph Hellwig #endif 583dcf5451SChristoph Hellwig 59273df556SFrank Mayhar #define EXT4_ERROR_INODE(inode, fmt, a...) \ 60c398eda0STheodore Ts'o ext4_error_inode((inode), __func__, __LINE__, 0, (fmt), ## a) 61c398eda0STheodore Ts'o 62c398eda0STheodore Ts'o #define EXT4_ERROR_INODE_BLOCK(inode, block, fmt, a...) \ 63c398eda0STheodore Ts'o ext4_error_inode((inode), __func__, __LINE__, (block), (fmt), ## a) 64273df556SFrank Mayhar 65273df556SFrank Mayhar #define EXT4_ERROR_FILE(file, fmt, a...) \ 66c398eda0STheodore Ts'o ext4_error_file(__func__, __LINE__, (file), (fmt), ## a) 67273df556SFrank Mayhar 68d444c3c3STheodore Ts'o /* data type for block offset of block group */ 69d444c3c3STheodore Ts'o typedef int ext4_grpblk_t; 70d444c3c3STheodore Ts'o 71d444c3c3STheodore Ts'o /* data type for filesystem-wide blocks number */ 72d444c3c3STheodore Ts'o typedef unsigned long long ext4_fsblk_t; 73d444c3c3STheodore Ts'o 74d444c3c3STheodore Ts'o /* data type for file logical block number */ 75d444c3c3STheodore Ts'o typedef __u32 ext4_lblk_t; 76d444c3c3STheodore Ts'o 77d444c3c3STheodore Ts'o /* data type for block group number */ 78d444c3c3STheodore Ts'o typedef unsigned int ext4_group_t; 79d444c3c3STheodore Ts'o 80296c355cSTheodore Ts'o /* 81296c355cSTheodore Ts'o * Flags used in mballoc's allocation_context flags field. 82296c355cSTheodore Ts'o * 83296c355cSTheodore Ts'o * Also used to show what's going on for debugging purposes when the 84296c355cSTheodore Ts'o * flag field is exported via the traceport interface 85296c355cSTheodore Ts'o */ 86d444c3c3STheodore Ts'o 873dcf5451SChristoph Hellwig /* prefer goal again. length */ 880ef90db9STheodore Ts'o #define EXT4_MB_HINT_MERGE 0x0001 893dcf5451SChristoph Hellwig /* blocks already reserved */ 900ef90db9STheodore Ts'o #define EXT4_MB_HINT_RESERVED 0x0002 913dcf5451SChristoph Hellwig /* metadata is being allocated */ 920ef90db9STheodore Ts'o #define EXT4_MB_HINT_METADATA 0x0004 933dcf5451SChristoph Hellwig /* first blocks in the file */ 940ef90db9STheodore Ts'o #define EXT4_MB_HINT_FIRST 0x0008 953dcf5451SChristoph Hellwig /* search for the best chunk */ 960ef90db9STheodore Ts'o #define EXT4_MB_HINT_BEST 0x0010 973dcf5451SChristoph Hellwig /* data is being allocated */ 980ef90db9STheodore Ts'o #define EXT4_MB_HINT_DATA 0x0020 993dcf5451SChristoph Hellwig /* don't preallocate (for tails) */ 1000ef90db9STheodore Ts'o #define EXT4_MB_HINT_NOPREALLOC 0x0040 1013dcf5451SChristoph Hellwig /* allocate for locality group */ 1020ef90db9STheodore Ts'o #define EXT4_MB_HINT_GROUP_ALLOC 0x0080 1033dcf5451SChristoph Hellwig /* allocate goal blocks or none */ 1040ef90db9STheodore Ts'o #define EXT4_MB_HINT_GOAL_ONLY 0x0100 1053dcf5451SChristoph Hellwig /* goal is meaningful */ 1060ef90db9STheodore Ts'o #define EXT4_MB_HINT_TRY_GOAL 0x0200 107d2a17637SMingming Cao /* blocks already pre-reserved by delayed allocation */ 1080ef90db9STheodore Ts'o #define EXT4_MB_DELALLOC_RESERVED 0x0400 1094ba74d00STheodore Ts'o /* We are doing stream allocation */ 1104ba74d00STheodore Ts'o #define EXT4_MB_STREAM_ALLOC 0x0800 111d2a17637SMingming Cao 1123dcf5451SChristoph Hellwig 1133dcf5451SChristoph Hellwig struct ext4_allocation_request { 1143dcf5451SChristoph Hellwig /* target inode for block we're allocating */ 1153dcf5451SChristoph Hellwig struct inode *inode; 1163dcf5451SChristoph Hellwig /* how many blocks we want to allocate */ 117498e5f24STheodore Ts'o unsigned int len; 118726447d8SEric Sandeen /* logical block in target inode */ 119726447d8SEric Sandeen ext4_lblk_t logical; 120726447d8SEric Sandeen /* the closest logical allocated block to the left */ 121726447d8SEric Sandeen ext4_lblk_t lleft; 122726447d8SEric Sandeen /* the closest logical allocated block to the right */ 123726447d8SEric Sandeen ext4_lblk_t lright; 124726447d8SEric Sandeen /* phys. target (a hint) */ 125726447d8SEric Sandeen ext4_fsblk_t goal; 126726447d8SEric Sandeen /* phys. block for the closest logical allocated block to the left */ 127726447d8SEric Sandeen ext4_fsblk_t pleft; 128726447d8SEric Sandeen /* phys. block for the closest logical allocated block to the right */ 129726447d8SEric Sandeen ext4_fsblk_t pright; 1303dcf5451SChristoph Hellwig /* flags. see above EXT4_MB_HINT_* */ 131498e5f24STheodore Ts'o unsigned int flags; 1323dcf5451SChristoph Hellwig }; 1333dcf5451SChristoph Hellwig 1343dcf5451SChristoph Hellwig /* 135e35fd660STheodore Ts'o * Logical to physical block mapping, used by ext4_map_blocks() 136e35fd660STheodore Ts'o * 137e35fd660STheodore Ts'o * This structure is used to pass requests into ext4_map_blocks() as 138e35fd660STheodore Ts'o * well as to store the information returned by ext4_map_blocks(). It 139e35fd660STheodore Ts'o * takes less room on the stack than a struct buffer_head. 140e35fd660STheodore Ts'o */ 141e35fd660STheodore Ts'o #define EXT4_MAP_NEW (1 << BH_New) 142e35fd660STheodore Ts'o #define EXT4_MAP_MAPPED (1 << BH_Mapped) 143e35fd660STheodore Ts'o #define EXT4_MAP_UNWRITTEN (1 << BH_Unwritten) 144e35fd660STheodore Ts'o #define EXT4_MAP_BOUNDARY (1 << BH_Boundary) 145e35fd660STheodore Ts'o #define EXT4_MAP_UNINIT (1 << BH_Uninit) 146e35fd660STheodore Ts'o #define EXT4_MAP_FLAGS (EXT4_MAP_NEW | EXT4_MAP_MAPPED |\ 147e35fd660STheodore Ts'o EXT4_MAP_UNWRITTEN | EXT4_MAP_BOUNDARY |\ 148e35fd660STheodore Ts'o EXT4_MAP_UNINIT) 149e35fd660STheodore Ts'o 150e35fd660STheodore Ts'o struct ext4_map_blocks { 151e35fd660STheodore Ts'o ext4_fsblk_t m_pblk; 152e35fd660STheodore Ts'o ext4_lblk_t m_lblk; 153e35fd660STheodore Ts'o unsigned int m_len; 154e35fd660STheodore Ts'o unsigned int m_flags; 155e35fd660STheodore Ts'o }; 156e35fd660STheodore Ts'o 157e35fd660STheodore Ts'o /* 158b3a3ca8cSTheodore Ts'o * For delayed allocation tracking 159b3a3ca8cSTheodore Ts'o */ 160b3a3ca8cSTheodore Ts'o struct mpage_da_data { 161b3a3ca8cSTheodore Ts'o struct inode *inode; 162b3a3ca8cSTheodore Ts'o sector_t b_blocknr; /* start block number of extent */ 163b3a3ca8cSTheodore Ts'o size_t b_size; /* size of extent */ 164b3a3ca8cSTheodore Ts'o unsigned long b_state; /* state of the extent */ 165b3a3ca8cSTheodore Ts'o unsigned long first_page, next_page; /* extent of pages */ 166b3a3ca8cSTheodore Ts'o struct writeback_control *wbc; 167b3a3ca8cSTheodore Ts'o int io_done; 168b3a3ca8cSTheodore Ts'o int pages_written; 169b3a3ca8cSTheodore Ts'o int retval; 170b3a3ca8cSTheodore Ts'o }; 171bd2d0210STheodore Ts'o 172bd2d0210STheodore Ts'o /* 173bd2d0210STheodore Ts'o * Flags for ext4_io_end->flags 174bd2d0210STheodore Ts'o */ 175bd2d0210STheodore Ts'o #define EXT4_IO_END_UNWRITTEN 0x0001 176bd2d0210STheodore Ts'o #define EXT4_IO_END_ERROR 0x0002 177bd2d0210STheodore Ts'o 178bd2d0210STheodore Ts'o struct ext4_io_page { 179bd2d0210STheodore Ts'o struct page *p_page; 18083668e71STheodore Ts'o atomic_t p_count; 181bd2d0210STheodore Ts'o }; 182bd2d0210STheodore Ts'o 183bd2d0210STheodore Ts'o #define MAX_IO_PAGES 128 184bd2d0210STheodore Ts'o 1850031462bSMingming Cao typedef struct ext4_io_end { 1865b3ff237Sjiayingz@google.com (Jiaying Zhang) struct list_head list; /* per-file finished IO list */ 1870031462bSMingming Cao struct inode *inode; /* file being written to */ 1888d5d02e6SMingming Cao unsigned int flag; /* unwritten or not */ 189744692dcSJiaying Zhang struct page *page; /* page struct for buffer write */ 190a1de02dcSEric Sandeen loff_t offset; /* offset in the file */ 191a1de02dcSEric Sandeen ssize_t size; /* size of the extent */ 1920031462bSMingming Cao struct work_struct work; /* data work queue */ 1935b3ff237Sjiayingz@google.com (Jiaying Zhang) struct kiocb *iocb; /* iocb struct for AIO */ 1945b3ff237Sjiayingz@google.com (Jiaying Zhang) int result; /* error value for AIO */ 195bd2d0210STheodore Ts'o int num_io_pages; 196bd2d0210STheodore Ts'o struct ext4_io_page *pages[MAX_IO_PAGES]; 1970031462bSMingming Cao } ext4_io_end_t; 1980031462bSMingming Cao 199bd2d0210STheodore Ts'o struct ext4_io_submit { 200bd2d0210STheodore Ts'o int io_op; 201bd2d0210STheodore Ts'o struct bio *io_bio; 202bd2d0210STheodore Ts'o ext4_io_end_t *io_end; 203bd2d0210STheodore Ts'o struct ext4_io_page *io_page; 204bd2d0210STheodore Ts'o sector_t io_next_block; 205bd2d0210STheodore Ts'o }; 206bd2d0210STheodore Ts'o 207b3a3ca8cSTheodore Ts'o /* 2083dcf5451SChristoph Hellwig * Special inodes numbers 2093dcf5451SChristoph Hellwig */ 2103dcf5451SChristoph Hellwig #define EXT4_BAD_INO 1 /* Bad blocks inode */ 2113dcf5451SChristoph Hellwig #define EXT4_ROOT_INO 2 /* Root inode */ 2123dcf5451SChristoph Hellwig #define EXT4_BOOT_LOADER_INO 5 /* Boot loader inode */ 2133dcf5451SChristoph Hellwig #define EXT4_UNDEL_DIR_INO 6 /* Undelete directory inode */ 2143dcf5451SChristoph Hellwig #define EXT4_RESIZE_INO 7 /* Reserved group descriptors inode */ 2153dcf5451SChristoph Hellwig #define EXT4_JOURNAL_INO 8 /* Journal inode */ 2163dcf5451SChristoph Hellwig 2173dcf5451SChristoph Hellwig /* First non-reserved inode for old ext4 filesystems */ 2183dcf5451SChristoph Hellwig #define EXT4_GOOD_OLD_FIRST_INO 11 2193dcf5451SChristoph Hellwig 2203dcf5451SChristoph Hellwig /* 2213dcf5451SChristoph Hellwig * Maximal count of links to a file 2223dcf5451SChristoph Hellwig */ 2233dcf5451SChristoph Hellwig #define EXT4_LINK_MAX 65000 2243dcf5451SChristoph Hellwig 2253dcf5451SChristoph Hellwig /* 2263dcf5451SChristoph Hellwig * Macro-instructions used to manage several block sizes 2273dcf5451SChristoph Hellwig */ 2283dcf5451SChristoph Hellwig #define EXT4_MIN_BLOCK_SIZE 1024 2293dcf5451SChristoph Hellwig #define EXT4_MAX_BLOCK_SIZE 65536 2303dcf5451SChristoph Hellwig #define EXT4_MIN_BLOCK_LOG_SIZE 10 231fb1813f4SCurt Wohlgemuth #define EXT4_MAX_BLOCK_LOG_SIZE 16 2323dcf5451SChristoph Hellwig #ifdef __KERNEL__ 2333dcf5451SChristoph Hellwig # define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize) 2343dcf5451SChristoph Hellwig #else 2353dcf5451SChristoph Hellwig # define EXT4_BLOCK_SIZE(s) (EXT4_MIN_BLOCK_SIZE << (s)->s_log_block_size) 2363dcf5451SChristoph Hellwig #endif 2373dcf5451SChristoph Hellwig #define EXT4_ADDR_PER_BLOCK(s) (EXT4_BLOCK_SIZE(s) / sizeof(__u32)) 2383dcf5451SChristoph Hellwig #ifdef __KERNEL__ 2393dcf5451SChristoph Hellwig # define EXT4_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) 2403dcf5451SChristoph Hellwig #else 2413dcf5451SChristoph Hellwig # define EXT4_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) 2423dcf5451SChristoph Hellwig #endif 2433dcf5451SChristoph Hellwig #ifdef __KERNEL__ 2443dcf5451SChristoph Hellwig #define EXT4_ADDR_PER_BLOCK_BITS(s) (EXT4_SB(s)->s_addr_per_block_bits) 2453dcf5451SChristoph Hellwig #define EXT4_INODE_SIZE(s) (EXT4_SB(s)->s_inode_size) 2463dcf5451SChristoph Hellwig #define EXT4_FIRST_INO(s) (EXT4_SB(s)->s_first_ino) 2473dcf5451SChristoph Hellwig #else 2483dcf5451SChristoph Hellwig #define EXT4_INODE_SIZE(s) (((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \ 2493dcf5451SChristoph Hellwig EXT4_GOOD_OLD_INODE_SIZE : \ 2503dcf5451SChristoph Hellwig (s)->s_inode_size) 2513dcf5451SChristoph Hellwig #define EXT4_FIRST_INO(s) (((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \ 2523dcf5451SChristoph Hellwig EXT4_GOOD_OLD_FIRST_INO : \ 2533dcf5451SChristoph Hellwig (s)->s_first_ino) 2543dcf5451SChristoph Hellwig #endif 2553dcf5451SChristoph Hellwig #define EXT4_BLOCK_ALIGN(size, blkbits) ALIGN((size), (1 << (blkbits))) 2563dcf5451SChristoph Hellwig 2573dcf5451SChristoph Hellwig /* 2583dcf5451SChristoph Hellwig * Structure of a blocks group descriptor 2593dcf5451SChristoph Hellwig */ 2603dcf5451SChristoph Hellwig struct ext4_group_desc 2613dcf5451SChristoph Hellwig { 2623dcf5451SChristoph Hellwig __le32 bg_block_bitmap_lo; /* Blocks bitmap block */ 2633dcf5451SChristoph Hellwig __le32 bg_inode_bitmap_lo; /* Inodes bitmap block */ 2643dcf5451SChristoph Hellwig __le32 bg_inode_table_lo; /* Inodes table block */ 265560671a0SAneesh Kumar K.V __le16 bg_free_blocks_count_lo;/* Free blocks count */ 266560671a0SAneesh Kumar K.V __le16 bg_free_inodes_count_lo;/* Free inodes count */ 267560671a0SAneesh Kumar K.V __le16 bg_used_dirs_count_lo; /* Directories count */ 2683dcf5451SChristoph Hellwig __le16 bg_flags; /* EXT4_BG_flags (INODE_UNINIT, etc) */ 2693dcf5451SChristoph Hellwig __u32 bg_reserved[2]; /* Likely block/inode bitmap checksum */ 270560671a0SAneesh Kumar K.V __le16 bg_itable_unused_lo; /* Unused inodes count */ 2713dcf5451SChristoph Hellwig __le16 bg_checksum; /* crc16(sb_uuid+group+desc) */ 2723dcf5451SChristoph Hellwig __le32 bg_block_bitmap_hi; /* Blocks bitmap block MSB */ 2733dcf5451SChristoph Hellwig __le32 bg_inode_bitmap_hi; /* Inodes bitmap block MSB */ 2743dcf5451SChristoph Hellwig __le32 bg_inode_table_hi; /* Inodes table block MSB */ 2753dcf5451SChristoph Hellwig __le16 bg_free_blocks_count_hi;/* Free blocks count MSB */ 2763dcf5451SChristoph Hellwig __le16 bg_free_inodes_count_hi;/* Free inodes count MSB */ 2773dcf5451SChristoph Hellwig __le16 bg_used_dirs_count_hi; /* Directories count MSB */ 2783dcf5451SChristoph Hellwig __le16 bg_itable_unused_hi; /* Unused inodes count MSB */ 2793dcf5451SChristoph Hellwig __u32 bg_reserved2[3]; 2803dcf5451SChristoph Hellwig }; 2813dcf5451SChristoph Hellwig 282772cb7c8SJose R. Santos /* 283772cb7c8SJose R. Santos * Structure of a flex block group info 284772cb7c8SJose R. Santos */ 285772cb7c8SJose R. Santos 286772cb7c8SJose R. Santos struct flex_groups { 2879f24e420STheodore Ts'o atomic_t free_inodes; 2889f24e420STheodore Ts'o atomic_t free_blocks; 2897d39db14STheodore Ts'o atomic_t used_dirs; 290772cb7c8SJose R. Santos }; 291772cb7c8SJose R. Santos 2923dcf5451SChristoph Hellwig #define EXT4_BG_INODE_UNINIT 0x0001 /* Inode table/bitmap not in use */ 2933dcf5451SChristoph Hellwig #define EXT4_BG_BLOCK_UNINIT 0x0002 /* Block bitmap not in use */ 2943dcf5451SChristoph Hellwig #define EXT4_BG_INODE_ZEROED 0x0004 /* On-disk itable initialized to zero */ 2953dcf5451SChristoph Hellwig 2963dcf5451SChristoph Hellwig /* 2973dcf5451SChristoph Hellwig * Macro-instructions used to manage group descriptors 2983dcf5451SChristoph Hellwig */ 2993dcf5451SChristoph Hellwig #define EXT4_MIN_DESC_SIZE 32 3003dcf5451SChristoph Hellwig #define EXT4_MIN_DESC_SIZE_64BIT 64 3013dcf5451SChristoph Hellwig #define EXT4_MAX_DESC_SIZE EXT4_MIN_BLOCK_SIZE 3023dcf5451SChristoph Hellwig #define EXT4_DESC_SIZE(s) (EXT4_SB(s)->s_desc_size) 3033dcf5451SChristoph Hellwig #ifdef __KERNEL__ 3043dcf5451SChristoph Hellwig # define EXT4_BLOCKS_PER_GROUP(s) (EXT4_SB(s)->s_blocks_per_group) 3053dcf5451SChristoph Hellwig # define EXT4_DESC_PER_BLOCK(s) (EXT4_SB(s)->s_desc_per_block) 3063dcf5451SChristoph Hellwig # define EXT4_INODES_PER_GROUP(s) (EXT4_SB(s)->s_inodes_per_group) 3073dcf5451SChristoph Hellwig # define EXT4_DESC_PER_BLOCK_BITS(s) (EXT4_SB(s)->s_desc_per_block_bits) 3083dcf5451SChristoph Hellwig #else 3093dcf5451SChristoph Hellwig # define EXT4_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) 3103dcf5451SChristoph Hellwig # define EXT4_DESC_PER_BLOCK(s) (EXT4_BLOCK_SIZE(s) / EXT4_DESC_SIZE(s)) 3113dcf5451SChristoph Hellwig # define EXT4_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) 3123dcf5451SChristoph Hellwig #endif 3133dcf5451SChristoph Hellwig 3143dcf5451SChristoph Hellwig /* 3153dcf5451SChristoph Hellwig * Constants relative to the data blocks 3163dcf5451SChristoph Hellwig */ 3173dcf5451SChristoph Hellwig #define EXT4_NDIR_BLOCKS 12 3183dcf5451SChristoph Hellwig #define EXT4_IND_BLOCK EXT4_NDIR_BLOCKS 3193dcf5451SChristoph Hellwig #define EXT4_DIND_BLOCK (EXT4_IND_BLOCK + 1) 3203dcf5451SChristoph Hellwig #define EXT4_TIND_BLOCK (EXT4_DIND_BLOCK + 1) 3213dcf5451SChristoph Hellwig #define EXT4_N_BLOCKS (EXT4_TIND_BLOCK + 1) 3223dcf5451SChristoph Hellwig 3233dcf5451SChristoph Hellwig /* 3243dcf5451SChristoph Hellwig * Inode flags 3253dcf5451SChristoph Hellwig */ 3263dcf5451SChristoph Hellwig #define EXT4_SECRM_FL 0x00000001 /* Secure deletion */ 3273dcf5451SChristoph Hellwig #define EXT4_UNRM_FL 0x00000002 /* Undelete */ 3283dcf5451SChristoph Hellwig #define EXT4_COMPR_FL 0x00000004 /* Compress file */ 3293dcf5451SChristoph Hellwig #define EXT4_SYNC_FL 0x00000008 /* Synchronous updates */ 3303dcf5451SChristoph Hellwig #define EXT4_IMMUTABLE_FL 0x00000010 /* Immutable file */ 3313dcf5451SChristoph Hellwig #define EXT4_APPEND_FL 0x00000020 /* writes to file may only append */ 3323dcf5451SChristoph Hellwig #define EXT4_NODUMP_FL 0x00000040 /* do not dump file */ 3333dcf5451SChristoph Hellwig #define EXT4_NOATIME_FL 0x00000080 /* do not update atime */ 3343dcf5451SChristoph Hellwig /* Reserved for compression usage... */ 3353dcf5451SChristoph Hellwig #define EXT4_DIRTY_FL 0x00000100 3363dcf5451SChristoph Hellwig #define EXT4_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */ 3373dcf5451SChristoph Hellwig #define EXT4_NOCOMPR_FL 0x00000400 /* Don't compress */ 3383dcf5451SChristoph Hellwig #define EXT4_ECOMPR_FL 0x00000800 /* Compression error */ 3393dcf5451SChristoph Hellwig /* End compression flags --- maybe not all used */ 3403dcf5451SChristoph Hellwig #define EXT4_INDEX_FL 0x00001000 /* hash-indexed directory */ 3413dcf5451SChristoph Hellwig #define EXT4_IMAGIC_FL 0x00002000 /* AFS directory */ 3423dcf5451SChristoph Hellwig #define EXT4_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ 3433dcf5451SChristoph Hellwig #define EXT4_NOTAIL_FL 0x00008000 /* file tail should not be merged */ 3443dcf5451SChristoph Hellwig #define EXT4_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ 3453dcf5451SChristoph Hellwig #define EXT4_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ 3463dcf5451SChristoph Hellwig #define EXT4_HUGE_FILE_FL 0x00040000 /* Set to each huge file */ 3473dcf5451SChristoph Hellwig #define EXT4_EXTENTS_FL 0x00080000 /* Inode uses extents */ 348f710b4b9STheodore Ts'o #define EXT4_EA_INODE_FL 0x00200000 /* Inode used for large EA */ 349c8d46e41SJiaying Zhang #define EXT4_EOFBLOCKS_FL 0x00400000 /* Blocks allocated beyond EOF */ 3503dcf5451SChristoph Hellwig #define EXT4_RESERVED_FL 0x80000000 /* reserved for ext4 lib */ 3513dcf5451SChristoph Hellwig 352c8d46e41SJiaying Zhang #define EXT4_FL_USER_VISIBLE 0x004BDFFF /* User visible flags */ 353c8d46e41SJiaying Zhang #define EXT4_FL_USER_MODIFIABLE 0x004B80FF /* User modifiable flags */ 3543dcf5451SChristoph Hellwig 3558fa43a81SDuane Griffin /* Flags that should be inherited by new inodes from their parent. */ 3568fa43a81SDuane Griffin #define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\ 3578fa43a81SDuane Griffin EXT4_SYNC_FL | EXT4_IMMUTABLE_FL | EXT4_APPEND_FL |\ 3588fa43a81SDuane Griffin EXT4_NODUMP_FL | EXT4_NOATIME_FL |\ 3598fa43a81SDuane Griffin EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\ 3608fa43a81SDuane Griffin EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL) 3618fa43a81SDuane Griffin 3622dc6b0d4SDuane Griffin /* Flags that are appropriate for regular files (all but dir-specific ones). */ 3632dc6b0d4SDuane Griffin #define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL)) 3642dc6b0d4SDuane Griffin 3652dc6b0d4SDuane Griffin /* Flags that are appropriate for non-directories/regular files. */ 3662dc6b0d4SDuane Griffin #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL) 3672dc6b0d4SDuane Griffin 3682dc6b0d4SDuane Griffin /* Mask out flags that are inappropriate for the given type of inode. */ 3692dc6b0d4SDuane Griffin static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) 3702dc6b0d4SDuane Griffin { 3712dc6b0d4SDuane Griffin if (S_ISDIR(mode)) 3722dc6b0d4SDuane Griffin return flags; 3732dc6b0d4SDuane Griffin else if (S_ISREG(mode)) 3742dc6b0d4SDuane Griffin return flags & EXT4_REG_FLMASK; 3752dc6b0d4SDuane Griffin else 3762dc6b0d4SDuane Griffin return flags & EXT4_OTHER_FLMASK; 3772dc6b0d4SDuane Griffin } 3782dc6b0d4SDuane Griffin 37912e9b892SDmitry Monakhov /* 38012e9b892SDmitry Monakhov * Inode flags used for atomic set/get 38112e9b892SDmitry Monakhov */ 38212e9b892SDmitry Monakhov enum { 38312e9b892SDmitry Monakhov EXT4_INODE_SECRM = 0, /* Secure deletion */ 38412e9b892SDmitry Monakhov EXT4_INODE_UNRM = 1, /* Undelete */ 38512e9b892SDmitry Monakhov EXT4_INODE_COMPR = 2, /* Compress file */ 38612e9b892SDmitry Monakhov EXT4_INODE_SYNC = 3, /* Synchronous updates */ 38712e9b892SDmitry Monakhov EXT4_INODE_IMMUTABLE = 4, /* Immutable file */ 38812e9b892SDmitry Monakhov EXT4_INODE_APPEND = 5, /* writes to file may only append */ 38912e9b892SDmitry Monakhov EXT4_INODE_NODUMP = 6, /* do not dump file */ 39012e9b892SDmitry Monakhov EXT4_INODE_NOATIME = 7, /* do not update atime */ 39112e9b892SDmitry Monakhov /* Reserved for compression usage... */ 39212e9b892SDmitry Monakhov EXT4_INODE_DIRTY = 8, 39312e9b892SDmitry Monakhov EXT4_INODE_COMPRBLK = 9, /* One or more compressed clusters */ 39412e9b892SDmitry Monakhov EXT4_INODE_NOCOMPR = 10, /* Don't compress */ 39512e9b892SDmitry Monakhov EXT4_INODE_ECOMPR = 11, /* Compression error */ 39612e9b892SDmitry Monakhov /* End compression flags --- maybe not all used */ 39712e9b892SDmitry Monakhov EXT4_INODE_INDEX = 12, /* hash-indexed directory */ 39812e9b892SDmitry Monakhov EXT4_INODE_IMAGIC = 13, /* AFS directory */ 39912e9b892SDmitry Monakhov EXT4_INODE_JOURNAL_DATA = 14, /* file data should be journaled */ 40012e9b892SDmitry Monakhov EXT4_INODE_NOTAIL = 15, /* file tail should not be merged */ 40112e9b892SDmitry Monakhov EXT4_INODE_DIRSYNC = 16, /* dirsync behaviour (directories only) */ 40212e9b892SDmitry Monakhov EXT4_INODE_TOPDIR = 17, /* Top of directory hierarchies*/ 40312e9b892SDmitry Monakhov EXT4_INODE_HUGE_FILE = 18, /* Set to each huge file */ 40412e9b892SDmitry Monakhov EXT4_INODE_EXTENTS = 19, /* Inode uses extents */ 40512e9b892SDmitry Monakhov EXT4_INODE_EA_INODE = 21, /* Inode used for large EA */ 40612e9b892SDmitry Monakhov EXT4_INODE_EOFBLOCKS = 22, /* Blocks allocated beyond EOF */ 40712e9b892SDmitry Monakhov EXT4_INODE_RESERVED = 31, /* reserved for ext4 lib */ 40812e9b892SDmitry Monakhov }; 40912e9b892SDmitry Monakhov 41012e9b892SDmitry Monakhov #define TEST_FLAG_VALUE(FLAG) (EXT4_##FLAG##_FL == (1 << EXT4_INODE_##FLAG)) 41112e9b892SDmitry Monakhov #define CHECK_FLAG_VALUE(FLAG) if (!TEST_FLAG_VALUE(FLAG)) { \ 41212e9b892SDmitry Monakhov printk(KERN_EMERG "EXT4 flag fail: " #FLAG ": %d %d\n", \ 41312e9b892SDmitry Monakhov EXT4_##FLAG##_FL, EXT4_INODE_##FLAG); BUG_ON(1); } 41412e9b892SDmitry Monakhov 41512e9b892SDmitry Monakhov /* 41612e9b892SDmitry Monakhov * Since it's pretty easy to mix up bit numbers and hex values, and we 41712e9b892SDmitry Monakhov * can't do a compile-time test for ENUM values, we use a run-time 41812e9b892SDmitry Monakhov * test to make sure that EXT4_XXX_FL is consistent with respect to 41912e9b892SDmitry Monakhov * EXT4_INODE_XXX. If all is well the printk and BUG_ON will all drop 42012e9b892SDmitry Monakhov * out so it won't cost any extra space in the compiled kernel image. 42112e9b892SDmitry Monakhov * But it's important that these values are the same, since we are 42212e9b892SDmitry Monakhov * using EXT4_INODE_XXX to test for the flag values, but EXT4_XX_FL 42312e9b892SDmitry Monakhov * must be consistent with the values of FS_XXX_FL defined in 42412e9b892SDmitry Monakhov * include/linux/fs.h and the on-disk values found in ext2, ext3, and 42512e9b892SDmitry Monakhov * ext4 filesystems, and of course the values defined in e2fsprogs. 42612e9b892SDmitry Monakhov * 42712e9b892SDmitry Monakhov * It's not paranoia if the Murphy's Law really *is* out to get you. :-) 42812e9b892SDmitry Monakhov */ 42912e9b892SDmitry Monakhov static inline void ext4_check_flag_values(void) 43012e9b892SDmitry Monakhov { 43112e9b892SDmitry Monakhov CHECK_FLAG_VALUE(SECRM); 43212e9b892SDmitry Monakhov CHECK_FLAG_VALUE(UNRM); 43312e9b892SDmitry Monakhov CHECK_FLAG_VALUE(COMPR); 43412e9b892SDmitry Monakhov CHECK_FLAG_VALUE(SYNC); 43512e9b892SDmitry Monakhov CHECK_FLAG_VALUE(IMMUTABLE); 43612e9b892SDmitry Monakhov CHECK_FLAG_VALUE(APPEND); 43712e9b892SDmitry Monakhov CHECK_FLAG_VALUE(NODUMP); 43812e9b892SDmitry Monakhov CHECK_FLAG_VALUE(NOATIME); 43912e9b892SDmitry Monakhov CHECK_FLAG_VALUE(DIRTY); 44012e9b892SDmitry Monakhov CHECK_FLAG_VALUE(COMPRBLK); 44112e9b892SDmitry Monakhov CHECK_FLAG_VALUE(NOCOMPR); 44212e9b892SDmitry Monakhov CHECK_FLAG_VALUE(ECOMPR); 44312e9b892SDmitry Monakhov CHECK_FLAG_VALUE(INDEX); 44412e9b892SDmitry Monakhov CHECK_FLAG_VALUE(IMAGIC); 44512e9b892SDmitry Monakhov CHECK_FLAG_VALUE(JOURNAL_DATA); 44612e9b892SDmitry Monakhov CHECK_FLAG_VALUE(NOTAIL); 44712e9b892SDmitry Monakhov CHECK_FLAG_VALUE(DIRSYNC); 44812e9b892SDmitry Monakhov CHECK_FLAG_VALUE(TOPDIR); 44912e9b892SDmitry Monakhov CHECK_FLAG_VALUE(HUGE_FILE); 45012e9b892SDmitry Monakhov CHECK_FLAG_VALUE(EXTENTS); 45112e9b892SDmitry Monakhov CHECK_FLAG_VALUE(EA_INODE); 45212e9b892SDmitry Monakhov CHECK_FLAG_VALUE(EOFBLOCKS); 45312e9b892SDmitry Monakhov CHECK_FLAG_VALUE(RESERVED); 45412e9b892SDmitry Monakhov } 45512e9b892SDmitry Monakhov 4563dcf5451SChristoph Hellwig /* Used to pass group descriptor data when online resize is done */ 4573dcf5451SChristoph Hellwig struct ext4_new_group_input { 4583dcf5451SChristoph Hellwig __u32 group; /* Group number for this data */ 4593dcf5451SChristoph Hellwig __u64 block_bitmap; /* Absolute block number of block bitmap */ 4603dcf5451SChristoph Hellwig __u64 inode_bitmap; /* Absolute block number of inode bitmap */ 4613dcf5451SChristoph Hellwig __u64 inode_table; /* Absolute block number of inode table start */ 4623dcf5451SChristoph Hellwig __u32 blocks_count; /* Total number of blocks in this group */ 4633dcf5451SChristoph Hellwig __u16 reserved_blocks; /* Number of reserved blocks in this group */ 4643dcf5451SChristoph Hellwig __u16 unused; 4653dcf5451SChristoph Hellwig }; 4663dcf5451SChristoph Hellwig 4674d92dc0fSBen Hutchings #if defined(__KERNEL__) && defined(CONFIG_COMPAT) 4684d92dc0fSBen Hutchings struct compat_ext4_new_group_input { 4694d92dc0fSBen Hutchings u32 group; 4704d92dc0fSBen Hutchings compat_u64 block_bitmap; 4714d92dc0fSBen Hutchings compat_u64 inode_bitmap; 4724d92dc0fSBen Hutchings compat_u64 inode_table; 4734d92dc0fSBen Hutchings u32 blocks_count; 4744d92dc0fSBen Hutchings u16 reserved_blocks; 4754d92dc0fSBen Hutchings u16 unused; 4764d92dc0fSBen Hutchings }; 4774d92dc0fSBen Hutchings #endif 4784d92dc0fSBen Hutchings 4793dcf5451SChristoph Hellwig /* The struct ext4_new_group_input in kernel space, with free_blocks_count */ 4803dcf5451SChristoph Hellwig struct ext4_new_group_data { 4813dcf5451SChristoph Hellwig __u32 group; 4823dcf5451SChristoph Hellwig __u64 block_bitmap; 4833dcf5451SChristoph Hellwig __u64 inode_bitmap; 4843dcf5451SChristoph Hellwig __u64 inode_table; 4853dcf5451SChristoph Hellwig __u32 blocks_count; 4863dcf5451SChristoph Hellwig __u16 reserved_blocks; 4873dcf5451SChristoph Hellwig __u16 unused; 4883dcf5451SChristoph Hellwig __u32 free_blocks_count; 4893dcf5451SChristoph Hellwig }; 4903dcf5451SChristoph Hellwig 4913dcf5451SChristoph Hellwig /* 49279e83036SEric Sandeen * Flags used by ext4_map_blocks() 4933dcf5451SChristoph Hellwig */ 494c2177057STheodore Ts'o /* Allocate any needed blocks and/or convert an unitialized 495c2177057STheodore Ts'o extent to be an initialized ext4 */ 4962ac3b6e0STheodore Ts'o #define EXT4_GET_BLOCKS_CREATE 0x0001 497c2177057STheodore Ts'o /* Request the creation of an unitialized extent */ 4982ac3b6e0STheodore Ts'o #define EXT4_GET_BLOCKS_UNINIT_EXT 0x0002 499c2177057STheodore Ts'o #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ 500c2177057STheodore Ts'o EXT4_GET_BLOCKS_CREATE) 501c2177057STheodore Ts'o /* Caller is from the delayed allocation writeout path, 5022ac3b6e0STheodore Ts'o so set the magic i_delalloc_reserve_flag after taking the 5032ac3b6e0STheodore Ts'o inode allocation semaphore for */ 50403f5d8bcSJan Kara #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004 5050031462bSMingming Cao /* caller is from the direct IO path, request to creation of an 5060031462bSMingming Cao unitialized extents if not allocated, split the uninitialized 5070031462bSMingming Cao extent if blocks has been preallocated already*/ 508c7064ef1SJiaying Zhang #define EXT4_GET_BLOCKS_PRE_IO 0x0008 5091296cc85SAneesh Kumar K.V #define EXT4_GET_BLOCKS_CONVERT 0x0010 510c7064ef1SJiaying Zhang #define EXT4_GET_BLOCKS_IO_CREATE_EXT (EXT4_GET_BLOCKS_PRE_IO|\ 5110031462bSMingming Cao EXT4_GET_BLOCKS_CREATE_UNINIT_EXT) 512c7064ef1SJiaying Zhang /* Convert extent to initialized after IO complete */ 513c7064ef1SJiaying Zhang #define EXT4_GET_BLOCKS_IO_CONVERT_EXT (EXT4_GET_BLOCKS_CONVERT|\ 514744692dcSJiaying Zhang EXT4_GET_BLOCKS_CREATE_UNINIT_EXT) 5153dcf5451SChristoph Hellwig 5163dcf5451SChristoph Hellwig /* 517e6362609STheodore Ts'o * Flags used by ext4_free_blocks 518e6362609STheodore Ts'o */ 519e6362609STheodore Ts'o #define EXT4_FREE_BLOCKS_METADATA 0x0001 520e6362609STheodore Ts'o #define EXT4_FREE_BLOCKS_FORGET 0x0002 5211f2acb60STheodore Ts'o #define EXT4_FREE_BLOCKS_VALIDATED 0x0004 522e6362609STheodore Ts'o 523e6362609STheodore Ts'o /* 5243dcf5451SChristoph Hellwig * ioctl commands 5253dcf5451SChristoph Hellwig */ 5263dcf5451SChristoph Hellwig #define EXT4_IOC_GETFLAGS FS_IOC_GETFLAGS 5273dcf5451SChristoph Hellwig #define EXT4_IOC_SETFLAGS FS_IOC_SETFLAGS 5283dcf5451SChristoph Hellwig #define EXT4_IOC_GETVERSION _IOR('f', 3, long) 5293dcf5451SChristoph Hellwig #define EXT4_IOC_SETVERSION _IOW('f', 4, long) 5303dcf5451SChristoph Hellwig #define EXT4_IOC_GETVERSION_OLD FS_IOC_GETVERSION 5313dcf5451SChristoph Hellwig #define EXT4_IOC_SETVERSION_OLD FS_IOC_SETVERSION 5323dcf5451SChristoph Hellwig #ifdef CONFIG_JBD2_DEBUG 5333dcf5451SChristoph Hellwig #define EXT4_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) 5343dcf5451SChristoph Hellwig #endif 5353dcf5451SChristoph Hellwig #define EXT4_IOC_GETRSVSZ _IOR('f', 5, long) 5363dcf5451SChristoph Hellwig #define EXT4_IOC_SETRSVSZ _IOW('f', 6, long) 5378eea80d5STheodore Ts'o #define EXT4_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long) 5388eea80d5STheodore Ts'o #define EXT4_IOC_GROUP_ADD _IOW('f', 8, struct ext4_new_group_input) 5398eea80d5STheodore Ts'o #define EXT4_IOC_MIGRATE _IO('f', 9) 540ccd2506bSTheodore Ts'o /* note ioctl 10 reserved for an early version of the FIEMAP ioctl */ 5418eea80d5STheodore Ts'o /* note ioctl 11 reserved for filesystem-independent FIEMAP ioctl */ 542ccd2506bSTheodore Ts'o #define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12) 543748de673SAkira Fujita #define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent) 5443dcf5451SChristoph Hellwig 545899ad0ceSBen Hutchings #if defined(__KERNEL__) && defined(CONFIG_COMPAT) 5463dcf5451SChristoph Hellwig /* 5473dcf5451SChristoph Hellwig * ioctl commands in 32 bit emulation 5483dcf5451SChristoph Hellwig */ 5493dcf5451SChristoph Hellwig #define EXT4_IOC32_GETFLAGS FS_IOC32_GETFLAGS 5503dcf5451SChristoph Hellwig #define EXT4_IOC32_SETFLAGS FS_IOC32_SETFLAGS 5513dcf5451SChristoph Hellwig #define EXT4_IOC32_GETVERSION _IOR('f', 3, int) 5523dcf5451SChristoph Hellwig #define EXT4_IOC32_SETVERSION _IOW('f', 4, int) 5533dcf5451SChristoph Hellwig #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) 5543dcf5451SChristoph Hellwig #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) 5553dcf5451SChristoph Hellwig #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) 5564d92dc0fSBen Hutchings #define EXT4_IOC32_GROUP_ADD _IOW('f', 8, struct compat_ext4_new_group_input) 5573dcf5451SChristoph Hellwig #ifdef CONFIG_JBD2_DEBUG 5583dcf5451SChristoph Hellwig #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) 5593dcf5451SChristoph Hellwig #endif 5603dcf5451SChristoph Hellwig #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION 5613dcf5451SChristoph Hellwig #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION 562899ad0ceSBen Hutchings #endif 5633dcf5451SChristoph Hellwig 5643dcf5451SChristoph Hellwig 5653dcf5451SChristoph Hellwig /* 5663dcf5451SChristoph Hellwig * Mount options 5673dcf5451SChristoph Hellwig */ 5683dcf5451SChristoph Hellwig struct ext4_mount_options { 5693dcf5451SChristoph Hellwig unsigned long s_mount_opt; 5703dcf5451SChristoph Hellwig uid_t s_resuid; 5713dcf5451SChristoph Hellwig gid_t s_resgid; 5723dcf5451SChristoph Hellwig unsigned long s_commit_interval; 57330773840STheodore Ts'o u32 s_min_batch_time, s_max_batch_time; 5743dcf5451SChristoph Hellwig #ifdef CONFIG_QUOTA 5753dcf5451SChristoph Hellwig int s_jquota_fmt; 5763dcf5451SChristoph Hellwig char *s_qf_names[MAXQUOTAS]; 5773dcf5451SChristoph Hellwig #endif 5783dcf5451SChristoph Hellwig }; 5793dcf5451SChristoph Hellwig 580fb0a387dSEric Sandeen /* Max physical block we can addres w/o extents */ 581fb0a387dSEric Sandeen #define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF 582fb0a387dSEric Sandeen 5833dcf5451SChristoph Hellwig /* 5843dcf5451SChristoph Hellwig * Structure of an inode on the disk 5853dcf5451SChristoph Hellwig */ 5863dcf5451SChristoph Hellwig struct ext4_inode { 5873dcf5451SChristoph Hellwig __le16 i_mode; /* File mode */ 5883dcf5451SChristoph Hellwig __le16 i_uid; /* Low 16 bits of Owner Uid */ 5893dcf5451SChristoph Hellwig __le32 i_size_lo; /* Size in bytes */ 5903dcf5451SChristoph Hellwig __le32 i_atime; /* Access time */ 5913dcf5451SChristoph Hellwig __le32 i_ctime; /* Inode Change time */ 5923dcf5451SChristoph Hellwig __le32 i_mtime; /* Modification time */ 5933dcf5451SChristoph Hellwig __le32 i_dtime; /* Deletion Time */ 5943dcf5451SChristoph Hellwig __le16 i_gid; /* Low 16 bits of Group Id */ 5953dcf5451SChristoph Hellwig __le16 i_links_count; /* Links count */ 5963dcf5451SChristoph Hellwig __le32 i_blocks_lo; /* Blocks count */ 5973dcf5451SChristoph Hellwig __le32 i_flags; /* File flags */ 5983dcf5451SChristoph Hellwig union { 5993dcf5451SChristoph Hellwig struct { 6003dcf5451SChristoph Hellwig __le32 l_i_version; 6013dcf5451SChristoph Hellwig } linux1; 6023dcf5451SChristoph Hellwig struct { 6033dcf5451SChristoph Hellwig __u32 h_i_translator; 6043dcf5451SChristoph Hellwig } hurd1; 6053dcf5451SChristoph Hellwig struct { 6063dcf5451SChristoph Hellwig __u32 m_i_reserved1; 6073dcf5451SChristoph Hellwig } masix1; 6083dcf5451SChristoph Hellwig } osd1; /* OS dependent 1 */ 6093dcf5451SChristoph Hellwig __le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */ 6103dcf5451SChristoph Hellwig __le32 i_generation; /* File version (for NFS) */ 6113dcf5451SChristoph Hellwig __le32 i_file_acl_lo; /* File ACL */ 6123dcf5451SChristoph Hellwig __le32 i_size_high; 6133dcf5451SChristoph Hellwig __le32 i_obso_faddr; /* Obsoleted fragment address */ 6143dcf5451SChristoph Hellwig union { 6153dcf5451SChristoph Hellwig struct { 6163dcf5451SChristoph Hellwig __le16 l_i_blocks_high; /* were l_i_reserved1 */ 6173dcf5451SChristoph Hellwig __le16 l_i_file_acl_high; 6183dcf5451SChristoph Hellwig __le16 l_i_uid_high; /* these 2 fields */ 6193dcf5451SChristoph Hellwig __le16 l_i_gid_high; /* were reserved2[0] */ 6203dcf5451SChristoph Hellwig __u32 l_i_reserved2; 6213dcf5451SChristoph Hellwig } linux2; 6223dcf5451SChristoph Hellwig struct { 6233dcf5451SChristoph Hellwig __le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */ 6243dcf5451SChristoph Hellwig __u16 h_i_mode_high; 6253dcf5451SChristoph Hellwig __u16 h_i_uid_high; 6263dcf5451SChristoph Hellwig __u16 h_i_gid_high; 6273dcf5451SChristoph Hellwig __u32 h_i_author; 6283dcf5451SChristoph Hellwig } hurd2; 6293dcf5451SChristoph Hellwig struct { 6303dcf5451SChristoph Hellwig __le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */ 6313dcf5451SChristoph Hellwig __le16 m_i_file_acl_high; 6323dcf5451SChristoph Hellwig __u32 m_i_reserved2[2]; 6333dcf5451SChristoph Hellwig } masix2; 6343dcf5451SChristoph Hellwig } osd2; /* OS dependent 2 */ 6353dcf5451SChristoph Hellwig __le16 i_extra_isize; 6363dcf5451SChristoph Hellwig __le16 i_pad1; 6373dcf5451SChristoph Hellwig __le32 i_ctime_extra; /* extra Change time (nsec << 2 | epoch) */ 6383dcf5451SChristoph Hellwig __le32 i_mtime_extra; /* extra Modification time(nsec << 2 | epoch) */ 6393dcf5451SChristoph Hellwig __le32 i_atime_extra; /* extra Access time (nsec << 2 | epoch) */ 6403dcf5451SChristoph Hellwig __le32 i_crtime; /* File Creation time */ 6413dcf5451SChristoph Hellwig __le32 i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */ 6423dcf5451SChristoph Hellwig __le32 i_version_hi; /* high 32 bits for 64-bit version */ 6433dcf5451SChristoph Hellwig }; 6443dcf5451SChristoph Hellwig 645748de673SAkira Fujita struct move_extent { 646748de673SAkira Fujita __u32 reserved; /* should be zero */ 647748de673SAkira Fujita __u32 donor_fd; /* donor file descriptor */ 648748de673SAkira Fujita __u64 orig_start; /* logical start offset in block for orig */ 649748de673SAkira Fujita __u64 donor_start; /* logical start offset in block for donor */ 650748de673SAkira Fujita __u64 len; /* block length to be moved */ 651748de673SAkira Fujita __u64 moved_len; /* moved block length */ 652748de673SAkira Fujita }; 6533dcf5451SChristoph Hellwig 6543dcf5451SChristoph Hellwig #define EXT4_EPOCH_BITS 2 6553dcf5451SChristoph Hellwig #define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1) 6563dcf5451SChristoph Hellwig #define EXT4_NSEC_MASK (~0UL << EXT4_EPOCH_BITS) 6573dcf5451SChristoph Hellwig 6583dcf5451SChristoph Hellwig /* 6593dcf5451SChristoph Hellwig * Extended fields will fit into an inode if the filesystem was formatted 6603dcf5451SChristoph Hellwig * with large inodes (-I 256 or larger) and there are not currently any EAs 6613dcf5451SChristoph Hellwig * consuming all of the available space. For new inodes we always reserve 6623dcf5451SChristoph Hellwig * enough space for the kernel's known extended fields, but for inodes 6633dcf5451SChristoph Hellwig * created with an old kernel this might not have been the case. None of 6643dcf5451SChristoph Hellwig * the extended inode fields is critical for correct filesystem operation. 6653dcf5451SChristoph Hellwig * This macro checks if a certain field fits in the inode. Note that 6663dcf5451SChristoph Hellwig * inode-size = GOOD_OLD_INODE_SIZE + i_extra_isize 6673dcf5451SChristoph Hellwig */ 6683dcf5451SChristoph Hellwig #define EXT4_FITS_IN_INODE(ext4_inode, einode, field) \ 6693dcf5451SChristoph Hellwig ((offsetof(typeof(*ext4_inode), field) + \ 6703dcf5451SChristoph Hellwig sizeof((ext4_inode)->field)) \ 6713dcf5451SChristoph Hellwig <= (EXT4_GOOD_OLD_INODE_SIZE + \ 6723dcf5451SChristoph Hellwig (einode)->i_extra_isize)) \ 6733dcf5451SChristoph Hellwig 6743dcf5451SChristoph Hellwig static inline __le32 ext4_encode_extra_time(struct timespec *time) 6753dcf5451SChristoph Hellwig { 6763dcf5451SChristoph Hellwig return cpu_to_le32((sizeof(time->tv_sec) > 4 ? 677c1fccc06STheodore Ts'o (time->tv_sec >> 32) & EXT4_EPOCH_MASK : 0) | 678c1fccc06STheodore Ts'o ((time->tv_nsec << EXT4_EPOCH_BITS) & EXT4_NSEC_MASK)); 6793dcf5451SChristoph Hellwig } 6803dcf5451SChristoph Hellwig 6813dcf5451SChristoph Hellwig static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) 6823dcf5451SChristoph Hellwig { 6833dcf5451SChristoph Hellwig if (sizeof(time->tv_sec) > 4) 6843dcf5451SChristoph Hellwig time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) 6853dcf5451SChristoph Hellwig << 32; 686c1fccc06STheodore Ts'o time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; 6873dcf5451SChristoph Hellwig } 6883dcf5451SChristoph Hellwig 6893dcf5451SChristoph Hellwig #define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \ 6903dcf5451SChristoph Hellwig do { \ 6913dcf5451SChristoph Hellwig (raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec); \ 6923dcf5451SChristoph Hellwig if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) \ 6933dcf5451SChristoph Hellwig (raw_inode)->xtime ## _extra = \ 6943dcf5451SChristoph Hellwig ext4_encode_extra_time(&(inode)->xtime); \ 6953dcf5451SChristoph Hellwig } while (0) 6963dcf5451SChristoph Hellwig 6973dcf5451SChristoph Hellwig #define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode) \ 6983dcf5451SChristoph Hellwig do { \ 6993dcf5451SChristoph Hellwig if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \ 7003dcf5451SChristoph Hellwig (raw_inode)->xtime = cpu_to_le32((einode)->xtime.tv_sec); \ 7013dcf5451SChristoph Hellwig if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \ 7023dcf5451SChristoph Hellwig (raw_inode)->xtime ## _extra = \ 7033dcf5451SChristoph Hellwig ext4_encode_extra_time(&(einode)->xtime); \ 7043dcf5451SChristoph Hellwig } while (0) 7053dcf5451SChristoph Hellwig 7063dcf5451SChristoph Hellwig #define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode) \ 7073dcf5451SChristoph Hellwig do { \ 7083dcf5451SChristoph Hellwig (inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime); \ 7093dcf5451SChristoph Hellwig if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) \ 7103dcf5451SChristoph Hellwig ext4_decode_extra_time(&(inode)->xtime, \ 7113dcf5451SChristoph Hellwig raw_inode->xtime ## _extra); \ 7123dcf5451SChristoph Hellwig } while (0) 7133dcf5451SChristoph Hellwig 7143dcf5451SChristoph Hellwig #define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \ 7153dcf5451SChristoph Hellwig do { \ 7163dcf5451SChristoph Hellwig if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \ 7173dcf5451SChristoph Hellwig (einode)->xtime.tv_sec = \ 7183dcf5451SChristoph Hellwig (signed)le32_to_cpu((raw_inode)->xtime); \ 7193dcf5451SChristoph Hellwig if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \ 7203dcf5451SChristoph Hellwig ext4_decode_extra_time(&(einode)->xtime, \ 7213dcf5451SChristoph Hellwig raw_inode->xtime ## _extra); \ 7223dcf5451SChristoph Hellwig } while (0) 7233dcf5451SChristoph Hellwig 7243dcf5451SChristoph Hellwig #define i_disk_version osd1.linux1.l_i_version 7253dcf5451SChristoph Hellwig 7263dcf5451SChristoph Hellwig #if defined(__KERNEL__) || defined(__linux__) 7273dcf5451SChristoph Hellwig #define i_reserved1 osd1.linux1.l_i_reserved1 7283dcf5451SChristoph Hellwig #define i_file_acl_high osd2.linux2.l_i_file_acl_high 7293dcf5451SChristoph Hellwig #define i_blocks_high osd2.linux2.l_i_blocks_high 7303dcf5451SChristoph Hellwig #define i_uid_low i_uid 7313dcf5451SChristoph Hellwig #define i_gid_low i_gid 7323dcf5451SChristoph Hellwig #define i_uid_high osd2.linux2.l_i_uid_high 7333dcf5451SChristoph Hellwig #define i_gid_high osd2.linux2.l_i_gid_high 7343dcf5451SChristoph Hellwig #define i_reserved2 osd2.linux2.l_i_reserved2 7353dcf5451SChristoph Hellwig 7363dcf5451SChristoph Hellwig #elif defined(__GNU__) 7373dcf5451SChristoph Hellwig 7383dcf5451SChristoph Hellwig #define i_translator osd1.hurd1.h_i_translator 7393dcf5451SChristoph Hellwig #define i_uid_high osd2.hurd2.h_i_uid_high 7403dcf5451SChristoph Hellwig #define i_gid_high osd2.hurd2.h_i_gid_high 7413dcf5451SChristoph Hellwig #define i_author osd2.hurd2.h_i_author 7423dcf5451SChristoph Hellwig 7433dcf5451SChristoph Hellwig #elif defined(__masix__) 7443dcf5451SChristoph Hellwig 7453dcf5451SChristoph Hellwig #define i_reserved1 osd1.masix1.m_i_reserved1 7463dcf5451SChristoph Hellwig #define i_file_acl_high osd2.masix2.m_i_file_acl_high 7473dcf5451SChristoph Hellwig #define i_reserved2 osd2.masix2.m_i_reserved2 7483dcf5451SChristoph Hellwig 7493dcf5451SChristoph Hellwig #endif /* defined(__KERNEL__) || defined(__linux__) */ 7503dcf5451SChristoph Hellwig 7513dcf5451SChristoph Hellwig /* 752d444c3c3STheodore Ts'o * storage for cached extent 753d444c3c3STheodore Ts'o */ 754d444c3c3STheodore Ts'o struct ext4_ext_cache { 755d444c3c3STheodore Ts'o ext4_fsblk_t ec_start; 756d444c3c3STheodore Ts'o ext4_lblk_t ec_block; 757d444c3c3STheodore Ts'o __u32 ec_len; /* must be 32bit to return holes */ 758d444c3c3STheodore Ts'o __u32 ec_type; 759d444c3c3STheodore Ts'o }; 760d444c3c3STheodore Ts'o 761d444c3c3STheodore Ts'o /* 762d444c3c3STheodore Ts'o * fourth extended file system inode data in memory 763d444c3c3STheodore Ts'o */ 764d444c3c3STheodore Ts'o struct ext4_inode_info { 765d444c3c3STheodore Ts'o __le32 i_data[15]; /* unconverted */ 766d444c3c3STheodore Ts'o __u32 i_dtime; 76712e9b892SDmitry Monakhov ext4_fsblk_t i_file_acl; 768d444c3c3STheodore Ts'o 769d444c3c3STheodore Ts'o /* 770d444c3c3STheodore Ts'o * i_block_group is the number of the block group which contains 771d444c3c3STheodore Ts'o * this file's inode. Constant across the lifetime of the inode, 772d444c3c3STheodore Ts'o * it is ued for making block allocation decisions - we try to 773d444c3c3STheodore Ts'o * place a file's data blocks near its inode block, and new inodes 774d444c3c3STheodore Ts'o * near to their parent directory's inode. 775d444c3c3STheodore Ts'o */ 776d444c3c3STheodore Ts'o ext4_group_t i_block_group; 77719f5fb7aSTheodore Ts'o unsigned long i_state_flags; /* Dynamic state flags */ 77812e9b892SDmitry Monakhov unsigned long i_flags; 779d444c3c3STheodore Ts'o 780d444c3c3STheodore Ts'o ext4_lblk_t i_dir_start_lookup; 781d444c3c3STheodore Ts'o #ifdef CONFIG_EXT4_FS_XATTR 782d444c3c3STheodore Ts'o /* 783d444c3c3STheodore Ts'o * Extended attributes can be read independently of the main file 784d444c3c3STheodore Ts'o * data. Taking i_mutex even when reading would cause contention 785d444c3c3STheodore Ts'o * between readers of EAs and writers of regular file data, so 786d444c3c3STheodore Ts'o * instead we synchronize on xattr_sem when reading or changing 787d444c3c3STheodore Ts'o * EAs. 788d444c3c3STheodore Ts'o */ 789d444c3c3STheodore Ts'o struct rw_semaphore xattr_sem; 790d444c3c3STheodore Ts'o #endif 791d444c3c3STheodore Ts'o 792d444c3c3STheodore Ts'o struct list_head i_orphan; /* unlinked but open inodes */ 793d444c3c3STheodore Ts'o 794d444c3c3STheodore Ts'o /* 795d444c3c3STheodore Ts'o * i_disksize keeps track of what the inode size is ON DISK, not 796d444c3c3STheodore Ts'o * in memory. During truncate, i_size is set to the new size by 797d444c3c3STheodore Ts'o * the VFS prior to calling ext4_truncate(), but the filesystem won't 798d444c3c3STheodore Ts'o * set i_disksize to 0 until the truncate is actually under way. 799d444c3c3STheodore Ts'o * 800d444c3c3STheodore Ts'o * The intent is that i_disksize always represents the blocks which 801d444c3c3STheodore Ts'o * are used by this file. This allows recovery to restart truncate 802d444c3c3STheodore Ts'o * on orphans if we crash during truncate. We actually write i_disksize 803d444c3c3STheodore Ts'o * into the on-disk inode when writing inodes out, instead of i_size. 804d444c3c3STheodore Ts'o * 805d444c3c3STheodore Ts'o * The only time when i_disksize and i_size may be different is when 806d444c3c3STheodore Ts'o * a truncate is in progress. The only things which change i_disksize 807d444c3c3STheodore Ts'o * are ext4_get_block (growth) and ext4_truncate (shrinkth). 808d444c3c3STheodore Ts'o */ 809d444c3c3STheodore Ts'o loff_t i_disksize; 810d444c3c3STheodore Ts'o 811d444c3c3STheodore Ts'o /* 812d444c3c3STheodore Ts'o * i_data_sem is for serialising ext4_truncate() against 813d444c3c3STheodore Ts'o * ext4_getblock(). In the 2.4 ext2 design, great chunks of inode's 814d444c3c3STheodore Ts'o * data tree are chopped off during truncate. We can't do that in 815d444c3c3STheodore Ts'o * ext4 because whenever we perform intermediate commits during 816d444c3c3STheodore Ts'o * truncate, the inode and all the metadata blocks *must* be in a 817d444c3c3STheodore Ts'o * consistent state which allows truncation of the orphans to restart 818d444c3c3STheodore Ts'o * during recovery. Hence we must fix the get_block-vs-truncate race 819d444c3c3STheodore Ts'o * by other means, so we have i_data_sem. 820d444c3c3STheodore Ts'o */ 821d444c3c3STheodore Ts'o struct rw_semaphore i_data_sem; 822d444c3c3STheodore Ts'o struct inode vfs_inode; 823d444c3c3STheodore Ts'o struct jbd2_inode jinode; 824d444c3c3STheodore Ts'o 825d444c3c3STheodore Ts'o struct ext4_ext_cache i_cached_extent; 826d444c3c3STheodore Ts'o /* 827d444c3c3STheodore Ts'o * File creation time. Its function is same as that of 828d444c3c3STheodore Ts'o * struct timespec i_{a,c,m}time in the generic inode. 829d444c3c3STheodore Ts'o */ 830d444c3c3STheodore Ts'o struct timespec i_crtime; 831d444c3c3STheodore Ts'o 832d444c3c3STheodore Ts'o /* mballoc */ 833d444c3c3STheodore Ts'o struct list_head i_prealloc_list; 834d444c3c3STheodore Ts'o spinlock_t i_prealloc_lock; 835d444c3c3STheodore Ts'o 836d444c3c3STheodore Ts'o /* ialloc */ 837d444c3c3STheodore Ts'o ext4_group_t i_last_alloc_group; 838d444c3c3STheodore Ts'o 839d444c3c3STheodore Ts'o /* allocation reservation info for delalloc */ 840d444c3c3STheodore Ts'o unsigned int i_reserved_data_blocks; 841d444c3c3STheodore Ts'o unsigned int i_reserved_meta_blocks; 842d444c3c3STheodore Ts'o unsigned int i_allocated_meta_blocks; 843d444c3c3STheodore Ts'o unsigned short i_delalloc_reserved_flag; 8449d0be502STheodore Ts'o sector_t i_da_metadata_calc_last_lblock; 8459d0be502STheodore Ts'o int i_da_metadata_calc_len; 846d444c3c3STheodore Ts'o 847d444c3c3STheodore Ts'o /* on-disk additional length */ 848d444c3c3STheodore Ts'o __u16 i_extra_isize; 849d444c3c3STheodore Ts'o 850d444c3c3STheodore Ts'o spinlock_t i_block_reservation_lock; 851a9e7f447SDmitry Monakhov #ifdef CONFIG_QUOTA 852a9e7f447SDmitry Monakhov /* quota space reservation, managed internally by quota code */ 853a9e7f447SDmitry Monakhov qsize_t i_reserved_quota; 854a9e7f447SDmitry Monakhov #endif 8558d5d02e6SMingming Cao 856c7064ef1SJiaying Zhang /* completed IOs that might need unwritten extents handling */ 857c7064ef1SJiaying Zhang struct list_head i_completed_io_list; 858744692dcSJiaying Zhang spinlock_t i_completed_io_lock; 8598d5d02e6SMingming Cao /* current io_end structure for async DIO write*/ 8608d5d02e6SMingming Cao ext4_io_end_t *cur_aio_dio; 861f7ad6d2eSTheodore Ts'o atomic_t i_ioend_count; /* Number of outstanding io_end structs */ 862b436b9beSJan Kara 863b436b9beSJan Kara /* 864b436b9beSJan Kara * Transactions that contain inode's metadata needed to complete 865b436b9beSJan Kara * fsync and fdatasync, respectively. 866b436b9beSJan Kara */ 867b436b9beSJan Kara tid_t i_sync_tid; 868b436b9beSJan Kara tid_t i_datasync_tid; 869d444c3c3STheodore Ts'o }; 870d444c3c3STheodore Ts'o 871d444c3c3STheodore Ts'o /* 8723dcf5451SChristoph Hellwig * File system states 8733dcf5451SChristoph Hellwig */ 8743dcf5451SChristoph Hellwig #define EXT4_VALID_FS 0x0001 /* Unmounted cleanly */ 8753dcf5451SChristoph Hellwig #define EXT4_ERROR_FS 0x0002 /* Errors detected */ 8763dcf5451SChristoph Hellwig #define EXT4_ORPHAN_FS 0x0004 /* Orphans being recovered */ 8773dcf5451SChristoph Hellwig 8783dcf5451SChristoph Hellwig /* 8793dcf5451SChristoph Hellwig * Misc. filesystem flags 8803dcf5451SChristoph Hellwig */ 8813dcf5451SChristoph Hellwig #define EXT2_FLAGS_SIGNED_HASH 0x0001 /* Signed dirhash in use */ 8823dcf5451SChristoph Hellwig #define EXT2_FLAGS_UNSIGNED_HASH 0x0002 /* Unsigned dirhash in use */ 8833dcf5451SChristoph Hellwig #define EXT2_FLAGS_TEST_FILESYS 0x0004 /* to test development code */ 8843dcf5451SChristoph Hellwig 8853dcf5451SChristoph Hellwig /* 8863dcf5451SChristoph Hellwig * Mount flags 8873dcf5451SChristoph Hellwig */ 8883dcf5451SChristoph Hellwig #define EXT4_MOUNT_OLDALLOC 0x00002 /* Don't use the new Orlov allocator */ 8893dcf5451SChristoph Hellwig #define EXT4_MOUNT_GRPID 0x00004 /* Create files with directory's group */ 8903dcf5451SChristoph Hellwig #define EXT4_MOUNT_DEBUG 0x00008 /* Some debugging messages */ 8913dcf5451SChristoph Hellwig #define EXT4_MOUNT_ERRORS_CONT 0x00010 /* Continue on errors */ 8923dcf5451SChristoph Hellwig #define EXT4_MOUNT_ERRORS_RO 0x00020 /* Remount fs ro on errors */ 8933dcf5451SChristoph Hellwig #define EXT4_MOUNT_ERRORS_PANIC 0x00040 /* Panic on errors */ 8943dcf5451SChristoph Hellwig #define EXT4_MOUNT_MINIX_DF 0x00080 /* Mimics the Minix statfs */ 8953dcf5451SChristoph Hellwig #define EXT4_MOUNT_NOLOAD 0x00100 /* Don't use existing journal*/ 8963dcf5451SChristoph Hellwig #define EXT4_MOUNT_DATA_FLAGS 0x00C00 /* Mode for data writes: */ 8973dcf5451SChristoph Hellwig #define EXT4_MOUNT_JOURNAL_DATA 0x00400 /* Write data to journal */ 8983dcf5451SChristoph Hellwig #define EXT4_MOUNT_ORDERED_DATA 0x00800 /* Flush data before commit */ 8993dcf5451SChristoph Hellwig #define EXT4_MOUNT_WRITEBACK_DATA 0x00C00 /* No data ordering */ 9003dcf5451SChristoph Hellwig #define EXT4_MOUNT_UPDATE_JOURNAL 0x01000 /* Update the journal format */ 9013dcf5451SChristoph Hellwig #define EXT4_MOUNT_NO_UID32 0x02000 /* Disable 32-bit UIDs */ 9023dcf5451SChristoph Hellwig #define EXT4_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */ 9033dcf5451SChristoph Hellwig #define EXT4_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ 904afd4672dSTheodore Ts'o #define EXT4_MOUNT_NO_AUTO_DA_ALLOC 0x10000 /* No auto delalloc mapping */ 9053dcf5451SChristoph Hellwig #define EXT4_MOUNT_BARRIER 0x20000 /* Use block barriers */ 9063dcf5451SChristoph Hellwig #define EXT4_MOUNT_QUOTA 0x80000 /* Some quota option set */ 9073dcf5451SChristoph Hellwig #define EXT4_MOUNT_USRQUOTA 0x100000 /* "old" user quota */ 9083dcf5451SChristoph Hellwig #define EXT4_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */ 909744692dcSJiaying Zhang #define EXT4_MOUNT_DIOREAD_NOLOCK 0x400000 /* Enable support for dio read nolocking */ 910d4da6c9cSLinus Torvalds #define EXT4_MOUNT_JOURNAL_CHECKSUM 0x800000 /* Journal checksums */ 9113dcf5451SChristoph Hellwig #define EXT4_MOUNT_JOURNAL_ASYNC_COMMIT 0x1000000 /* Journal Async Commit */ 9123dcf5451SChristoph Hellwig #define EXT4_MOUNT_I_VERSION 0x2000000 /* i_version support */ 9131449032bSTheodore Ts'o #define EXT4_MOUNT_MBLK_IO_SUBMIT 0x4000000 /* multi-block io submits */ 91464769240SAlex Tomas #define EXT4_MOUNT_DELALLOC 0x8000000 /* Delalloc support */ 9155bf5683aSHidehiro Kawai #define EXT4_MOUNT_DATA_ERR_ABORT 0x10000000 /* Abort on file data write */ 9166fd058f7STheodore Ts'o #define EXT4_MOUNT_BLOCK_VALIDITY 0x20000000 /* Block validity checking */ 9175328e635SEric Sandeen #define EXT4_MOUNT_DISCARD 0x40000000 /* Issue DISCARD requests */ 918bfff6873SLukas Czerner #define EXT4_MOUNT_INIT_INODE_TABLE 0x80000000 /* Initialize uninitialized itables */ 9195bf5683aSHidehiro Kawai 920fd8c37ecSTheodore Ts'o #define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \ 921fd8c37ecSTheodore Ts'o ~EXT4_MOUNT_##opt 922fd8c37ecSTheodore Ts'o #define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \ 923fd8c37ecSTheodore Ts'o EXT4_MOUNT_##opt 9243dcf5451SChristoph Hellwig #define test_opt(sb, opt) (EXT4_SB(sb)->s_mount_opt & \ 9253dcf5451SChristoph Hellwig EXT4_MOUNT_##opt) 9263dcf5451SChristoph Hellwig 9273dcf5451SChristoph Hellwig #define ext4_set_bit ext2_set_bit 9283dcf5451SChristoph Hellwig #define ext4_set_bit_atomic ext2_set_bit_atomic 9293dcf5451SChristoph Hellwig #define ext4_clear_bit ext2_clear_bit 9303dcf5451SChristoph Hellwig #define ext4_clear_bit_atomic ext2_clear_bit_atomic 9313dcf5451SChristoph Hellwig #define ext4_test_bit ext2_test_bit 9323dcf5451SChristoph Hellwig #define ext4_find_first_zero_bit ext2_find_first_zero_bit 9333dcf5451SChristoph Hellwig #define ext4_find_next_zero_bit ext2_find_next_zero_bit 9343dcf5451SChristoph Hellwig #define ext4_find_next_bit ext2_find_next_bit 9353dcf5451SChristoph Hellwig 9363dcf5451SChristoph Hellwig /* 9373dcf5451SChristoph Hellwig * Maximal mount counts between two filesystem checks 9383dcf5451SChristoph Hellwig */ 9393dcf5451SChristoph Hellwig #define EXT4_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */ 9403dcf5451SChristoph Hellwig #define EXT4_DFL_CHECKINTERVAL 0 /* Don't use interval check */ 9413dcf5451SChristoph Hellwig 9423dcf5451SChristoph Hellwig /* 9433dcf5451SChristoph Hellwig * Behaviour when detecting errors 9443dcf5451SChristoph Hellwig */ 9453dcf5451SChristoph Hellwig #define EXT4_ERRORS_CONTINUE 1 /* Continue execution */ 9463dcf5451SChristoph Hellwig #define EXT4_ERRORS_RO 2 /* Remount fs read-only */ 9473dcf5451SChristoph Hellwig #define EXT4_ERRORS_PANIC 3 /* Panic */ 9483dcf5451SChristoph Hellwig #define EXT4_ERRORS_DEFAULT EXT4_ERRORS_CONTINUE 9493dcf5451SChristoph Hellwig 9503dcf5451SChristoph Hellwig /* 9513dcf5451SChristoph Hellwig * Structure of the super block 9523dcf5451SChristoph Hellwig */ 9533dcf5451SChristoph Hellwig struct ext4_super_block { 9543dcf5451SChristoph Hellwig /*00*/ __le32 s_inodes_count; /* Inodes count */ 9553dcf5451SChristoph Hellwig __le32 s_blocks_count_lo; /* Blocks count */ 9563dcf5451SChristoph Hellwig __le32 s_r_blocks_count_lo; /* Reserved blocks count */ 9573dcf5451SChristoph Hellwig __le32 s_free_blocks_count_lo; /* Free blocks count */ 9583dcf5451SChristoph Hellwig /*10*/ __le32 s_free_inodes_count; /* Free inodes count */ 9593dcf5451SChristoph Hellwig __le32 s_first_data_block; /* First Data Block */ 9603dcf5451SChristoph Hellwig __le32 s_log_block_size; /* Block size */ 9613dcf5451SChristoph Hellwig __le32 s_obso_log_frag_size; /* Obsoleted fragment size */ 9623dcf5451SChristoph Hellwig /*20*/ __le32 s_blocks_per_group; /* # Blocks per group */ 9633dcf5451SChristoph Hellwig __le32 s_obso_frags_per_group; /* Obsoleted fragments per group */ 9643dcf5451SChristoph Hellwig __le32 s_inodes_per_group; /* # Inodes per group */ 9653dcf5451SChristoph Hellwig __le32 s_mtime; /* Mount time */ 9663dcf5451SChristoph Hellwig /*30*/ __le32 s_wtime; /* Write time */ 9673dcf5451SChristoph Hellwig __le16 s_mnt_count; /* Mount count */ 9683dcf5451SChristoph Hellwig __le16 s_max_mnt_count; /* Maximal mount count */ 9693dcf5451SChristoph Hellwig __le16 s_magic; /* Magic signature */ 9703dcf5451SChristoph Hellwig __le16 s_state; /* File system state */ 9713dcf5451SChristoph Hellwig __le16 s_errors; /* Behaviour when detecting errors */ 9723dcf5451SChristoph Hellwig __le16 s_minor_rev_level; /* minor revision level */ 9733dcf5451SChristoph Hellwig /*40*/ __le32 s_lastcheck; /* time of last check */ 9743dcf5451SChristoph Hellwig __le32 s_checkinterval; /* max. time between checks */ 9753dcf5451SChristoph Hellwig __le32 s_creator_os; /* OS */ 9763dcf5451SChristoph Hellwig __le32 s_rev_level; /* Revision level */ 9773dcf5451SChristoph Hellwig /*50*/ __le16 s_def_resuid; /* Default uid for reserved blocks */ 9783dcf5451SChristoph Hellwig __le16 s_def_resgid; /* Default gid for reserved blocks */ 9793dcf5451SChristoph Hellwig /* 9803dcf5451SChristoph Hellwig * These fields are for EXT4_DYNAMIC_REV superblocks only. 9813dcf5451SChristoph Hellwig * 9823dcf5451SChristoph Hellwig * Note: the difference between the compatible feature set and 9833dcf5451SChristoph Hellwig * the incompatible feature set is that if there is a bit set 9843dcf5451SChristoph Hellwig * in the incompatible feature set that the kernel doesn't 9853dcf5451SChristoph Hellwig * know about, it should refuse to mount the filesystem. 9863dcf5451SChristoph Hellwig * 9873dcf5451SChristoph Hellwig * e2fsck's requirements are more strict; if it doesn't know 9883dcf5451SChristoph Hellwig * about a feature in either the compatible or incompatible 9893dcf5451SChristoph Hellwig * feature set, it must abort and not try to meddle with 9903dcf5451SChristoph Hellwig * things it doesn't understand... 9913dcf5451SChristoph Hellwig */ 9923dcf5451SChristoph Hellwig __le32 s_first_ino; /* First non-reserved inode */ 9933dcf5451SChristoph Hellwig __le16 s_inode_size; /* size of inode structure */ 9943dcf5451SChristoph Hellwig __le16 s_block_group_nr; /* block group # of this superblock */ 9953dcf5451SChristoph Hellwig __le32 s_feature_compat; /* compatible feature set */ 9963dcf5451SChristoph Hellwig /*60*/ __le32 s_feature_incompat; /* incompatible feature set */ 9973dcf5451SChristoph Hellwig __le32 s_feature_ro_compat; /* readonly-compatible feature set */ 9983dcf5451SChristoph Hellwig /*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */ 9993dcf5451SChristoph Hellwig /*78*/ char s_volume_name[16]; /* volume name */ 10003dcf5451SChristoph Hellwig /*88*/ char s_last_mounted[64]; /* directory where last mounted */ 10013dcf5451SChristoph Hellwig /*C8*/ __le32 s_algorithm_usage_bitmap; /* For compression */ 10023dcf5451SChristoph Hellwig /* 10033dcf5451SChristoph Hellwig * Performance hints. Directory preallocation should only 10043dcf5451SChristoph Hellwig * happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on. 10053dcf5451SChristoph Hellwig */ 10063dcf5451SChristoph Hellwig __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ 10073dcf5451SChristoph Hellwig __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ 10083dcf5451SChristoph Hellwig __le16 s_reserved_gdt_blocks; /* Per group desc for online growth */ 10093dcf5451SChristoph Hellwig /* 10103dcf5451SChristoph Hellwig * Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set. 10113dcf5451SChristoph Hellwig */ 10123dcf5451SChristoph Hellwig /*D0*/ __u8 s_journal_uuid[16]; /* uuid of journal superblock */ 10133dcf5451SChristoph Hellwig /*E0*/ __le32 s_journal_inum; /* inode number of journal file */ 10143dcf5451SChristoph Hellwig __le32 s_journal_dev; /* device number of journal file */ 10153dcf5451SChristoph Hellwig __le32 s_last_orphan; /* start of list of inodes to delete */ 10163dcf5451SChristoph Hellwig __le32 s_hash_seed[4]; /* HTREE hash seed */ 10173dcf5451SChristoph Hellwig __u8 s_def_hash_version; /* Default hash version to use */ 101889eeddf0STheodore Ts'o __u8 s_jnl_backup_type; 10193dcf5451SChristoph Hellwig __le16 s_desc_size; /* size of group descriptor */ 10203dcf5451SChristoph Hellwig /*100*/ __le32 s_default_mount_opts; 10213dcf5451SChristoph Hellwig __le32 s_first_meta_bg; /* First metablock block group */ 10223dcf5451SChristoph Hellwig __le32 s_mkfs_time; /* When the filesystem was created */ 10233dcf5451SChristoph Hellwig __le32 s_jnl_blocks[17]; /* Backup of the journal inode */ 10243dcf5451SChristoph Hellwig /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */ 10253dcf5451SChristoph Hellwig /*150*/ __le32 s_blocks_count_hi; /* Blocks count */ 10263dcf5451SChristoph Hellwig __le32 s_r_blocks_count_hi; /* Reserved blocks count */ 10273dcf5451SChristoph Hellwig __le32 s_free_blocks_count_hi; /* Free blocks count */ 10283dcf5451SChristoph Hellwig __le16 s_min_extra_isize; /* All inodes have at least # bytes */ 10293dcf5451SChristoph Hellwig __le16 s_want_extra_isize; /* New inodes should reserve # bytes */ 10303dcf5451SChristoph Hellwig __le32 s_flags; /* Miscellaneous flags */ 10313dcf5451SChristoph Hellwig __le16 s_raid_stride; /* RAID stride */ 10323dcf5451SChristoph Hellwig __le16 s_mmp_interval; /* # seconds to wait in MMP checking */ 10333dcf5451SChristoph Hellwig __le64 s_mmp_block; /* Block for multi-mount protection */ 10343dcf5451SChristoph Hellwig __le32 s_raid_stripe_width; /* blocks on all data disks (N*stride)*/ 1035772cb7c8SJose R. Santos __u8 s_log_groups_per_flex; /* FLEX_BG group size */ 103689eeddf0STheodore Ts'o __u8 s_reserved_char_pad; 1037772cb7c8SJose R. Santos __le16 s_reserved_pad; 1038afc32f7eSTheodore Ts'o __le64 s_kbytes_written; /* nr of lifetime kilobytes written */ 10394a9cdec7STheodore Ts'o __le32 s_snapshot_inum; /* Inode number of active snapshot */ 10404a9cdec7STheodore Ts'o __le32 s_snapshot_id; /* sequential ID of active snapshot */ 10414a9cdec7STheodore Ts'o __le64 s_snapshot_r_blocks_count; /* reserved blocks for active 10424a9cdec7STheodore Ts'o snapshot's future use */ 10434a9cdec7STheodore Ts'o __le32 s_snapshot_list; /* inode number of the head of the 10444a9cdec7STheodore Ts'o on-disk snapshot list */ 10451c13d5c0STheodore Ts'o #define EXT4_S_ERR_START offsetof(struct ext4_super_block, s_error_count) 10461c13d5c0STheodore Ts'o __le32 s_error_count; /* number of fs errors */ 10471c13d5c0STheodore Ts'o __le32 s_first_error_time; /* first time an error happened */ 10481c13d5c0STheodore Ts'o __le32 s_first_error_ino; /* inode involved in first error */ 10491c13d5c0STheodore Ts'o __le64 s_first_error_block; /* block involved of first error */ 10501c13d5c0STheodore Ts'o __u8 s_first_error_func[32]; /* function where the error happened */ 10511c13d5c0STheodore Ts'o __le32 s_first_error_line; /* line number where error happened */ 10521c13d5c0STheodore Ts'o __le32 s_last_error_time; /* most recent time of an error */ 10531c13d5c0STheodore Ts'o __le32 s_last_error_ino; /* inode involved in last error */ 10541c13d5c0STheodore Ts'o __le32 s_last_error_line; /* line number where error happened */ 10551c13d5c0STheodore Ts'o __le64 s_last_error_block; /* block involved of last error */ 10561c13d5c0STheodore Ts'o __u8 s_last_error_func[32]; /* function where the error happened */ 10578b67f04aSTheodore Ts'o #define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts) 10588b67f04aSTheodore Ts'o __u8 s_mount_opts[64]; 10598b67f04aSTheodore Ts'o __le32 s_reserved[112]; /* Padding to the end of the block */ 10603dcf5451SChristoph Hellwig }; 10613dcf5451SChristoph Hellwig 10621c13d5c0STheodore Ts'o #define EXT4_S_ERR_LEN (EXT4_S_ERR_END - EXT4_S_ERR_START) 10631c13d5c0STheodore Ts'o 10643dcf5451SChristoph Hellwig #ifdef __KERNEL__ 1065bc0b0d6dSTheodore Ts'o 1066bc0b0d6dSTheodore Ts'o /* 10674ab2f15bSTheodore Ts'o * run-time mount flags 1068bc0b0d6dSTheodore Ts'o */ 1069bc0b0d6dSTheodore Ts'o #define EXT4_MF_MNTDIR_SAMPLED 0x0001 10704ab2f15bSTheodore Ts'o #define EXT4_MF_FS_ABORTED 0x0002 /* Fatal error detected */ 1071bc0b0d6dSTheodore Ts'o 1072ca0faba0STheodore Ts'o /* 1073ca0faba0STheodore Ts'o * fourth extended-fs super-block data in memory 1074ca0faba0STheodore Ts'o */ 1075ca0faba0STheodore Ts'o struct ext4_sb_info { 1076ca0faba0STheodore Ts'o unsigned long s_desc_size; /* Size of a group descriptor in bytes */ 1077ca0faba0STheodore Ts'o unsigned long s_inodes_per_block;/* Number of inodes per block */ 1078ca0faba0STheodore Ts'o unsigned long s_blocks_per_group;/* Number of blocks in a group */ 1079ca0faba0STheodore Ts'o unsigned long s_inodes_per_group;/* Number of inodes in a group */ 1080ca0faba0STheodore Ts'o unsigned long s_itb_per_group; /* Number of inode table blocks per group */ 1081ca0faba0STheodore Ts'o unsigned long s_gdb_count; /* Number of group descriptor blocks */ 1082ca0faba0STheodore Ts'o unsigned long s_desc_per_block; /* Number of group descriptors per block */ 1083ca0faba0STheodore Ts'o ext4_group_t s_groups_count; /* Number of groups in the fs */ 1084fb0a387dSEric Sandeen ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */ 1085ca0faba0STheodore Ts'o unsigned long s_overhead_last; /* Last calculated overhead */ 1086ca0faba0STheodore Ts'o unsigned long s_blocks_last; /* Last seen block count */ 1087ca0faba0STheodore Ts'o loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ 1088ca0faba0STheodore Ts'o struct buffer_head * s_sbh; /* Buffer containing the super block */ 1089ca0faba0STheodore Ts'o struct ext4_super_block *s_es; /* Pointer to the super block in the buffer */ 1090ca0faba0STheodore Ts'o struct buffer_head **s_group_desc; 10917f4520ccSTheodore Ts'o unsigned int s_mount_opt; 1092bc0b0d6dSTheodore Ts'o unsigned int s_mount_flags; 1093ca0faba0STheodore Ts'o ext4_fsblk_t s_sb_block; 1094ca0faba0STheodore Ts'o uid_t s_resuid; 1095ca0faba0STheodore Ts'o gid_t s_resgid; 1096ca0faba0STheodore Ts'o unsigned short s_mount_state; 1097ca0faba0STheodore Ts'o unsigned short s_pad; 1098ca0faba0STheodore Ts'o int s_addr_per_block_bits; 1099ca0faba0STheodore Ts'o int s_desc_per_block_bits; 1100ca0faba0STheodore Ts'o int s_inode_size; 1101ca0faba0STheodore Ts'o int s_first_ino; 1102ca0faba0STheodore Ts'o unsigned int s_inode_readahead_blks; 110311013911SAndreas Dilger unsigned int s_inode_goal; 1104ca0faba0STheodore Ts'o spinlock_t s_next_gen_lock; 1105ca0faba0STheodore Ts'o u32 s_next_generation; 1106ca0faba0STheodore Ts'o u32 s_hash_seed[4]; 1107ca0faba0STheodore Ts'o int s_def_hash_version; 1108ca0faba0STheodore Ts'o int s_hash_unsigned; /* 3 if hash should be signed, 0 if not */ 1109ca0faba0STheodore Ts'o struct percpu_counter s_freeblocks_counter; 1110ca0faba0STheodore Ts'o struct percpu_counter s_freeinodes_counter; 1111ca0faba0STheodore Ts'o struct percpu_counter s_dirs_counter; 1112ca0faba0STheodore Ts'o struct percpu_counter s_dirtyblocks_counter; 1113ca0faba0STheodore Ts'o struct blockgroup_lock *s_blockgroup_lock; 1114ca0faba0STheodore Ts'o struct proc_dir_entry *s_proc; 1115ca0faba0STheodore Ts'o struct kobject s_kobj; 1116ca0faba0STheodore Ts'o struct completion s_kobj_unregister; 1117ca0faba0STheodore Ts'o 1118ca0faba0STheodore Ts'o /* Journaling */ 1119ca0faba0STheodore Ts'o struct journal_s *s_journal; 1120ca0faba0STheodore Ts'o struct list_head s_orphan; 1121ca0faba0STheodore Ts'o struct mutex s_orphan_lock; 1122ca0faba0STheodore Ts'o struct mutex s_resize_lock; 1123ca0faba0STheodore Ts'o unsigned long s_commit_interval; 1124ca0faba0STheodore Ts'o u32 s_max_batch_time; 1125ca0faba0STheodore Ts'o u32 s_min_batch_time; 1126ca0faba0STheodore Ts'o struct block_device *journal_bdev; 1127ca0faba0STheodore Ts'o #ifdef CONFIG_JBD2_DEBUG 1128ca0faba0STheodore Ts'o struct timer_list turn_ro_timer; /* For turning read-only (crash simulation) */ 1129ca0faba0STheodore Ts'o wait_queue_head_t ro_wait_queue; /* For people waiting for the fs to go read-only */ 1130ca0faba0STheodore Ts'o #endif 1131ca0faba0STheodore Ts'o #ifdef CONFIG_QUOTA 1132ca0faba0STheodore Ts'o char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */ 1133ca0faba0STheodore Ts'o int s_jquota_fmt; /* Format of quota to use */ 1134ca0faba0STheodore Ts'o #endif 1135ca0faba0STheodore Ts'o unsigned int s_want_extra_isize; /* New inodes should reserve # bytes */ 11366fd058f7STheodore Ts'o struct rb_root system_blks; 1137ca0faba0STheodore Ts'o 1138ca0faba0STheodore Ts'o #ifdef EXTENTS_STATS 1139ca0faba0STheodore Ts'o /* ext4 extents stats */ 1140ca0faba0STheodore Ts'o unsigned long s_ext_min; 1141ca0faba0STheodore Ts'o unsigned long s_ext_max; 1142ca0faba0STheodore Ts'o unsigned long s_depth_max; 1143ca0faba0STheodore Ts'o spinlock_t s_ext_stats_lock; 1144ca0faba0STheodore Ts'o unsigned long s_ext_blocks; 1145ca0faba0STheodore Ts'o unsigned long s_ext_extents; 1146ca0faba0STheodore Ts'o #endif 1147ca0faba0STheodore Ts'o 1148ca0faba0STheodore Ts'o /* for buddy allocator */ 1149ca0faba0STheodore Ts'o struct ext4_group_info ***s_group_info; 1150ca0faba0STheodore Ts'o struct inode *s_buddy_cache; 1151ca0faba0STheodore Ts'o spinlock_t s_md_lock; 1152ca0faba0STheodore Ts'o unsigned short *s_mb_offsets; 1153ca0faba0STheodore Ts'o unsigned int *s_mb_maxs; 1154ca0faba0STheodore Ts'o 1155ca0faba0STheodore Ts'o /* tunables */ 1156ca0faba0STheodore Ts'o unsigned long s_stripe; 1157ca0faba0STheodore Ts'o unsigned int s_mb_stream_request; 1158ca0faba0STheodore Ts'o unsigned int s_mb_max_to_scan; 1159ca0faba0STheodore Ts'o unsigned int s_mb_min_to_scan; 1160ca0faba0STheodore Ts'o unsigned int s_mb_stats; 1161ca0faba0STheodore Ts'o unsigned int s_mb_order2_reqs; 1162ca0faba0STheodore Ts'o unsigned int s_mb_group_prealloc; 116355138e0bSTheodore Ts'o unsigned int s_max_writeback_mb_bump; 1164ca0faba0STheodore Ts'o /* where last allocation was done - for stream allocation */ 1165ca0faba0STheodore Ts'o unsigned long s_mb_last_group; 1166ca0faba0STheodore Ts'o unsigned long s_mb_last_start; 1167ca0faba0STheodore Ts'o 1168ca0faba0STheodore Ts'o /* stats for buddy allocator */ 1169ca0faba0STheodore Ts'o atomic_t s_bal_reqs; /* number of reqs with len > 1 */ 1170ca0faba0STheodore Ts'o atomic_t s_bal_success; /* we found long enough chunks */ 1171ca0faba0STheodore Ts'o atomic_t s_bal_allocated; /* in blocks */ 1172ca0faba0STheodore Ts'o atomic_t s_bal_ex_scanned; /* total extents scanned */ 1173ca0faba0STheodore Ts'o atomic_t s_bal_goals; /* goal hits */ 1174ca0faba0STheodore Ts'o atomic_t s_bal_breaks; /* too long searches */ 1175ca0faba0STheodore Ts'o atomic_t s_bal_2orders; /* 2^order hits */ 1176ca0faba0STheodore Ts'o spinlock_t s_bal_lock; 1177ca0faba0STheodore Ts'o unsigned long s_mb_buddies_generated; 1178ca0faba0STheodore Ts'o unsigned long long s_mb_generation_time; 1179ca0faba0STheodore Ts'o atomic_t s_mb_lost_chunks; 1180ca0faba0STheodore Ts'o atomic_t s_mb_preallocated; 1181ca0faba0STheodore Ts'o atomic_t s_mb_discarded; 118250797481STheodore Ts'o atomic_t s_lock_busy; 1183ca0faba0STheodore Ts'o 1184ca0faba0STheodore Ts'o /* locality groups */ 1185003cb608STejun Heo struct ext4_locality_group __percpu *s_locality_groups; 1186ca0faba0STheodore Ts'o 1187ca0faba0STheodore Ts'o /* for write statistics */ 1188ca0faba0STheodore Ts'o unsigned long s_sectors_written_start; 1189ca0faba0STheodore Ts'o u64 s_kbytes_written; 1190ca0faba0STheodore Ts'o 1191ca0faba0STheodore Ts'o unsigned int s_log_groups_per_flex; 1192ca0faba0STheodore Ts'o struct flex_groups *s_flex_groups; 11934c0425ffSMingming Cao 11944c0425ffSMingming Cao /* workqueue for dio unwritten */ 11954c0425ffSMingming Cao struct workqueue_struct *dio_unwritten_wq; 119666e61a9eSTheodore Ts'o 119766e61a9eSTheodore Ts'o /* timer for periodic error stats printing */ 119866e61a9eSTheodore Ts'o struct timer_list s_err_report; 1199bfff6873SLukas Czerner 1200bfff6873SLukas Czerner /* Lazy inode table initialization info */ 1201bfff6873SLukas Czerner struct ext4_li_request *s_li_request; 1202bfff6873SLukas Czerner /* Wait multiplier for lazy initialization thread */ 1203bfff6873SLukas Czerner unsigned int s_li_wait_mult; 1204ca0faba0STheodore Ts'o }; 1205ca0faba0STheodore Ts'o 12063dcf5451SChristoph Hellwig static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb) 12073dcf5451SChristoph Hellwig { 12083dcf5451SChristoph Hellwig return sb->s_fs_info; 12093dcf5451SChristoph Hellwig } 12103dcf5451SChristoph Hellwig static inline struct ext4_inode_info *EXT4_I(struct inode *inode) 12113dcf5451SChristoph Hellwig { 12123dcf5451SChristoph Hellwig return container_of(inode, struct ext4_inode_info, vfs_inode); 12133dcf5451SChristoph Hellwig } 12143dcf5451SChristoph Hellwig 12153dcf5451SChristoph Hellwig static inline struct timespec ext4_current_time(struct inode *inode) 12163dcf5451SChristoph Hellwig { 12173dcf5451SChristoph Hellwig return (inode->i_sb->s_time_gran < NSEC_PER_SEC) ? 12183dcf5451SChristoph Hellwig current_fs_time(inode->i_sb) : CURRENT_TIME_SEC; 12193dcf5451SChristoph Hellwig } 12203dcf5451SChristoph Hellwig 12213dcf5451SChristoph Hellwig static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) 12223dcf5451SChristoph Hellwig { 12233dcf5451SChristoph Hellwig return ino == EXT4_ROOT_INO || 12243dcf5451SChristoph Hellwig ino == EXT4_JOURNAL_INO || 12253dcf5451SChristoph Hellwig ino == EXT4_RESIZE_INO || 12263dcf5451SChristoph Hellwig (ino >= EXT4_FIRST_INO(sb) && 12273dcf5451SChristoph Hellwig ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)); 12283dcf5451SChristoph Hellwig } 122919f5fb7aSTheodore Ts'o 123019f5fb7aSTheodore Ts'o /* 123119f5fb7aSTheodore Ts'o * Inode dynamic state flags 123219f5fb7aSTheodore Ts'o */ 123319f5fb7aSTheodore Ts'o enum { 123419f5fb7aSTheodore Ts'o EXT4_STATE_JDATA, /* journaled data exists */ 123519f5fb7aSTheodore Ts'o EXT4_STATE_NEW, /* inode is newly created */ 123619f5fb7aSTheodore Ts'o EXT4_STATE_XATTR, /* has in-inode xattrs */ 123719f5fb7aSTheodore Ts'o EXT4_STATE_NO_EXPAND, /* No space for expansion */ 123819f5fb7aSTheodore Ts'o EXT4_STATE_DA_ALLOC_CLOSE, /* Alloc DA blks on close */ 123919f5fb7aSTheodore Ts'o EXT4_STATE_EXT_MIGRATE, /* Inode is migrating */ 124019f5fb7aSTheodore Ts'o EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ 124114ece102SFrank Mayhar EXT4_STATE_NEWENTRY, /* File just added to dir */ 124219f5fb7aSTheodore Ts'o }; 124319f5fb7aSTheodore Ts'o 124412e9b892SDmitry Monakhov #define EXT4_INODE_BIT_FNS(name, field) \ 124512e9b892SDmitry Monakhov static inline int ext4_test_inode_##name(struct inode *inode, int bit) \ 124612e9b892SDmitry Monakhov { \ 124712e9b892SDmitry Monakhov return test_bit(bit, &EXT4_I(inode)->i_##field); \ 124812e9b892SDmitry Monakhov } \ 124912e9b892SDmitry Monakhov static inline void ext4_set_inode_##name(struct inode *inode, int bit) \ 125012e9b892SDmitry Monakhov { \ 125112e9b892SDmitry Monakhov set_bit(bit, &EXT4_I(inode)->i_##field); \ 125212e9b892SDmitry Monakhov } \ 125312e9b892SDmitry Monakhov static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \ 125412e9b892SDmitry Monakhov { \ 125512e9b892SDmitry Monakhov clear_bit(bit, &EXT4_I(inode)->i_##field); \ 125619f5fb7aSTheodore Ts'o } 125719f5fb7aSTheodore Ts'o 125812e9b892SDmitry Monakhov EXT4_INODE_BIT_FNS(flag, flags) 125912e9b892SDmitry Monakhov EXT4_INODE_BIT_FNS(state, state_flags) 12603dcf5451SChristoph Hellwig #else 12613dcf5451SChristoph Hellwig /* Assume that user mode programs are passing in an ext4fs superblock, not 12623dcf5451SChristoph Hellwig * a kernel struct super_block. This will allow us to call the feature-test 12633dcf5451SChristoph Hellwig * macros from user land. */ 12643dcf5451SChristoph Hellwig #define EXT4_SB(sb) (sb) 12653dcf5451SChristoph Hellwig #endif 12663dcf5451SChristoph Hellwig 12673dcf5451SChristoph Hellwig #define NEXT_ORPHAN(inode) EXT4_I(inode)->i_dtime 12683dcf5451SChristoph Hellwig 12693dcf5451SChristoph Hellwig /* 12703dcf5451SChristoph Hellwig * Codes for operating systems 12713dcf5451SChristoph Hellwig */ 12723dcf5451SChristoph Hellwig #define EXT4_OS_LINUX 0 12733dcf5451SChristoph Hellwig #define EXT4_OS_HURD 1 12743dcf5451SChristoph Hellwig #define EXT4_OS_MASIX 2 12753dcf5451SChristoph Hellwig #define EXT4_OS_FREEBSD 3 12763dcf5451SChristoph Hellwig #define EXT4_OS_LITES 4 12773dcf5451SChristoph Hellwig 12783dcf5451SChristoph Hellwig /* 12793dcf5451SChristoph Hellwig * Revision levels 12803dcf5451SChristoph Hellwig */ 12813dcf5451SChristoph Hellwig #define EXT4_GOOD_OLD_REV 0 /* The good old (original) format */ 12823dcf5451SChristoph Hellwig #define EXT4_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ 12833dcf5451SChristoph Hellwig 12843dcf5451SChristoph Hellwig #define EXT4_CURRENT_REV EXT4_GOOD_OLD_REV 12853dcf5451SChristoph Hellwig #define EXT4_MAX_SUPP_REV EXT4_DYNAMIC_REV 12863dcf5451SChristoph Hellwig 12873dcf5451SChristoph Hellwig #define EXT4_GOOD_OLD_INODE_SIZE 128 12883dcf5451SChristoph Hellwig 12893dcf5451SChristoph Hellwig /* 12903dcf5451SChristoph Hellwig * Feature set definitions 12913dcf5451SChristoph Hellwig */ 12923dcf5451SChristoph Hellwig 12933dcf5451SChristoph Hellwig #define EXT4_HAS_COMPAT_FEATURE(sb,mask) \ 12943a06d778SAneesh Kumar K.V ((EXT4_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask)) != 0) 12953dcf5451SChristoph Hellwig #define EXT4_HAS_RO_COMPAT_FEATURE(sb,mask) \ 12963a06d778SAneesh Kumar K.V ((EXT4_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask)) != 0) 12973dcf5451SChristoph Hellwig #define EXT4_HAS_INCOMPAT_FEATURE(sb,mask) \ 12983a06d778SAneesh Kumar K.V ((EXT4_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask)) != 0) 12993dcf5451SChristoph Hellwig #define EXT4_SET_COMPAT_FEATURE(sb,mask) \ 13003dcf5451SChristoph Hellwig EXT4_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask) 13013dcf5451SChristoph Hellwig #define EXT4_SET_RO_COMPAT_FEATURE(sb,mask) \ 13023dcf5451SChristoph Hellwig EXT4_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask) 13033dcf5451SChristoph Hellwig #define EXT4_SET_INCOMPAT_FEATURE(sb,mask) \ 13043dcf5451SChristoph Hellwig EXT4_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask) 13053dcf5451SChristoph Hellwig #define EXT4_CLEAR_COMPAT_FEATURE(sb,mask) \ 13063dcf5451SChristoph Hellwig EXT4_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask) 13073dcf5451SChristoph Hellwig #define EXT4_CLEAR_RO_COMPAT_FEATURE(sb,mask) \ 13083dcf5451SChristoph Hellwig EXT4_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask) 13093dcf5451SChristoph Hellwig #define EXT4_CLEAR_INCOMPAT_FEATURE(sb,mask) \ 13103dcf5451SChristoph Hellwig EXT4_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask) 13113dcf5451SChristoph Hellwig 13123dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_DIR_PREALLOC 0x0001 13133dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_IMAGIC_INODES 0x0002 13143dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_HAS_JOURNAL 0x0004 13153dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_EXT_ATTR 0x0008 13163dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_RESIZE_INODE 0x0010 13173dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_DIR_INDEX 0x0020 13183dcf5451SChristoph Hellwig 13193dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 13203dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 13213dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 13223dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_HUGE_FILE 0x0008 13233dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_GDT_CSUM 0x0010 13243dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK 0x0020 13253dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE 0x0040 13263dcf5451SChristoph Hellwig 13273dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_COMPRESSION 0x0001 13283dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_FILETYPE 0x0002 13293dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ 13303dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ 13313dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_META_BG 0x0010 13323dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */ 13333dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 13343dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_MMP 0x0100 13353dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 1336f710b4b9STheodore Ts'o #define EXT4_FEATURE_INCOMPAT_EA_INODE 0x0400 /* EA in inode */ 1337f710b4b9STheodore Ts'o #define EXT4_FEATURE_INCOMPAT_DIRDATA 0x1000 /* data in dirent */ 13383dcf5451SChristoph Hellwig 13393dcf5451SChristoph Hellwig #define EXT4_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR 13403dcf5451SChristoph Hellwig #define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE| \ 13413dcf5451SChristoph Hellwig EXT4_FEATURE_INCOMPAT_RECOVER| \ 13423dcf5451SChristoph Hellwig EXT4_FEATURE_INCOMPAT_META_BG| \ 13433dcf5451SChristoph Hellwig EXT4_FEATURE_INCOMPAT_EXTENTS| \ 13443dcf5451SChristoph Hellwig EXT4_FEATURE_INCOMPAT_64BIT| \ 13453dcf5451SChristoph Hellwig EXT4_FEATURE_INCOMPAT_FLEX_BG) 13463dcf5451SChristoph Hellwig #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ 13473dcf5451SChristoph Hellwig EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ 13483dcf5451SChristoph Hellwig EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \ 13493dcf5451SChristoph Hellwig EXT4_FEATURE_RO_COMPAT_DIR_NLINK | \ 13503dcf5451SChristoph Hellwig EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE | \ 13513dcf5451SChristoph Hellwig EXT4_FEATURE_RO_COMPAT_BTREE_DIR |\ 13523dcf5451SChristoph Hellwig EXT4_FEATURE_RO_COMPAT_HUGE_FILE) 13533dcf5451SChristoph Hellwig 13543dcf5451SChristoph Hellwig /* 13553dcf5451SChristoph Hellwig * Default values for user and/or group using reserved blocks 13563dcf5451SChristoph Hellwig */ 13573dcf5451SChristoph Hellwig #define EXT4_DEF_RESUID 0 13583dcf5451SChristoph Hellwig #define EXT4_DEF_RESGID 0 13593dcf5451SChristoph Hellwig 1360240799cdSTheodore Ts'o #define EXT4_DEF_INODE_READAHEAD_BLKS 32 1361240799cdSTheodore Ts'o 13623dcf5451SChristoph Hellwig /* 13633dcf5451SChristoph Hellwig * Default mount options 13643dcf5451SChristoph Hellwig */ 13653dcf5451SChristoph Hellwig #define EXT4_DEFM_DEBUG 0x0001 13663dcf5451SChristoph Hellwig #define EXT4_DEFM_BSDGROUPS 0x0002 13673dcf5451SChristoph Hellwig #define EXT4_DEFM_XATTR_USER 0x0004 13683dcf5451SChristoph Hellwig #define EXT4_DEFM_ACL 0x0008 13693dcf5451SChristoph Hellwig #define EXT4_DEFM_UID16 0x0010 13703dcf5451SChristoph Hellwig #define EXT4_DEFM_JMODE 0x0060 13713dcf5451SChristoph Hellwig #define EXT4_DEFM_JMODE_DATA 0x0020 13723dcf5451SChristoph Hellwig #define EXT4_DEFM_JMODE_ORDERED 0x0040 13733dcf5451SChristoph Hellwig #define EXT4_DEFM_JMODE_WBACK 0x0060 13748b67f04aSTheodore Ts'o #define EXT4_DEFM_NOBARRIER 0x0100 13758b67f04aSTheodore Ts'o #define EXT4_DEFM_BLOCK_VALIDITY 0x0200 13768b67f04aSTheodore Ts'o #define EXT4_DEFM_DISCARD 0x0400 13778b67f04aSTheodore Ts'o #define EXT4_DEFM_NODELALLOC 0x0800 13783dcf5451SChristoph Hellwig 13793dcf5451SChristoph Hellwig /* 138030773840STheodore Ts'o * Default journal batch times 138130773840STheodore Ts'o */ 138230773840STheodore Ts'o #define EXT4_DEF_MIN_BATCH_TIME 0 138330773840STheodore Ts'o #define EXT4_DEF_MAX_BATCH_TIME 15000 /* 15ms */ 138430773840STheodore Ts'o 138530773840STheodore Ts'o /* 1386a4912123STheodore Ts'o * Minimum number of groups in a flexgroup before we separate out 1387a4912123STheodore Ts'o * directories into the first block group of a flexgroup 1388a4912123STheodore Ts'o */ 1389a4912123STheodore Ts'o #define EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME 4 1390a4912123STheodore Ts'o 1391a4912123STheodore Ts'o /* 13923dcf5451SChristoph Hellwig * Structure of a directory entry 13933dcf5451SChristoph Hellwig */ 13943dcf5451SChristoph Hellwig #define EXT4_NAME_LEN 255 13953dcf5451SChristoph Hellwig 13963dcf5451SChristoph Hellwig struct ext4_dir_entry { 13973dcf5451SChristoph Hellwig __le32 inode; /* Inode number */ 13983dcf5451SChristoph Hellwig __le16 rec_len; /* Directory entry length */ 13993dcf5451SChristoph Hellwig __le16 name_len; /* Name length */ 14003dcf5451SChristoph Hellwig char name[EXT4_NAME_LEN]; /* File name */ 14013dcf5451SChristoph Hellwig }; 14023dcf5451SChristoph Hellwig 14033dcf5451SChristoph Hellwig /* 14043dcf5451SChristoph Hellwig * The new version of the directory entry. Since EXT4 structures are 14053dcf5451SChristoph Hellwig * stored in intel byte order, and the name_len field could never be 14063dcf5451SChristoph Hellwig * bigger than 255 chars, it's safe to reclaim the extra byte for the 14073dcf5451SChristoph Hellwig * file_type field. 14083dcf5451SChristoph Hellwig */ 14093dcf5451SChristoph Hellwig struct ext4_dir_entry_2 { 14103dcf5451SChristoph Hellwig __le32 inode; /* Inode number */ 14113dcf5451SChristoph Hellwig __le16 rec_len; /* Directory entry length */ 14123dcf5451SChristoph Hellwig __u8 name_len; /* Name length */ 14133dcf5451SChristoph Hellwig __u8 file_type; 14143dcf5451SChristoph Hellwig char name[EXT4_NAME_LEN]; /* File name */ 14153dcf5451SChristoph Hellwig }; 14163dcf5451SChristoph Hellwig 14173dcf5451SChristoph Hellwig /* 14183dcf5451SChristoph Hellwig * Ext4 directory file types. Only the low 3 bits are used. The 14193dcf5451SChristoph Hellwig * other bits are reserved for now. 14203dcf5451SChristoph Hellwig */ 14213dcf5451SChristoph Hellwig #define EXT4_FT_UNKNOWN 0 14223dcf5451SChristoph Hellwig #define EXT4_FT_REG_FILE 1 14233dcf5451SChristoph Hellwig #define EXT4_FT_DIR 2 14243dcf5451SChristoph Hellwig #define EXT4_FT_CHRDEV 3 14253dcf5451SChristoph Hellwig #define EXT4_FT_BLKDEV 4 14263dcf5451SChristoph Hellwig #define EXT4_FT_FIFO 5 14273dcf5451SChristoph Hellwig #define EXT4_FT_SOCK 6 14283dcf5451SChristoph Hellwig #define EXT4_FT_SYMLINK 7 14293dcf5451SChristoph Hellwig 14303dcf5451SChristoph Hellwig #define EXT4_FT_MAX 8 14313dcf5451SChristoph Hellwig 14323dcf5451SChristoph Hellwig /* 14333dcf5451SChristoph Hellwig * EXT4_DIR_PAD defines the directory entries boundaries 14343dcf5451SChristoph Hellwig * 14353dcf5451SChristoph Hellwig * NOTE: It must be a multiple of 4 14363dcf5451SChristoph Hellwig */ 14373dcf5451SChristoph Hellwig #define EXT4_DIR_PAD 4 14383dcf5451SChristoph Hellwig #define EXT4_DIR_ROUND (EXT4_DIR_PAD - 1) 14393dcf5451SChristoph Hellwig #define EXT4_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT4_DIR_ROUND) & \ 14403dcf5451SChristoph Hellwig ~EXT4_DIR_ROUND) 14413dcf5451SChristoph Hellwig #define EXT4_MAX_REC_LEN ((1<<16)-1) 14423dcf5451SChristoph Hellwig 14433dcf5451SChristoph Hellwig /* 14440cfc9255SEric Sandeen * If we ever get support for fs block sizes > page_size, we'll need 14450cfc9255SEric Sandeen * to remove the #if statements in the next two functions... 14460cfc9255SEric Sandeen */ 14470cfc9255SEric Sandeen static inline unsigned int 14480cfc9255SEric Sandeen ext4_rec_len_from_disk(__le16 dlen, unsigned blocksize) 14490cfc9255SEric Sandeen { 14500cfc9255SEric Sandeen unsigned len = le16_to_cpu(dlen); 14510cfc9255SEric Sandeen 14520cfc9255SEric Sandeen #if (PAGE_CACHE_SIZE >= 65536) 14530cfc9255SEric Sandeen if (len == EXT4_MAX_REC_LEN || len == 0) 14540cfc9255SEric Sandeen return blocksize; 14550cfc9255SEric Sandeen return (len & 65532) | ((len & 3) << 16); 14560cfc9255SEric Sandeen #else 14570cfc9255SEric Sandeen return len; 14580cfc9255SEric Sandeen #endif 14590cfc9255SEric Sandeen } 14600cfc9255SEric Sandeen 14610cfc9255SEric Sandeen static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) 14620cfc9255SEric Sandeen { 14630cfc9255SEric Sandeen if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3)) 14640cfc9255SEric Sandeen BUG(); 14650cfc9255SEric Sandeen #if (PAGE_CACHE_SIZE >= 65536) 14660cfc9255SEric Sandeen if (len < 65536) 14670cfc9255SEric Sandeen return cpu_to_le16(len); 14680cfc9255SEric Sandeen if (len == blocksize) { 14690cfc9255SEric Sandeen if (blocksize == 65536) 14700cfc9255SEric Sandeen return cpu_to_le16(EXT4_MAX_REC_LEN); 14710cfc9255SEric Sandeen else 14720cfc9255SEric Sandeen return cpu_to_le16(0); 14730cfc9255SEric Sandeen } 14740cfc9255SEric Sandeen return cpu_to_le16((len & 65532) | ((len >> 16) & 3)); 14750cfc9255SEric Sandeen #else 14760cfc9255SEric Sandeen return cpu_to_le16(len); 14770cfc9255SEric Sandeen #endif 14780cfc9255SEric Sandeen } 14790cfc9255SEric Sandeen 14800cfc9255SEric Sandeen /* 14813dcf5451SChristoph Hellwig * Hash Tree Directory indexing 14823dcf5451SChristoph Hellwig * (c) Daniel Phillips, 2001 14833dcf5451SChristoph Hellwig */ 14843dcf5451SChristoph Hellwig 14853dcf5451SChristoph Hellwig #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ 14863dcf5451SChristoph Hellwig EXT4_FEATURE_COMPAT_DIR_INDEX) && \ 148712e9b892SDmitry Monakhov ext4_test_inode_flag((dir), EXT4_INODE_INDEX)) 14883dcf5451SChristoph Hellwig #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) 14893dcf5451SChristoph Hellwig #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) 14903dcf5451SChristoph Hellwig 14913dcf5451SChristoph Hellwig /* Legal values for the dx_root hash_version field: */ 14923dcf5451SChristoph Hellwig 14933dcf5451SChristoph Hellwig #define DX_HASH_LEGACY 0 14943dcf5451SChristoph Hellwig #define DX_HASH_HALF_MD4 1 14953dcf5451SChristoph Hellwig #define DX_HASH_TEA 2 1496f99b2589STheodore Ts'o #define DX_HASH_LEGACY_UNSIGNED 3 1497f99b2589STheodore Ts'o #define DX_HASH_HALF_MD4_UNSIGNED 4 1498f99b2589STheodore Ts'o #define DX_HASH_TEA_UNSIGNED 5 14993dcf5451SChristoph Hellwig 15003dcf5451SChristoph Hellwig #ifdef __KERNEL__ 15013dcf5451SChristoph Hellwig 15023dcf5451SChristoph Hellwig /* hash info structure used by the directory hash */ 15033dcf5451SChristoph Hellwig struct dx_hash_info 15043dcf5451SChristoph Hellwig { 15053dcf5451SChristoph Hellwig u32 hash; 15063dcf5451SChristoph Hellwig u32 minor_hash; 15073dcf5451SChristoph Hellwig int hash_version; 15083dcf5451SChristoph Hellwig u32 *seed; 15093dcf5451SChristoph Hellwig }; 15103dcf5451SChristoph Hellwig 15113dcf5451SChristoph Hellwig #define EXT4_HTREE_EOF 0x7fffffff 15123dcf5451SChristoph Hellwig 15133dcf5451SChristoph Hellwig /* 15143dcf5451SChristoph Hellwig * Control parameters used by ext4_htree_next_block 15153dcf5451SChristoph Hellwig */ 15163dcf5451SChristoph Hellwig #define HASH_NB_ALWAYS 1 15173dcf5451SChristoph Hellwig 15183dcf5451SChristoph Hellwig 15193dcf5451SChristoph Hellwig /* 15203dcf5451SChristoph Hellwig * Describe an inode's exact location on disk and in memory 15213dcf5451SChristoph Hellwig */ 15223dcf5451SChristoph Hellwig struct ext4_iloc 15233dcf5451SChristoph Hellwig { 15243dcf5451SChristoph Hellwig struct buffer_head *bh; 15253dcf5451SChristoph Hellwig unsigned long offset; 15263dcf5451SChristoph Hellwig ext4_group_t block_group; 15273dcf5451SChristoph Hellwig }; 15283dcf5451SChristoph Hellwig 15293dcf5451SChristoph Hellwig static inline struct ext4_inode *ext4_raw_inode(struct ext4_iloc *iloc) 15303dcf5451SChristoph Hellwig { 15313dcf5451SChristoph Hellwig return (struct ext4_inode *) (iloc->bh->b_data + iloc->offset); 15323dcf5451SChristoph Hellwig } 15333dcf5451SChristoph Hellwig 15343dcf5451SChristoph Hellwig /* 15353dcf5451SChristoph Hellwig * This structure is stuffed into the struct file's private_data field 15363dcf5451SChristoph Hellwig * for directories. It is where we put information so that we can do 15373dcf5451SChristoph Hellwig * readdir operations in hash tree order. 15383dcf5451SChristoph Hellwig */ 15393dcf5451SChristoph Hellwig struct dir_private_info { 15403dcf5451SChristoph Hellwig struct rb_root root; 15413dcf5451SChristoph Hellwig struct rb_node *curr_node; 15423dcf5451SChristoph Hellwig struct fname *extra_fname; 15433dcf5451SChristoph Hellwig loff_t last_pos; 15443dcf5451SChristoph Hellwig __u32 curr_hash; 15453dcf5451SChristoph Hellwig __u32 curr_minor_hash; 15463dcf5451SChristoph Hellwig __u32 next_hash; 15473dcf5451SChristoph Hellwig }; 15483dcf5451SChristoph Hellwig 15493dcf5451SChristoph Hellwig /* calculate the first block number of the group */ 15503dcf5451SChristoph Hellwig static inline ext4_fsblk_t 15513dcf5451SChristoph Hellwig ext4_group_first_block_no(struct super_block *sb, ext4_group_t group_no) 15523dcf5451SChristoph Hellwig { 15533dcf5451SChristoph Hellwig return group_no * (ext4_fsblk_t)EXT4_BLOCKS_PER_GROUP(sb) + 15543dcf5451SChristoph Hellwig le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block); 15553dcf5451SChristoph Hellwig } 15563dcf5451SChristoph Hellwig 15573dcf5451SChristoph Hellwig /* 15583dcf5451SChristoph Hellwig * Special error return code only used by dx_probe() and its callers. 15593dcf5451SChristoph Hellwig */ 15603dcf5451SChristoph Hellwig #define ERR_BAD_DX_DIR -75000 15613dcf5451SChristoph Hellwig 15623dcf5451SChristoph Hellwig void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr, 1563a9df9a49STheodore Ts'o ext4_group_t *blockgrpp, ext4_grpblk_t *offsetp); 15643dcf5451SChristoph Hellwig 15653dcf5451SChristoph Hellwig /* 1566bfff6873SLukas Czerner * Timeout and state flag for lazy initialization inode thread. 1567bfff6873SLukas Czerner */ 1568bfff6873SLukas Czerner #define EXT4_DEF_LI_WAIT_MULT 10 1569bfff6873SLukas Czerner #define EXT4_DEF_LI_MAX_START_DELAY 5 1570bfff6873SLukas Czerner #define EXT4_LAZYINIT_QUIT 0x0001 1571bfff6873SLukas Czerner #define EXT4_LAZYINIT_RUNNING 0x0002 1572bfff6873SLukas Czerner 1573bfff6873SLukas Czerner /* 1574bfff6873SLukas Czerner * Lazy inode table initialization info 1575bfff6873SLukas Czerner */ 1576bfff6873SLukas Czerner struct ext4_lazy_init { 1577bfff6873SLukas Czerner unsigned long li_state; 1578bfff6873SLukas Czerner 1579bfff6873SLukas Czerner wait_queue_head_t li_wait_daemon; 1580bfff6873SLukas Czerner wait_queue_head_t li_wait_task; 1581bfff6873SLukas Czerner struct timer_list li_timer; 1582bfff6873SLukas Czerner struct task_struct *li_task; 1583bfff6873SLukas Czerner 1584bfff6873SLukas Czerner struct list_head li_request_list; 1585bfff6873SLukas Czerner struct mutex li_list_mtx; 1586bfff6873SLukas Czerner }; 1587bfff6873SLukas Czerner 1588bfff6873SLukas Czerner struct ext4_li_request { 1589bfff6873SLukas Czerner struct super_block *lr_super; 1590bfff6873SLukas Czerner struct ext4_sb_info *lr_sbi; 1591bfff6873SLukas Czerner ext4_group_t lr_next_group; 1592bfff6873SLukas Czerner struct list_head lr_request; 1593bfff6873SLukas Czerner unsigned long lr_next_sched; 1594bfff6873SLukas Czerner unsigned long lr_timeout; 1595bfff6873SLukas Czerner }; 1596bfff6873SLukas Czerner 1597857ac889SLukas Czerner struct ext4_features { 1598857ac889SLukas Czerner struct kobject f_kobj; 1599857ac889SLukas Czerner struct completion f_kobj_unregister; 1600857ac889SLukas Czerner }; 1601857ac889SLukas Czerner 1602bfff6873SLukas Czerner /* 16033dcf5451SChristoph Hellwig * Function prototypes 16043dcf5451SChristoph Hellwig */ 16053dcf5451SChristoph Hellwig 16063dcf5451SChristoph Hellwig /* 16073dcf5451SChristoph Hellwig * Ok, these declarations are also in <linux/kernel.h> but none of the 16083dcf5451SChristoph Hellwig * ext4 source programs needs to include it so they are duplicated here. 16093dcf5451SChristoph Hellwig */ 16103dcf5451SChristoph Hellwig # define NORET_TYPE /**/ 16113dcf5451SChristoph Hellwig # define ATTRIB_NORET __attribute__((noreturn)) 16123dcf5451SChristoph Hellwig # define NORET_AND noreturn, 16133dcf5451SChristoph Hellwig 1614498e5f24STheodore Ts'o /* bitmap.c */ 1615498e5f24STheodore Ts'o extern unsigned int ext4_count_free(struct buffer_head *, unsigned); 1616498e5f24STheodore Ts'o 16173dcf5451SChristoph Hellwig /* balloc.c */ 16183dcf5451SChristoph Hellwig extern unsigned int ext4_block_group(struct super_block *sb, 16193dcf5451SChristoph Hellwig ext4_fsblk_t blocknr); 16203dcf5451SChristoph Hellwig extern ext4_grpblk_t ext4_block_group_offset(struct super_block *sb, 16213dcf5451SChristoph Hellwig ext4_fsblk_t blocknr); 16223dcf5451SChristoph Hellwig extern int ext4_bg_has_super(struct super_block *sb, ext4_group_t group); 16233dcf5451SChristoph Hellwig extern unsigned long ext4_bg_num_gdb(struct super_block *sb, 16243dcf5451SChristoph Hellwig ext4_group_t group); 16257061eba7SAneesh Kumar K.V extern ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode, 16263dcf5451SChristoph Hellwig ext4_fsblk_t goal, unsigned long *count, int *errp); 16275c791616SAneesh Kumar K.V extern int ext4_claim_free_blocks(struct ext4_sb_info *sbi, s64 nblocks); 1628e21675d4SAneesh Kumar K.V extern void ext4_add_groupblocks(handle_t *handle, struct super_block *sb, 1629e21675d4SAneesh Kumar K.V ext4_fsblk_t block, unsigned long count); 16303dcf5451SChristoph Hellwig extern ext4_fsblk_t ext4_count_free_blocks(struct super_block *); 16313dcf5451SChristoph Hellwig extern void ext4_check_blocks_bitmap(struct super_block *); 16323dcf5451SChristoph Hellwig extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb, 16333dcf5451SChristoph Hellwig ext4_group_t block_group, 16343dcf5451SChristoph Hellwig struct buffer_head ** bh); 16353dcf5451SChristoph Hellwig extern int ext4_should_retry_alloc(struct super_block *sb, int *retries); 1636bb23c20aSTheodore Ts'o struct buffer_head *ext4_read_block_bitmap(struct super_block *sb, 1637bb23c20aSTheodore Ts'o ext4_group_t block_group); 1638bb23c20aSTheodore Ts'o extern unsigned ext4_init_block_bitmap(struct super_block *sb, 1639bb23c20aSTheodore Ts'o struct buffer_head *bh, 1640bb23c20aSTheodore Ts'o ext4_group_t group, 1641bb23c20aSTheodore Ts'o struct ext4_group_desc *desc); 1642bb23c20aSTheodore Ts'o #define ext4_free_blocks_after_init(sb, group, desc) \ 1643bb23c20aSTheodore Ts'o ext4_init_block_bitmap(sb, NULL, group, desc) 16443dcf5451SChristoph Hellwig 16453dcf5451SChristoph Hellwig /* dir.c */ 164660fd4da3STheodore Ts'o extern int __ext4_check_dir_entry(const char *, unsigned int, struct inode *, 16473dcf5451SChristoph Hellwig struct ext4_dir_entry_2 *, 1648498e5f24STheodore Ts'o struct buffer_head *, unsigned int); 164960fd4da3STheodore Ts'o #define ext4_check_dir_entry(dir, de, bh, offset) \ 165060fd4da3STheodore Ts'o __ext4_check_dir_entry(__func__, __LINE__, (dir), (de), (bh), (offset)) 16513dcf5451SChristoph Hellwig extern int ext4_htree_store_dirent(struct file *dir_file, __u32 hash, 16523dcf5451SChristoph Hellwig __u32 minor_hash, 16533dcf5451SChristoph Hellwig struct ext4_dir_entry_2 *dirent); 16543dcf5451SChristoph Hellwig extern void ext4_htree_free_dir_info(struct dir_private_info *p); 16553dcf5451SChristoph Hellwig 16563dcf5451SChristoph Hellwig /* fsync.c */ 16577ea80859SChristoph Hellwig extern int ext4_sync_file(struct file *, int); 16583dcf5451SChristoph Hellwig 16593dcf5451SChristoph Hellwig /* hash.c */ 16603dcf5451SChristoph Hellwig extern int ext4fs_dirhash(const char *name, int len, struct 16613dcf5451SChristoph Hellwig dx_hash_info *hinfo); 16623dcf5451SChristoph Hellwig 16633dcf5451SChristoph Hellwig /* ialloc.c */ 1664f157a4aaSTheodore Ts'o extern struct inode *ext4_new_inode(handle_t *, struct inode *, int, 166511013911SAndreas Dilger const struct qstr *qstr, __u32 goal); 16663dcf5451SChristoph Hellwig extern void ext4_free_inode(handle_t *, struct inode *); 16673dcf5451SChristoph Hellwig extern struct inode * ext4_orphan_get(struct super_block *, unsigned long); 16683dcf5451SChristoph Hellwig extern unsigned long ext4_count_free_inodes(struct super_block *); 16693dcf5451SChristoph Hellwig extern unsigned long ext4_count_dirs(struct super_block *); 16703dcf5451SChristoph Hellwig extern void ext4_check_inodes_bitmap(struct super_block *); 167161d08673STheodore Ts'o extern void ext4_mark_bitmap_end(int start_bit, int end_bit, char *bitmap); 1672bfff6873SLukas Czerner extern int ext4_init_inode_table(struct super_block *sb, 1673bfff6873SLukas Czerner ext4_group_t group, int barrier); 16743dcf5451SChristoph Hellwig 16753dcf5451SChristoph Hellwig /* mballoc.c */ 16763dcf5451SChristoph Hellwig extern long ext4_mb_stats; 16773dcf5451SChristoph Hellwig extern long ext4_mb_max_to_scan; 16783dcf5451SChristoph Hellwig extern int ext4_mb_init(struct super_block *, int); 16793dcf5451SChristoph Hellwig extern int ext4_mb_release(struct super_block *); 16803dcf5451SChristoph Hellwig extern ext4_fsblk_t ext4_mb_new_blocks(handle_t *, 16813dcf5451SChristoph Hellwig struct ext4_allocation_request *, int *); 16823dcf5451SChristoph Hellwig extern int ext4_mb_reserve_blocks(struct super_block *, int); 1683c2ea3fdeSTheodore Ts'o extern void ext4_discard_preallocations(struct inode *); 16845dabfc78STheodore Ts'o extern int __init ext4_init_mballoc(void); 16855dabfc78STheodore Ts'o extern void ext4_exit_mballoc(void); 168644338711STheodore Ts'o extern void ext4_free_blocks(handle_t *handle, struct inode *inode, 1687e6362609STheodore Ts'o struct buffer_head *bh, ext4_fsblk_t block, 1688e6362609STheodore Ts'o unsigned long count, int flags); 1689920313a7SAneesh Kumar K.V extern int ext4_mb_add_groupinfo(struct super_block *sb, 16905f21b0e6SFrederic Bohe ext4_group_t i, struct ext4_group_desc *desc); 16917360d173SLukas Czerner extern int ext4_trim_fs(struct super_block *, struct fstrim_range *); 16927360d173SLukas Czerner 16933dcf5451SChristoph Hellwig /* inode.c */ 16943dcf5451SChristoph Hellwig struct buffer_head *ext4_getblk(handle_t *, struct inode *, 16953dcf5451SChristoph Hellwig ext4_lblk_t, int, int *); 16963dcf5451SChristoph Hellwig struct buffer_head *ext4_bread(handle_t *, struct inode *, 16973dcf5451SChristoph Hellwig ext4_lblk_t, int, int *); 16986873fa0dSEric Sandeen int ext4_get_block(struct inode *inode, sector_t iblock, 16996873fa0dSEric Sandeen struct buffer_head *bh_result, int create); 17003dcf5451SChristoph Hellwig 17013dcf5451SChristoph Hellwig extern struct inode *ext4_iget(struct super_block *, unsigned long); 1702a9185b41SChristoph Hellwig extern int ext4_write_inode(struct inode *, struct writeback_control *); 17033dcf5451SChristoph Hellwig extern int ext4_setattr(struct dentry *, struct iattr *); 17043e3398a0SMingming Cao extern int ext4_getattr(struct vfsmount *mnt, struct dentry *dentry, 17053e3398a0SMingming Cao struct kstat *stat); 17060930fcc1SAl Viro extern void ext4_evict_inode(struct inode *); 17070930fcc1SAl Viro extern void ext4_clear_inode(struct inode *); 17083dcf5451SChristoph Hellwig extern int ext4_sync_inode(handle_t *, struct inode *); 17093dcf5451SChristoph Hellwig extern void ext4_dirty_inode(struct inode *); 17103dcf5451SChristoph Hellwig extern int ext4_change_inode_journal_flag(struct inode *, int); 17113dcf5451SChristoph Hellwig extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *); 171291ef4cafSDuane Griffin extern int ext4_can_truncate(struct inode *inode); 17133dcf5451SChristoph Hellwig extern void ext4_truncate(struct inode *); 1714487caeefSJan Kara extern int ext4_truncate_restart_trans(handle_t *, struct inode *, int nblocks); 17153dcf5451SChristoph Hellwig extern void ext4_set_inode_flags(struct inode *); 17163dcf5451SChristoph Hellwig extern void ext4_get_inode_flags(struct ext4_inode_info *); 1717ccd2506bSTheodore Ts'o extern int ext4_alloc_da_blocks(struct inode *inode); 17183dcf5451SChristoph Hellwig extern void ext4_set_aops(struct inode *inode); 17193dcf5451SChristoph Hellwig extern int ext4_writepage_trans_blocks(struct inode *); 1720f3bd1f3fSMingming Cao extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks); 1721cf108bcaSJan Kara extern int ext4_block_truncate_page(handle_t *handle, 17223dcf5451SChristoph Hellwig struct address_space *mapping, loff_t from); 1723c2ec175cSNick Piggin extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); 1724a9e7f447SDmitry Monakhov extern qsize_t *ext4_get_reserved_space(struct inode *inode); 17255f634d06SAneesh Kumar K.V extern void ext4_da_update_reserve_space(struct inode *inode, 17265f634d06SAneesh Kumar K.V int used, int quota_claim); 17273dcf5451SChristoph Hellwig /* ioctl.c */ 17283dcf5451SChristoph Hellwig extern long ext4_ioctl(struct file *, unsigned int, unsigned long); 17293dcf5451SChristoph Hellwig extern long ext4_compat_ioctl(struct file *, unsigned int, unsigned long); 17303dcf5451SChristoph Hellwig 17313dcf5451SChristoph Hellwig /* migrate.c */ 17322a43a878SAneesh Kumar K.V extern int ext4_ext_migrate(struct inode *); 17333d0518f4SWei Yongjun 17343dcf5451SChristoph Hellwig /* namei.c */ 17353dcf5451SChristoph Hellwig extern int ext4_orphan_add(handle_t *, struct inode *); 17363dcf5451SChristoph Hellwig extern int ext4_orphan_del(handle_t *, struct inode *); 17373dcf5451SChristoph Hellwig extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, 17383dcf5451SChristoph Hellwig __u32 start_minor_hash, __u32 *next_hash); 17393dcf5451SChristoph Hellwig 17403dcf5451SChristoph Hellwig /* resize.c */ 17413dcf5451SChristoph Hellwig extern int ext4_group_add(struct super_block *sb, 17423dcf5451SChristoph Hellwig struct ext4_new_group_data *input); 17433dcf5451SChristoph Hellwig extern int ext4_group_extend(struct super_block *sb, 17443dcf5451SChristoph Hellwig struct ext4_super_block *es, 17453dcf5451SChristoph Hellwig ext4_fsblk_t n_blocks_count); 17463dcf5451SChristoph Hellwig 17473dcf5451SChristoph Hellwig /* super.c */ 1748c398eda0STheodore Ts'o extern void __ext4_error(struct super_block *, const char *, unsigned int, 174912062dddSEric Sandeen const char *, ...) 1750c398eda0STheodore Ts'o __attribute__ ((format (printf, 4, 5))); 1751c398eda0STheodore Ts'o #define ext4_error(sb, message...) __ext4_error(sb, __func__, \ 1752c398eda0STheodore Ts'o __LINE__, ## message) 1753c398eda0STheodore Ts'o extern void ext4_error_inode(struct inode *, const char *, unsigned int, 1754c398eda0STheodore Ts'o ext4_fsblk_t, const char *, ...) 1755c398eda0STheodore Ts'o __attribute__ ((format (printf, 5, 6))); 1756c398eda0STheodore Ts'o extern void ext4_error_file(struct file *, const char *, unsigned int, 1757c398eda0STheodore Ts'o const char *, ...) 1758c398eda0STheodore Ts'o __attribute__ ((format (printf, 4, 5))); 1759c398eda0STheodore Ts'o extern void __ext4_std_error(struct super_block *, const char *, 1760c398eda0STheodore Ts'o unsigned int, int); 1761c398eda0STheodore Ts'o extern void __ext4_abort(struct super_block *, const char *, unsigned int, 1762c398eda0STheodore Ts'o const char *, ...) 1763c398eda0STheodore Ts'o __attribute__ ((format (printf, 4, 5))); 1764c398eda0STheodore Ts'o #define ext4_abort(sb, message...) __ext4_abort(sb, __func__, \ 1765c398eda0STheodore Ts'o __LINE__, ## message) 1766c398eda0STheodore Ts'o extern void __ext4_warning(struct super_block *, const char *, unsigned int, 1767c398eda0STheodore Ts'o const char *, ...) 1768c398eda0STheodore Ts'o __attribute__ ((format (printf, 4, 5))); 1769c398eda0STheodore Ts'o #define ext4_warning(sb, message...) __ext4_warning(sb, __func__, \ 1770c398eda0STheodore Ts'o __LINE__, ## message) 1771b31e1552SEric Sandeen extern void ext4_msg(struct super_block *, const char *, const char *, ...) 1772b31e1552SEric Sandeen __attribute__ ((format (printf, 3, 4))); 1773e29136f8STheodore Ts'o extern void __ext4_grp_locked_error(const char *, unsigned int, \ 1774e29136f8STheodore Ts'o struct super_block *, ext4_group_t, \ 1775e29136f8STheodore Ts'o unsigned long, ext4_fsblk_t, \ 1776e29136f8STheodore Ts'o const char *, ...) 1777e29136f8STheodore Ts'o __attribute__ ((format (printf, 7, 8))); 1778e29136f8STheodore Ts'o #define ext4_grp_locked_error(sb, grp, message...) \ 1779e29136f8STheodore Ts'o __ext4_grp_locked_error(__func__, __LINE__, (sb), (grp), ## message) 17803dcf5451SChristoph Hellwig extern void ext4_update_dynamic_rev(struct super_block *sb); 17813dcf5451SChristoph Hellwig extern int ext4_update_compat_feature(handle_t *handle, struct super_block *sb, 17823dcf5451SChristoph Hellwig __u32 compat); 17833dcf5451SChristoph Hellwig extern int ext4_update_rocompat_feature(handle_t *handle, 17843dcf5451SChristoph Hellwig struct super_block *sb, __u32 rocompat); 17853dcf5451SChristoph Hellwig extern int ext4_update_incompat_feature(handle_t *handle, 17863dcf5451SChristoph Hellwig struct super_block *sb, __u32 incompat); 17873dcf5451SChristoph Hellwig extern ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, 17883dcf5451SChristoph Hellwig struct ext4_group_desc *bg); 17893dcf5451SChristoph Hellwig extern ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb, 17903dcf5451SChristoph Hellwig struct ext4_group_desc *bg); 17913dcf5451SChristoph Hellwig extern ext4_fsblk_t ext4_inode_table(struct super_block *sb, 17923dcf5451SChristoph Hellwig struct ext4_group_desc *bg); 1793560671a0SAneesh Kumar K.V extern __u32 ext4_free_blks_count(struct super_block *sb, 1794560671a0SAneesh Kumar K.V struct ext4_group_desc *bg); 1795560671a0SAneesh Kumar K.V extern __u32 ext4_free_inodes_count(struct super_block *sb, 1796560671a0SAneesh Kumar K.V struct ext4_group_desc *bg); 1797560671a0SAneesh Kumar K.V extern __u32 ext4_used_dirs_count(struct super_block *sb, 1798560671a0SAneesh Kumar K.V struct ext4_group_desc *bg); 1799560671a0SAneesh Kumar K.V extern __u32 ext4_itable_unused_count(struct super_block *sb, 1800560671a0SAneesh Kumar K.V struct ext4_group_desc *bg); 18013dcf5451SChristoph Hellwig extern void ext4_block_bitmap_set(struct super_block *sb, 18023dcf5451SChristoph Hellwig struct ext4_group_desc *bg, ext4_fsblk_t blk); 18033dcf5451SChristoph Hellwig extern void ext4_inode_bitmap_set(struct super_block *sb, 18043dcf5451SChristoph Hellwig struct ext4_group_desc *bg, ext4_fsblk_t blk); 18053dcf5451SChristoph Hellwig extern void ext4_inode_table_set(struct super_block *sb, 18063dcf5451SChristoph Hellwig struct ext4_group_desc *bg, ext4_fsblk_t blk); 1807560671a0SAneesh Kumar K.V extern void ext4_free_blks_set(struct super_block *sb, 1808560671a0SAneesh Kumar K.V struct ext4_group_desc *bg, __u32 count); 1809560671a0SAneesh Kumar K.V extern void ext4_free_inodes_set(struct super_block *sb, 1810560671a0SAneesh Kumar K.V struct ext4_group_desc *bg, __u32 count); 1811560671a0SAneesh Kumar K.V extern void ext4_used_dirs_set(struct super_block *sb, 1812560671a0SAneesh Kumar K.V struct ext4_group_desc *bg, __u32 count); 1813560671a0SAneesh Kumar K.V extern void ext4_itable_unused_set(struct super_block *sb, 1814560671a0SAneesh Kumar K.V struct ext4_group_desc *bg, __u32 count); 1815bb23c20aSTheodore Ts'o extern __le16 ext4_group_desc_csum(struct ext4_sb_info *sbi, __u32 group, 1816bb23c20aSTheodore Ts'o struct ext4_group_desc *gdp); 1817bb23c20aSTheodore Ts'o extern int ext4_group_desc_csum_verify(struct ext4_sb_info *sbi, __u32 group, 1818bb23c20aSTheodore Ts'o struct ext4_group_desc *gdp); 18193dcf5451SChristoph Hellwig 18203dcf5451SChristoph Hellwig static inline ext4_fsblk_t ext4_blocks_count(struct ext4_super_block *es) 18213dcf5451SChristoph Hellwig { 18223dcf5451SChristoph Hellwig return ((ext4_fsblk_t)le32_to_cpu(es->s_blocks_count_hi) << 32) | 18233dcf5451SChristoph Hellwig le32_to_cpu(es->s_blocks_count_lo); 18243dcf5451SChristoph Hellwig } 18253dcf5451SChristoph Hellwig 18263dcf5451SChristoph Hellwig static inline ext4_fsblk_t ext4_r_blocks_count(struct ext4_super_block *es) 18273dcf5451SChristoph Hellwig { 18283dcf5451SChristoph Hellwig return ((ext4_fsblk_t)le32_to_cpu(es->s_r_blocks_count_hi) << 32) | 18293dcf5451SChristoph Hellwig le32_to_cpu(es->s_r_blocks_count_lo); 18303dcf5451SChristoph Hellwig } 18313dcf5451SChristoph Hellwig 18323dcf5451SChristoph Hellwig static inline ext4_fsblk_t ext4_free_blocks_count(struct ext4_super_block *es) 18333dcf5451SChristoph Hellwig { 18343dcf5451SChristoph Hellwig return ((ext4_fsblk_t)le32_to_cpu(es->s_free_blocks_count_hi) << 32) | 18353dcf5451SChristoph Hellwig le32_to_cpu(es->s_free_blocks_count_lo); 18363dcf5451SChristoph Hellwig } 18373dcf5451SChristoph Hellwig 18383dcf5451SChristoph Hellwig static inline void ext4_blocks_count_set(struct ext4_super_block *es, 18393dcf5451SChristoph Hellwig ext4_fsblk_t blk) 18403dcf5451SChristoph Hellwig { 18413dcf5451SChristoph Hellwig es->s_blocks_count_lo = cpu_to_le32((u32)blk); 18423dcf5451SChristoph Hellwig es->s_blocks_count_hi = cpu_to_le32(blk >> 32); 18433dcf5451SChristoph Hellwig } 18443dcf5451SChristoph Hellwig 18453dcf5451SChristoph Hellwig static inline void ext4_free_blocks_count_set(struct ext4_super_block *es, 18463dcf5451SChristoph Hellwig ext4_fsblk_t blk) 18473dcf5451SChristoph Hellwig { 18483dcf5451SChristoph Hellwig es->s_free_blocks_count_lo = cpu_to_le32((u32)blk); 18493dcf5451SChristoph Hellwig es->s_free_blocks_count_hi = cpu_to_le32(blk >> 32); 18503dcf5451SChristoph Hellwig } 18513dcf5451SChristoph Hellwig 18523dcf5451SChristoph Hellwig static inline void ext4_r_blocks_count_set(struct ext4_super_block *es, 18533dcf5451SChristoph Hellwig ext4_fsblk_t blk) 18543dcf5451SChristoph Hellwig { 18553dcf5451SChristoph Hellwig es->s_r_blocks_count_lo = cpu_to_le32((u32)blk); 18563dcf5451SChristoph Hellwig es->s_r_blocks_count_hi = cpu_to_le32(blk >> 32); 18573dcf5451SChristoph Hellwig } 18583dcf5451SChristoph Hellwig 18593dcf5451SChristoph Hellwig static inline loff_t ext4_isize(struct ext4_inode *raw_inode) 18603dcf5451SChristoph Hellwig { 186106a279d6STheodore Ts'o if (S_ISREG(le16_to_cpu(raw_inode->i_mode))) 18623dcf5451SChristoph Hellwig return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) | 18633dcf5451SChristoph Hellwig le32_to_cpu(raw_inode->i_size_lo); 186406a279d6STheodore Ts'o else 186506a279d6STheodore Ts'o return (loff_t) le32_to_cpu(raw_inode->i_size_lo); 18663dcf5451SChristoph Hellwig } 18673dcf5451SChristoph Hellwig 18683dcf5451SChristoph Hellwig static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size) 18693dcf5451SChristoph Hellwig { 18703dcf5451SChristoph Hellwig raw_inode->i_size_lo = cpu_to_le32(i_size); 18713dcf5451SChristoph Hellwig raw_inode->i_size_high = cpu_to_le32(i_size >> 32); 18723dcf5451SChristoph Hellwig } 18733dcf5451SChristoph Hellwig 18743dcf5451SChristoph Hellwig static inline 18753dcf5451SChristoph Hellwig struct ext4_group_info *ext4_get_group_info(struct super_block *sb, 18763dcf5451SChristoph Hellwig ext4_group_t group) 18773dcf5451SChristoph Hellwig { 18783dcf5451SChristoph Hellwig struct ext4_group_info ***grp_info; 18793dcf5451SChristoph Hellwig long indexv, indexh; 18803dcf5451SChristoph Hellwig grp_info = EXT4_SB(sb)->s_group_info; 18813dcf5451SChristoph Hellwig indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb)); 18823dcf5451SChristoph Hellwig indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1); 18833dcf5451SChristoph Hellwig return grp_info[indexv][indexh]; 18843dcf5451SChristoph Hellwig } 18853dcf5451SChristoph Hellwig 18868df9675fSTheodore Ts'o /* 18878df9675fSTheodore Ts'o * Reading s_groups_count requires using smp_rmb() afterwards. See 18888df9675fSTheodore Ts'o * the locking protocol documented in the comments of ext4_group_add() 18898df9675fSTheodore Ts'o * in resize.c 18908df9675fSTheodore Ts'o */ 18918df9675fSTheodore Ts'o static inline ext4_group_t ext4_get_groups_count(struct super_block *sb) 18928df9675fSTheodore Ts'o { 18938df9675fSTheodore Ts'o ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; 18948df9675fSTheodore Ts'o 18958df9675fSTheodore Ts'o smp_rmb(); 18968df9675fSTheodore Ts'o return ngroups; 18978df9675fSTheodore Ts'o } 18983dcf5451SChristoph Hellwig 1899772cb7c8SJose R. Santos static inline ext4_group_t ext4_flex_group(struct ext4_sb_info *sbi, 1900772cb7c8SJose R. Santos ext4_group_t block_group) 1901772cb7c8SJose R. Santos { 1902772cb7c8SJose R. Santos return block_group >> sbi->s_log_groups_per_flex; 1903772cb7c8SJose R. Santos } 1904772cb7c8SJose R. Santos 1905772cb7c8SJose R. Santos static inline unsigned int ext4_flex_bg_size(struct ext4_sb_info *sbi) 1906772cb7c8SJose R. Santos { 1907772cb7c8SJose R. Santos return 1 << sbi->s_log_groups_per_flex; 1908772cb7c8SJose R. Santos } 1909772cb7c8SJose R. Santos 19103dcf5451SChristoph Hellwig #define ext4_std_error(sb, errno) \ 19113dcf5451SChristoph Hellwig do { \ 19123dcf5451SChristoph Hellwig if ((errno)) \ 1913c398eda0STheodore Ts'o __ext4_std_error((sb), __func__, __LINE__, (errno)); \ 19143dcf5451SChristoph Hellwig } while (0) 19153dcf5451SChristoph Hellwig 1916a30d542aSAneesh Kumar K.V #ifdef CONFIG_SMP 1917179f7ebfSEric Dumazet /* Each CPU can accumulate percpu_counter_batch blocks in their local 1918a30d542aSAneesh Kumar K.V * counters. So we need to make sure we have free blocks more 1919179f7ebfSEric Dumazet * than percpu_counter_batch * nr_cpu_ids. Also add a window of 4 times. 1920a30d542aSAneesh Kumar K.V */ 1921179f7ebfSEric Dumazet #define EXT4_FREEBLOCKS_WATERMARK (4 * (percpu_counter_batch * nr_cpu_ids)) 1922a30d542aSAneesh Kumar K.V #else 1923a30d542aSAneesh Kumar K.V #define EXT4_FREEBLOCKS_WATERMARK 0 1924a30d542aSAneesh Kumar K.V #endif 1925a30d542aSAneesh Kumar K.V 1926cf17fea6SAneesh Kumar K.V static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize) 1927cf17fea6SAneesh Kumar K.V { 1928cf17fea6SAneesh Kumar K.V /* 1929cf17fea6SAneesh Kumar K.V * XXX: replace with spinlock if seen contended -bzzz 1930cf17fea6SAneesh Kumar K.V */ 1931cf17fea6SAneesh Kumar K.V down_write(&EXT4_I(inode)->i_data_sem); 1932cf17fea6SAneesh Kumar K.V if (newsize > EXT4_I(inode)->i_disksize) 1933cf17fea6SAneesh Kumar K.V EXT4_I(inode)->i_disksize = newsize; 1934cf17fea6SAneesh Kumar K.V up_write(&EXT4_I(inode)->i_data_sem); 1935cf17fea6SAneesh Kumar K.V return ; 1936cf17fea6SAneesh Kumar K.V } 1937a30d542aSAneesh Kumar K.V 19385d1b1b3fSAneesh Kumar K.V struct ext4_group_info { 19395d1b1b3fSAneesh Kumar K.V unsigned long bb_state; 19405d1b1b3fSAneesh Kumar K.V struct rb_root bb_free_root; 1941a36b4498SEric Sandeen ext4_grpblk_t bb_first_free; /* first free block */ 1942a36b4498SEric Sandeen ext4_grpblk_t bb_free; /* total free blocks */ 1943a36b4498SEric Sandeen ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ 19448a57d9d6SCurt Wohlgemuth ext4_grpblk_t bb_largest_free_order;/* order of largest frag in BG */ 19455d1b1b3fSAneesh Kumar K.V struct list_head bb_prealloc_list; 19465d1b1b3fSAneesh Kumar K.V #ifdef DOUBLE_CHECK 19475d1b1b3fSAneesh Kumar K.V void *bb_bitmap; 19485d1b1b3fSAneesh Kumar K.V #endif 19495d1b1b3fSAneesh Kumar K.V struct rw_semaphore alloc_sem; 1950a36b4498SEric Sandeen ext4_grpblk_t bb_counters[]; /* Nr of free power-of-two-block 1951a36b4498SEric Sandeen * regions, index is order. 1952a36b4498SEric Sandeen * bb_counters[3] = 5 means 1953a36b4498SEric Sandeen * 5 free 8-block regions. */ 19545d1b1b3fSAneesh Kumar K.V }; 19555d1b1b3fSAneesh Kumar K.V 19565d1b1b3fSAneesh Kumar K.V #define EXT4_GROUP_INFO_NEED_INIT_BIT 0 19575d1b1b3fSAneesh Kumar K.V 19585d1b1b3fSAneesh Kumar K.V #define EXT4_MB_GRP_NEED_INIT(grp) \ 19595d1b1b3fSAneesh Kumar K.V (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) 19605d1b1b3fSAneesh Kumar K.V 196150797481STheodore Ts'o #define EXT4_MAX_CONTENTION 8 196250797481STheodore Ts'o #define EXT4_CONTENTION_THRESHOLD 2 196350797481STheodore Ts'o 1964955ce5f5SAneesh Kumar K.V static inline spinlock_t *ext4_group_lock_ptr(struct super_block *sb, 1965955ce5f5SAneesh Kumar K.V ext4_group_t group) 1966955ce5f5SAneesh Kumar K.V { 1967955ce5f5SAneesh Kumar K.V return bgl_lock_ptr(EXT4_SB(sb)->s_blockgroup_lock, group); 1968955ce5f5SAneesh Kumar K.V } 1969955ce5f5SAneesh Kumar K.V 197050797481STheodore Ts'o /* 197150797481STheodore Ts'o * Returns true if the filesystem is busy enough that attempts to 197250797481STheodore Ts'o * access the block group locks has run into contention. 197350797481STheodore Ts'o */ 197450797481STheodore Ts'o static inline int ext4_fs_is_busy(struct ext4_sb_info *sbi) 197550797481STheodore Ts'o { 197650797481STheodore Ts'o return (atomic_read(&sbi->s_lock_busy) > EXT4_CONTENTION_THRESHOLD); 197750797481STheodore Ts'o } 197850797481STheodore Ts'o 19795d1b1b3fSAneesh Kumar K.V static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group) 19805d1b1b3fSAneesh Kumar K.V { 198150797481STheodore Ts'o spinlock_t *lock = ext4_group_lock_ptr(sb, group); 198250797481STheodore Ts'o if (spin_trylock(lock)) 198350797481STheodore Ts'o /* 198450797481STheodore Ts'o * We're able to grab the lock right away, so drop the 198550797481STheodore Ts'o * lock contention counter. 198650797481STheodore Ts'o */ 198750797481STheodore Ts'o atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0); 198850797481STheodore Ts'o else { 198950797481STheodore Ts'o /* 199050797481STheodore Ts'o * The lock is busy, so bump the contention counter, 199150797481STheodore Ts'o * and then wait on the spin lock. 199250797481STheodore Ts'o */ 199350797481STheodore Ts'o atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, 1, 199450797481STheodore Ts'o EXT4_MAX_CONTENTION); 199550797481STheodore Ts'o spin_lock(lock); 199650797481STheodore Ts'o } 19975d1b1b3fSAneesh Kumar K.V } 19985d1b1b3fSAneesh Kumar K.V 19995d1b1b3fSAneesh Kumar K.V static inline void ext4_unlock_group(struct super_block *sb, 20005d1b1b3fSAneesh Kumar K.V ext4_group_t group) 20015d1b1b3fSAneesh Kumar K.V { 2002955ce5f5SAneesh Kumar K.V spin_unlock(ext4_group_lock_ptr(sb, group)); 20035d1b1b3fSAneesh Kumar K.V } 20045d1b1b3fSAneesh Kumar K.V 2005a0375156STheodore Ts'o static inline void ext4_mark_super_dirty(struct super_block *sb) 2006a0375156STheodore Ts'o { 2007a0375156STheodore Ts'o if (EXT4_SB(sb)->s_journal == NULL) 2008a0375156STheodore Ts'o sb->s_dirt =1; 2009a0375156STheodore Ts'o } 2010a0375156STheodore Ts'o 20113dcf5451SChristoph Hellwig /* 20123dcf5451SChristoph Hellwig * Inodes and files operations 20133dcf5451SChristoph Hellwig */ 20143dcf5451SChristoph Hellwig 20153dcf5451SChristoph Hellwig /* dir.c */ 20163dcf5451SChristoph Hellwig extern const struct file_operations ext4_dir_operations; 20173dcf5451SChristoph Hellwig 20183dcf5451SChristoph Hellwig /* file.c */ 20193dcf5451SChristoph Hellwig extern const struct inode_operations ext4_file_inode_operations; 20203dcf5451SChristoph Hellwig extern const struct file_operations ext4_file_operations; 2021e0d10bfaSToshiyuki Okajima extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin); 20223dcf5451SChristoph Hellwig 20233dcf5451SChristoph Hellwig /* namei.c */ 20243dcf5451SChristoph Hellwig extern const struct inode_operations ext4_dir_inode_operations; 20253dcf5451SChristoph Hellwig extern const struct inode_operations ext4_special_inode_operations; 2026596397b7STheodore Ts'o extern struct dentry *ext4_get_parent(struct dentry *child); 20273dcf5451SChristoph Hellwig 20283dcf5451SChristoph Hellwig /* symlink.c */ 20293dcf5451SChristoph Hellwig extern const struct inode_operations ext4_symlink_inode_operations; 20303dcf5451SChristoph Hellwig extern const struct inode_operations ext4_fast_symlink_inode_operations; 20313dcf5451SChristoph Hellwig 20326fd058f7STheodore Ts'o /* block_validity */ 20336fd058f7STheodore Ts'o extern void ext4_release_system_zone(struct super_block *sb); 20346fd058f7STheodore Ts'o extern int ext4_setup_system_zone(struct super_block *sb); 20355dabfc78STheodore Ts'o extern int __init ext4_init_system_zone(void); 20365dabfc78STheodore Ts'o extern void ext4_exit_system_zone(void); 20376fd058f7STheodore Ts'o extern int ext4_data_block_valid(struct ext4_sb_info *sbi, 20386fd058f7STheodore Ts'o ext4_fsblk_t start_blk, 20396fd058f7STheodore Ts'o unsigned int count); 20406fd058f7STheodore Ts'o 20413dcf5451SChristoph Hellwig /* extents.c */ 20423dcf5451SChristoph Hellwig extern int ext4_ext_tree_init(handle_t *handle, struct inode *); 20433dcf5451SChristoph Hellwig extern int ext4_ext_writepage_trans_blocks(struct inode *, int); 2044a02908f1SMingming Cao extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, 2045a02908f1SMingming Cao int chunk); 2046e35fd660STheodore Ts'o extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, 2047e35fd660STheodore Ts'o struct ext4_map_blocks *map, int flags); 2048cf108bcaSJan Kara extern void ext4_ext_truncate(struct inode *); 20493dcf5451SChristoph Hellwig extern void ext4_ext_init(struct super_block *); 20503dcf5451SChristoph Hellwig extern void ext4_ext_release(struct super_block *); 20513dcf5451SChristoph Hellwig extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, 20523dcf5451SChristoph Hellwig loff_t len); 20530031462bSMingming Cao extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, 2054a1de02dcSEric Sandeen ssize_t len); 2055e35fd660STheodore Ts'o extern int ext4_map_blocks(handle_t *handle, struct inode *inode, 2056e35fd660STheodore Ts'o struct ext4_map_blocks *map, int flags); 20573a06d778SAneesh Kumar K.V extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, 20583a06d778SAneesh Kumar K.V __u64 start, __u64 len); 2059748de673SAkira Fujita /* move_extent.c */ 2060748de673SAkira Fujita extern int ext4_move_extents(struct file *o_filp, struct file *d_filp, 2061748de673SAkira Fujita __u64 start_orig, __u64 start_donor, 2062748de673SAkira Fujita __u64 len, __u64 *moved_len); 2063748de673SAkira Fujita 2064bd2d0210STheodore Ts'o /* page-io.c */ 20655dabfc78STheodore Ts'o extern int __init ext4_init_pageio(void); 20665dabfc78STheodore Ts'o extern void ext4_exit_pageio(void); 2067f7ad6d2eSTheodore Ts'o extern void ext4_ioend_wait(struct inode *); 2068bd2d0210STheodore Ts'o extern void ext4_free_io_end(ext4_io_end_t *io); 2069bd2d0210STheodore Ts'o extern ext4_io_end_t *ext4_init_io_end(struct inode *inode, gfp_t flags); 2070bd2d0210STheodore Ts'o extern int ext4_end_io_nolock(ext4_io_end_t *io); 2071bd2d0210STheodore Ts'o extern void ext4_io_submit(struct ext4_io_submit *io); 2072bd2d0210STheodore Ts'o extern int ext4_bio_write_page(struct ext4_io_submit *io, 2073bd2d0210STheodore Ts'o struct page *page, 2074bd2d0210STheodore Ts'o int len, 2075bd2d0210STheodore Ts'o struct writeback_control *wbc); 20763a06d778SAneesh Kumar K.V 2077744692dcSJiaying Zhang /* BH_Uninit flag: blocks are allocated but uninitialized on disk */ 2078744692dcSJiaying Zhang enum ext4_state_bits { 2079744692dcSJiaying Zhang BH_Uninit /* blocks are allocated but uninitialized on disk */ 2080744692dcSJiaying Zhang = BH_JBDPrivateStart, 2081744692dcSJiaying Zhang }; 2082744692dcSJiaying Zhang 2083744692dcSJiaying Zhang BUFFER_FNS(Uninit, uninit) 2084744692dcSJiaying Zhang TAS_BUFFER_FNS(Uninit, uninit) 2085744692dcSJiaying Zhang 20862ccb5fb9SAneesh Kumar K.V /* 20872ccb5fb9SAneesh Kumar K.V * Add new method to test wether block and inode bitmaps are properly 20882ccb5fb9SAneesh Kumar K.V * initialized. With uninit_bg reading the block from disk is not enough 20892ccb5fb9SAneesh Kumar K.V * to mark the bitmap uptodate. We need to also zero-out the bitmap 20902ccb5fb9SAneesh Kumar K.V */ 20912ccb5fb9SAneesh Kumar K.V #define BH_BITMAP_UPTODATE BH_JBDPrivateStart 20922ccb5fb9SAneesh Kumar K.V 20932ccb5fb9SAneesh Kumar K.V static inline int bitmap_uptodate(struct buffer_head *bh) 20942ccb5fb9SAneesh Kumar K.V { 20952ccb5fb9SAneesh Kumar K.V return (buffer_uptodate(bh) && 20962ccb5fb9SAneesh Kumar K.V test_bit(BH_BITMAP_UPTODATE, &(bh)->b_state)); 20972ccb5fb9SAneesh Kumar K.V } 20982ccb5fb9SAneesh Kumar K.V static inline void set_bitmap_uptodate(struct buffer_head *bh) 20992ccb5fb9SAneesh Kumar K.V { 21002ccb5fb9SAneesh Kumar K.V set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state); 21012ccb5fb9SAneesh Kumar K.V } 21022ccb5fb9SAneesh Kumar K.V 2103731eb1a0SAkinobu Mita #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) 2104731eb1a0SAkinobu Mita 21053dcf5451SChristoph Hellwig #endif /* __KERNEL__ */ 21063dcf5451SChristoph Hellwig 21073dcf5451SChristoph Hellwig #endif /* _EXT4_H */ 2108