Blame view

fs/ext4/ext4.h 115 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2
  /*
3dcf54515   Christoph Hellwig   ext4: move header...
3
   *  ext4.h
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
4
5
6
7
8
9
10
11
12
13
14
15
   *
   * Copyright (C) 1992, 1993, 1994, 1995
   * Remy Card (card@masi.ibp.fr)
   * Laboratoire MASI - Institut Blaise Pascal
   * Universite Pierre et Marie Curie (Paris VI)
   *
   *  from
   *
   *  linux/include/linux/minix_fs.h
   *
   *  Copyright (C) 1991, 1992  Linus Torvalds
   */
3dcf54515   Christoph Hellwig   ext4: move header...
16
17
  #ifndef _EXT4_H
  #define _EXT4_H
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
18
19
  
  #include <linux/types.h>
3a5b2ecdd   Mingming Cao   [PATCH] ext4: swi...
20
  #include <linux/blkdev.h>
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
21
  #include <linux/magic.h>
2ccb5fb9f   Aneesh Kumar K.V   ext4: Use new buf...
22
  #include <linux/jbd2.h>
60e58e0f3   Mingming Cao   ext4: quota reser...
23
  #include <linux/quota.h>
d444c3c38   Theodore Ts'o   ext4: Move the ex...
24
25
26
27
  #include <linux/rwsem.h>
  #include <linux/rbtree.h>
  #include <linux/seqlock.h>
  #include <linux/mutex.h>
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
28
  #include <linux/timer.h>
a4dad1ae2   David Turner   ext4: Fix handlin...
29
  #include <linux/version.h>
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
30
  #include <linux/wait.h>
174cd4b1e   Ingo Molnar   sched/headers: Pr...
31
  #include <linux/sched/signal.h>
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
32
33
  #include <linux/blockgroup_lock.h>
  #include <linux/percpu_counter.h>
efbed4dc5   Theodore Ts'o   ext4: add ratelim...
34
  #include <linux/ratelimit.h>
0441984a3   Darrick J. Wong   ext4: load the cr...
35
  #include <crypto/hash.h>
46f47e480   Eric Biggers   fscrypt: split su...
36
37
38
39
40
  #ifdef CONFIG_EXT4_FS_ENCRYPTION
  #include <linux/fscrypt_supp.h>
  #else
  #include <linux/fscrypt_notsupp.h>
  #endif
a633f5a31   Lukas Czerner   ext4: translate f...
41
  #include <linux/falloc.h>
c8585c6fc   Daeho Jeong   ext4: fix races b...
42
  #include <linux/percpu-rwsem.h>
4d92dc0f0   Ben Hutchings   ext4: Fix compat ...
43
44
45
  #ifdef __KERNEL__
  #include <linux/compat.h>
  #endif
c9de560de   Alex Tomas   ext4: Add multi b...
46

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
47
  /*
8a35694e1   Shen Feng   ext4: fix comment...
48
   * The fourth extended filesystem constants/structures
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
49
50
51
   */
  
  /*
a2821e34d   Aihua Zhang   ext4: fix compile...
52
53
54
55
56
57
58
59
60
61
62
63
   * with AGGRESSIVE_CHECK allocator runs consistency checks over
   * structures. these checks slow things down a lot
   */
  #define AGGRESSIVE_CHECK__
  
  /*
   * with DOUBLE_CHECK defined mballoc creates persistent in-core
   * bitmaps, maintains and uses them to check for double allocations
   */
  #define DOUBLE_CHECK__
  
  /*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
64
   * Define EXT4FS_DEBUG to produce debug messages
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
65
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
66
  #undef EXT4FS_DEBUG
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
67
68
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
69
70
   * Debug code
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
71
72
  #ifdef EXT4FS_DEBUG
  #define ext4_debug(f, a...)						\
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
73
  	do {								\
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
74
  		printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:",	\
4db9c54a5   Stoyan Gaydarov   ext4: replace __F...
75
  			__FILE__, __LINE__, __func__);			\
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
76
  		printk(KERN_DEBUG f, ## a);				\
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
77
78
  	} while (0)
  #else
ace36ad43   Joe Perches   ext4: add no_prin...
79
  #define ext4_debug(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
80
  #endif
4a092d737   Theodore Ts'o   ext4: rationalize...
81
82
83
84
85
86
87
88
89
  /*
   * Turn on EXT_DEBUG to get lots of info about extents operations.
   */
  #define EXT_DEBUG__
  #ifdef EXT_DEBUG
  #define ext_debug(fmt, ...)	printk(fmt, ##__VA_ARGS__)
  #else
  #define ext_debug(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
  #endif
d444c3c38   Theodore Ts'o   ext4: Move the ex...
90
91
92
93
94
95
96
97
98
99
100
  /* data type for block offset of block group */
  typedef int ext4_grpblk_t;
  
  /* data type for filesystem-wide blocks number */
  typedef unsigned long long ext4_fsblk_t;
  
  /* data type for file logical block number */
  typedef __u32 ext4_lblk_t;
  
  /* data type for block group number */
  typedef unsigned int ext4_group_t;
331573feb   Namjae Jeon   ext4: Add support...
101
102
103
104
  enum SHIFT_DIRECTION {
  	SHIFT_LEFT = 0,
  	SHIFT_RIGHT,
  };
296c355cd   Theodore Ts'o   ext4: Use tracepo...
105
  /*
60e6679e2   Theodore Ts'o   ext4: Drop whites...
106
   * Flags used in mballoc's allocation_context flags field.
296c355cd   Theodore Ts'o   ext4: Use tracepo...
107
108
109
110
   *
   * Also used to show what's going on for debugging purposes when the
   * flag field is exported via the traceport interface
   */
d444c3c38   Theodore Ts'o   ext4: Move the ex...
111

c9de560de   Alex Tomas   ext4: Add multi b...
112
  /* prefer goal again. length */
0ef90db93   Theodore Ts'o   ext4: Display the...
113
  #define EXT4_MB_HINT_MERGE		0x0001
c9de560de   Alex Tomas   ext4: Add multi b...
114
  /* blocks already reserved */
0ef90db93   Theodore Ts'o   ext4: Display the...
115
  #define EXT4_MB_HINT_RESERVED		0x0002
c9de560de   Alex Tomas   ext4: Add multi b...
116
  /* metadata is being allocated */
0ef90db93   Theodore Ts'o   ext4: Display the...
117
  #define EXT4_MB_HINT_METADATA		0x0004
c9de560de   Alex Tomas   ext4: Add multi b...
118
  /* first blocks in the file */
0ef90db93   Theodore Ts'o   ext4: Display the...
119
  #define EXT4_MB_HINT_FIRST		0x0008
c9de560de   Alex Tomas   ext4: Add multi b...
120
  /* search for the best chunk */
0ef90db93   Theodore Ts'o   ext4: Display the...
121
  #define EXT4_MB_HINT_BEST		0x0010
c9de560de   Alex Tomas   ext4: Add multi b...
122
  /* data is being allocated */
0ef90db93   Theodore Ts'o   ext4: Display the...
123
  #define EXT4_MB_HINT_DATA		0x0020
c9de560de   Alex Tomas   ext4: Add multi b...
124
  /* don't preallocate (for tails) */
0ef90db93   Theodore Ts'o   ext4: Display the...
125
  #define EXT4_MB_HINT_NOPREALLOC		0x0040
c9de560de   Alex Tomas   ext4: Add multi b...
126
  /* allocate for locality group */
0ef90db93   Theodore Ts'o   ext4: Display the...
127
  #define EXT4_MB_HINT_GROUP_ALLOC	0x0080
c9de560de   Alex Tomas   ext4: Add multi b...
128
  /* allocate goal blocks or none */
0ef90db93   Theodore Ts'o   ext4: Display the...
129
  #define EXT4_MB_HINT_GOAL_ONLY		0x0100
c9de560de   Alex Tomas   ext4: Add multi b...
130
  /* goal is meaningful */
0ef90db93   Theodore Ts'o   ext4: Display the...
131
  #define EXT4_MB_HINT_TRY_GOAL		0x0200
d2a176379   Mingming Cao   ext4: delayed all...
132
  /* blocks already pre-reserved by delayed allocation */
0ef90db93   Theodore Ts'o   ext4: Display the...
133
  #define EXT4_MB_DELALLOC_RESERVED	0x0400
4ba74d00a   Theodore Ts'o   ext4: Fix bugs in...
134
135
  /* We are doing stream allocation */
  #define EXT4_MB_STREAM_ALLOC		0x0800
55f020db6   Allison Henderson   ext4: add flag to...
136
137
  /* Use reserved root blocks if needed */
  #define EXT4_MB_USE_ROOT_BLOCKS		0x1000
27dd43854   Lukas Czerner   ext4: introduce r...
138
139
  /* Use blocks from reserved pool */
  #define EXT4_MB_USE_RESERVED		0x2000
c9de560de   Alex Tomas   ext4: Add multi b...
140
141
142
143
  
  struct ext4_allocation_request {
  	/* target inode for block we're allocating */
  	struct inode *inode;
726447d80   Eric Sandeen   ext4: naturally a...
144
145
  	/* how many blocks we want to allocate */
  	unsigned int len;
c9de560de   Alex Tomas   ext4: Add multi b...
146
147
  	/* logical block in target inode */
  	ext4_lblk_t logical;
c9de560de   Alex Tomas   ext4: Add multi b...
148
149
  	/* the closest logical allocated block to the left */
  	ext4_lblk_t lleft;
c9de560de   Alex Tomas   ext4: Add multi b...
150
151
  	/* the closest logical allocated block to the right */
  	ext4_lblk_t lright;
726447d80   Eric Sandeen   ext4: naturally a...
152
153
154
155
156
  	/* phys. target (a hint) */
  	ext4_fsblk_t goal;
  	/* phys. block for the closest logical allocated block to the left */
  	ext4_fsblk_t pleft;
  	/* phys. block for the closest logical allocated block to the right */
c9de560de   Alex Tomas   ext4: Add multi b...
157
  	ext4_fsblk_t pright;
c9de560de   Alex Tomas   ext4: Add multi b...
158
  	/* flags. see above EXT4_MB_HINT_* */
498e5f241   Theodore Ts'o   ext4: Change unsi...
159
  	unsigned int flags;
c9de560de   Alex Tomas   ext4: Add multi b...
160
  };
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
161
  /*
e35fd6609   Theodore Ts'o   ext4: Add new abs...
162
163
164
165
166
167
168
169
170
171
   * Logical to physical block mapping, used by ext4_map_blocks()
   *
   * This structure is used to pass requests into ext4_map_blocks() as
   * well as to store the information returned by ext4_map_blocks().  It
   * takes less room on the stack than a struct buffer_head.
   */
  #define EXT4_MAP_NEW		(1 << BH_New)
  #define EXT4_MAP_MAPPED		(1 << BH_Mapped)
  #define EXT4_MAP_UNWRITTEN	(1 << BH_Unwritten)
  #define EXT4_MAP_BOUNDARY	(1 << BH_Boundary)
e35fd6609   Theodore Ts'o   ext4: Add new abs...
172
  #define EXT4_MAP_FLAGS		(EXT4_MAP_NEW | EXT4_MAP_MAPPED |\
cbd7584e6   Jan Kara   ext4: fix block r...
173
  				 EXT4_MAP_UNWRITTEN | EXT4_MAP_BOUNDARY)
e35fd6609   Theodore Ts'o   ext4: Add new abs...
174
175
176
177
178
179
180
181
182
  
  struct ext4_map_blocks {
  	ext4_fsblk_t m_pblk;
  	ext4_lblk_t m_lblk;
  	unsigned int m_len;
  	unsigned int m_flags;
  };
  
  /*
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
183
184
185
   * Flags for ext4_io_end->flags
   */
  #define	EXT4_IO_END_UNWRITTEN	0x0001
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
186

4188188bd   Curt Wohlgemuth   ext4: add comment...
187
  /*
556615dcb   Lukas Czerner   ext4: rename unin...
188
   * For converting unwritten extents on a work queue. 'handle' is used for
6b523df4f   Jan Kara   ext4: use transac...
189
   * buffered writeback.
4188188bd   Curt Wohlgemuth   ext4: add comment...
190
   */
0031462b5   Mingming Cao   ext4: Split unini...
191
  typedef struct ext4_io_end {
5b3ff237b   jiayingz@google.com (Jiaying Zhang) <>   ext4: move aio co...
192
  	struct list_head	list;		/* per-file finished IO list */
6b523df4f   Jan Kara   ext4: use transac...
193
194
  	handle_t		*handle;	/* handle reserved for extent
  						 * conversion */
0031462b5   Mingming Cao   ext4: Split unini...
195
  	struct inode		*inode;		/* file being written to */
b0857d309   Jan Kara   ext4: defer clear...
196
197
  	struct bio		*bio;		/* Linked list of completed
  						 * bios covering the extent */
8d5d02e6b   Mingming Cao   ext4: async direc...
198
  	unsigned int		flag;		/* unwritten or not */
3bd6ad7b6   Jan Kara   ext4: pack ioend ...
199
  	atomic_t		count;		/* reference counter */
a1de02dcc   Eric Sandeen   ext4: fix async i...
200
201
  	loff_t			offset;		/* offset in the file */
  	ssize_t			size;		/* size of the extent */
0031462b5   Mingming Cao   ext4: Split unini...
202
  } ext4_io_end_t;
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
203
  struct ext4_io_submit {
5a33911fa   Tejun Heo   ext4: replace ext...
204
  	struct writeback_control *io_wbc;
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
205
206
  	struct bio		*io_bio;
  	ext4_io_end_t		*io_end;
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
207
208
  	sector_t		io_next_block;
  };
b3a3ca8ca   Theodore Ts'o   ext4: Add new tra...
209
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
210
211
   * Special inodes numbers
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
212
213
  #define	EXT4_BAD_INO		 1	/* Bad blocks inode */
  #define EXT4_ROOT_INO		 2	/* Root inode */
ae8123068   Aditya Kali   ext4: reserve ino...
214
215
  #define EXT4_USR_QUOTA_INO	 3	/* User quota inode */
  #define EXT4_GRP_QUOTA_INO	 4	/* Group quota inode */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
216
217
218
219
  #define EXT4_BOOT_LOADER_INO	 5	/* Boot loader inode */
  #define EXT4_UNDEL_DIR_INO	 6	/* Undelete directory inode */
  #define EXT4_RESIZE_INO		 7	/* Reserved group descriptors inode */
  #define EXT4_JOURNAL_INO	 8	/* Journal inode */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
220

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
221
222
  /* First non-reserved inode for old ext4 filesystems */
  #define EXT4_GOOD_OLD_FIRST_INO	11
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
223
224
225
226
  
  /*
   * Maximal count of links to a file
   */
f8628a14a   Andreas Dilger   ext4: Remove 6500...
227
  #define EXT4_LINK_MAX		65000
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
228
229
230
231
  
  /*
   * Macro-instructions used to manage several block sizes
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
232
  #define EXT4_MIN_BLOCK_SIZE		1024
afc7cbca5   Takashi Sato   ext4: Support la...
233
234
  #define	EXT4_MAX_BLOCK_SIZE		65536
  #define EXT4_MIN_BLOCK_LOG_SIZE		10
fb1813f4a   Curt Wohlgemuth   ext4: use dedicat...
235
  #define EXT4_MAX_BLOCK_LOG_SIZE		16
9e47a4c9f   Theodore Ts'o   ext4: sanity chec...
236
  #define EXT4_MAX_CLUSTER_LOG_SIZE	30
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
237
  #ifdef __KERNEL__
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
238
  # define EXT4_BLOCK_SIZE(s)		((s)->s_blocksize)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
239
  #else
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
240
  # define EXT4_BLOCK_SIZE(s)		(EXT4_MIN_BLOCK_SIZE << (s)->s_log_block_size)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
241
  #endif
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
242
  #define	EXT4_ADDR_PER_BLOCK(s)		(EXT4_BLOCK_SIZE(s) / sizeof(__u32))
281b59959   Theodore Ts'o   ext4: read-only s...
243
244
  #define EXT4_CLUSTER_SIZE(s)		(EXT4_BLOCK_SIZE(s) << \
  					 EXT4_SB(s)->s_cluster_bits)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
245
  #ifdef __KERNEL__
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
246
  # define EXT4_BLOCK_SIZE_BITS(s)	((s)->s_blocksize_bits)
281b59959   Theodore Ts'o   ext4: read-only s...
247
  # define EXT4_CLUSTER_BITS(s)		(EXT4_SB(s)->s_cluster_bits)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
248
  #else
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
249
  # define EXT4_BLOCK_SIZE_BITS(s)	((s)->s_log_block_size + 10)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
250
251
  #endif
  #ifdef __KERNEL__
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
252
253
254
  #define	EXT4_ADDR_PER_BLOCK_BITS(s)	(EXT4_SB(s)->s_addr_per_block_bits)
  #define EXT4_INODE_SIZE(s)		(EXT4_SB(s)->s_inode_size)
  #define EXT4_FIRST_INO(s)		(EXT4_SB(s)->s_first_ino)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
255
  #else
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
256
257
  #define EXT4_INODE_SIZE(s)	(((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \
  				 EXT4_GOOD_OLD_INODE_SIZE : \
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
258
  				 (s)->s_inode_size)
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
259
260
  #define EXT4_FIRST_INO(s)	(((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \
  				 EXT4_GOOD_OLD_FIRST_INO : \
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
261
262
  				 (s)->s_first_ino)
  #endif
a2df2a634   Amit Arora   fallocate support...
263
  #define EXT4_BLOCK_ALIGN(size, blkbits)		ALIGN((size), (1 << (blkbits)))
518eaa638   Fabian Frederick   ext4: create EXT4...
264
265
266
  #define EXT4_MAX_BLOCKS(size, offset, blkbits) \
  	((EXT4_BLOCK_ALIGN(size + offset, blkbits) >> blkbits) - (offset >> \
  								  blkbits))
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
267

d5b8f3100   Theodore Ts'o   ext4: bigalloc ch...
268
269
270
271
272
273
274
  /* Translate a block number to a cluster number */
  #define EXT4_B2C(sbi, blk)	((blk) >> (sbi)->s_cluster_bits)
  /* Translate a cluster number to a block number */
  #define EXT4_C2B(sbi, cluster)	((cluster) << (sbi)->s_cluster_bits)
  /* Translate # of blks to # of clusters */
  #define EXT4_NUM_B2C(sbi, blks)	(((blks) + (sbi)->s_cluster_ratio - 1) >> \
  				 (sbi)->s_cluster_bits)
f5a44db5d   Theodore Ts'o   ext4: add explici...
275
276
277
278
279
280
281
282
283
284
  /* Mask out the low bits to get the starting block of the cluster */
  #define EXT4_PBLK_CMASK(s, pblk) ((pblk) &				\
  				  ~((ext4_fsblk_t) (s)->s_cluster_ratio - 1))
  #define EXT4_LBLK_CMASK(s, lblk) ((lblk) &				\
  				  ~((ext4_lblk_t) (s)->s_cluster_ratio - 1))
  /* Get the cluster offset */
  #define EXT4_PBLK_COFF(s, pblk) ((pblk) &				\
  				 ((ext4_fsblk_t) (s)->s_cluster_ratio - 1))
  #define EXT4_LBLK_COFF(s, lblk) ((lblk) &				\
  				 ((ext4_lblk_t) (s)->s_cluster_ratio - 1))
d5b8f3100   Theodore Ts'o   ext4: bigalloc ch...
285

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
286
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
287
288
   * Structure of a blocks group descriptor
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
289
  struct ext4_group_desc
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
290
  {
3a14589cc   Aneesh Kumar K.V   ext4: Convert bg_...
291
  	__le32	bg_block_bitmap_lo;	/* Blocks bitmap block */
5272f8372   Aneesh Kumar K.V   ext4: Convert bg_...
292
293
  	__le32	bg_inode_bitmap_lo;	/* Inodes bitmap block */
  	__le32	bg_inode_table_lo;	/* Inodes table block */
560671a0d   Aneesh Kumar K.V   ext4: Use high 16...
294
295
296
  	__le16	bg_free_blocks_count_lo;/* Free blocks count */
  	__le16	bg_free_inodes_count_lo;/* Free inodes count */
  	__le16	bg_used_dirs_count_lo;	/* Directories count */
717d50e49   Andreas Dilger   Ext4: Uninitializ...
297
  	__le16	bg_flags;		/* EXT4_BG_flags (INODE_UNINIT, etc) */
e61539189   Darrick J. Wong   ext4: change on-d...
298
299
300
  	__le32  bg_exclude_bitmap_lo;   /* Exclude bitmap for snapshots */
  	__le16  bg_block_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+bbitmap) LE */
  	__le16  bg_inode_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+ibitmap) LE */
560671a0d   Aneesh Kumar K.V   ext4: Use high 16...
301
  	__le16  bg_itable_unused_lo;	/* Unused inodes count */
717d50e49   Andreas Dilger   Ext4: Uninitializ...
302
  	__le16  bg_checksum;		/* crc16(sb_uuid+group+desc) */
8fadc1432   Alexandre Ratchov   [PATCH] ext4: mov...
303
304
305
  	__le32	bg_block_bitmap_hi;	/* Blocks bitmap block MSB */
  	__le32	bg_inode_bitmap_hi;	/* Inodes bitmap block MSB */
  	__le32	bg_inode_table_hi;	/* Inodes table block MSB */
91b51a018   Coly Li   ext4: sync up blo...
306
307
308
  	__le16	bg_free_blocks_count_hi;/* Free blocks count MSB */
  	__le16	bg_free_inodes_count_hi;/* Free inodes count MSB */
  	__le16	bg_used_dirs_count_hi;	/* Directories count MSB */
560671a0d   Aneesh Kumar K.V   ext4: Use high 16...
309
  	__le16  bg_itable_unused_hi;    /* Unused inodes count MSB */
e61539189   Darrick J. Wong   ext4: change on-d...
310
311
312
313
  	__le32  bg_exclude_bitmap_hi;   /* Exclude bitmap block MSB */
  	__le16  bg_block_bitmap_csum_hi;/* crc32c(s_uuid+grp_num+bbitmap) BE */
  	__le16  bg_inode_bitmap_csum_hi;/* crc32c(s_uuid+grp_num+ibitmap) BE */
  	__u32   bg_reserved;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
314
  };
41a246d1f   Darrick J. Wong   ext4: calculate a...
315
316
317
318
319
320
  #define EXT4_BG_INODE_BITMAP_CSUM_HI_END	\
  	(offsetof(struct ext4_group_desc, bg_inode_bitmap_csum_hi) + \
  	 sizeof(__le16))
  #define EXT4_BG_BLOCK_BITMAP_CSUM_HI_END	\
  	(offsetof(struct ext4_group_desc, bg_block_bitmap_csum_hi) + \
  	 sizeof(__le16))
772cb7c83   Jose R. Santos   ext4: New inode a...
321
322
323
324
325
  /*
   * Structure of a flex block group info
   */
  
  struct flex_groups {
90ba983f6   Theodore Ts'o   ext4: use atomic6...
326
327
328
  	atomic64_t	free_clusters;
  	atomic_t	free_inodes;
  	atomic_t	used_dirs;
772cb7c83   Jose R. Santos   ext4: New inode a...
329
  };
717d50e49   Andreas Dilger   Ext4: Uninitializ...
330
331
332
  #define EXT4_BG_INODE_UNINIT	0x0001 /* Inode table/bitmap not in use */
  #define EXT4_BG_BLOCK_UNINIT	0x0002 /* Block bitmap not in use */
  #define EXT4_BG_INODE_ZEROED	0x0004 /* On-disk itable initialized to zero */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
333
334
335
  /*
   * Macro-instructions used to manage group descriptors
   */
0d1ee42f2   Alexandre Ratchov   [PATCH] ext4: all...
336
  #define EXT4_MIN_DESC_SIZE		32
8fadc1432   Alexandre Ratchov   [PATCH] ext4: mov...
337
  #define EXT4_MIN_DESC_SIZE_64BIT	64
0d1ee42f2   Alexandre Ratchov   [PATCH] ext4: all...
338
339
  #define	EXT4_MAX_DESC_SIZE		EXT4_MIN_BLOCK_SIZE
  #define EXT4_DESC_SIZE(s)		(EXT4_SB(s)->s_desc_size)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
340
  #ifdef __KERNEL__
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
341
  # define EXT4_BLOCKS_PER_GROUP(s)	(EXT4_SB(s)->s_blocks_per_group)
281b59959   Theodore Ts'o   ext4: read-only s...
342
  # define EXT4_CLUSTERS_PER_GROUP(s)	(EXT4_SB(s)->s_clusters_per_group)
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
343
344
345
  # define EXT4_DESC_PER_BLOCK(s)		(EXT4_SB(s)->s_desc_per_block)
  # define EXT4_INODES_PER_GROUP(s)	(EXT4_SB(s)->s_inodes_per_group)
  # define EXT4_DESC_PER_BLOCK_BITS(s)	(EXT4_SB(s)->s_desc_per_block_bits)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
346
  #else
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
347
  # define EXT4_BLOCKS_PER_GROUP(s)	((s)->s_blocks_per_group)
0d1ee42f2   Alexandre Ratchov   [PATCH] ext4: all...
348
  # define EXT4_DESC_PER_BLOCK(s)		(EXT4_BLOCK_SIZE(s) / EXT4_DESC_SIZE(s))
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
349
  # define EXT4_INODES_PER_GROUP(s)	((s)->s_inodes_per_group)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
350
351
352
353
354
  #endif
  
  /*
   * Constants relative to the data blocks
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
355
356
357
358
359
  #define	EXT4_NDIR_BLOCKS		12
  #define	EXT4_IND_BLOCK			EXT4_NDIR_BLOCKS
  #define	EXT4_DIND_BLOCK			(EXT4_IND_BLOCK + 1)
  #define	EXT4_TIND_BLOCK			(EXT4_DIND_BLOCK + 1)
  #define	EXT4_N_BLOCKS			(EXT4_TIND_BLOCK + 1)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
360
361
362
363
  
  /*
   * Inode flags
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
364
365
366
367
368
369
370
371
  #define	EXT4_SECRM_FL			0x00000001 /* Secure deletion */
  #define	EXT4_UNRM_FL			0x00000002 /* Undelete */
  #define	EXT4_COMPR_FL			0x00000004 /* Compress file */
  #define EXT4_SYNC_FL			0x00000008 /* Synchronous updates */
  #define EXT4_IMMUTABLE_FL		0x00000010 /* Immutable file */
  #define EXT4_APPEND_FL			0x00000020 /* writes to file may only append */
  #define EXT4_NODUMP_FL			0x00000040 /* do not dump file */
  #define EXT4_NOATIME_FL			0x00000080 /* do not update atime */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
372
  /* Reserved for compression usage... */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
373
374
375
  #define EXT4_DIRTY_FL			0x00000100
  #define EXT4_COMPRBLK_FL		0x00000200 /* One or more compressed clusters */
  #define EXT4_NOCOMPR_FL			0x00000400 /* Don't compress */
3edc18d84   Theodore Ts'o   ext4: reserve cod...
376
377
  	/* nb: was previously EXT2_ECOMPR_FL */
  #define EXT4_ENCRYPT_FL			0x00000800 /* encrypted file */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
378
  /* End compression flags --- maybe not all used */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
379
380
381
382
383
384
  #define EXT4_INDEX_FL			0x00001000 /* hash-indexed directory */
  #define EXT4_IMAGIC_FL			0x00002000 /* AFS directory */
  #define EXT4_JOURNAL_DATA_FL		0x00004000 /* file data should be journaled */
  #define EXT4_NOTAIL_FL			0x00008000 /* file tail should not be merged */
  #define EXT4_DIRSYNC_FL			0x00010000 /* dirsync behaviour (directories only) */
  #define EXT4_TOPDIR_FL			0x00020000 /* Top of directory hierarchies*/
8180a5627   Aneesh Kumar K.V   ext4: Support lar...
385
  #define EXT4_HUGE_FILE_FL               0x00040000 /* Set to each huge file */
a86c61812   Alex Tomas   [PATCH] ext3: add...
386
  #define EXT4_EXTENTS_FL			0x00080000 /* Inode uses extents */
f710b4b96   Theodore Ts'o   ext4: Reserve INC...
387
  #define EXT4_EA_INODE_FL	        0x00200000 /* Inode used for large EA */
c8d46e41b   Jiaying Zhang   ext4: Add flag to...
388
  #define EXT4_EOFBLOCKS_FL		0x00400000 /* Blocks allocated beyond EOF */
67cf5b09a   Tao Ma   ext4: add the bas...
389
  #define EXT4_INLINE_DATA_FL		0x10000000 /* Inode has inline data. */
8b4953e13   Theodore Ts'o   ext4: reserve cod...
390
  #define EXT4_PROJINHERIT_FL		0x20000000 /* Create with parents projid */
8180a5627   Aneesh Kumar K.V   ext4: Support lar...
391
  #define EXT4_RESERVED_FL		0x80000000 /* reserved for ext4 lib */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
392

040cb3786   Li Xi   ext4: adds projec...
393
  #define EXT4_FL_USER_VISIBLE		0x304BDFFF /* User visible flags */
f8011d93a   Jan Kara   ext4: add EXT4_JO...
394
  #define EXT4_FL_USER_MODIFIABLE		0x204BC0FF /* User modifiable flags */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
395

d14e7683e   Jan Kara   ext4: be more str...
396
  /* Flags we can manipulate with through EXT4_IOC_FSSETXATTR */
9b7365fc1   Li Xi   ext4: add FS_IOC_...
397
398
399
400
401
402
  #define EXT4_FL_XFLAG_VISIBLE		(EXT4_SYNC_FL | \
  					 EXT4_IMMUTABLE_FL | \
  					 EXT4_APPEND_FL | \
  					 EXT4_NODUMP_FL | \
  					 EXT4_NOATIME_FL | \
  					 EXT4_PROJINHERIT_FL)
8fa43a81b   Duane Griffin   ext4: don't inher...
403
404
  /* Flags that should be inherited by new inodes from their parent. */
  #define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
1cd9f0976   Theodore Ts'o   ext2,ext3,ext4: d...
405
  			   EXT4_SYNC_FL | EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
8fa43a81b   Duane Griffin   ext4: don't inher...
406
  			   EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\
040cb3786   Li Xi   ext4: adds projec...
407
408
  			   EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL |\
  			   EXT4_PROJINHERIT_FL)
8fa43a81b   Duane Griffin   ext4: don't inher...
409

2dc6b0d48   Duane Griffin   ext4: tighten res...
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
  /* Flags that are appropriate for regular files (all but dir-specific ones). */
  #define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL))
  
  /* Flags that are appropriate for non-directories/regular files. */
  #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)
  
  /* Mask out flags that are inappropriate for the given type of inode. */
  static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)
  {
  	if (S_ISDIR(mode))
  		return flags;
  	else if (S_ISREG(mode))
  		return flags & EXT4_REG_FLMASK;
  	else
  		return flags & EXT4_OTHER_FLMASK;
  }
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
  /*
   * Inode flags used for atomic set/get
   */
  enum {
  	EXT4_INODE_SECRM	= 0,	/* Secure deletion */
  	EXT4_INODE_UNRM		= 1,	/* Undelete */
  	EXT4_INODE_COMPR	= 2,	/* Compress file */
  	EXT4_INODE_SYNC		= 3,	/* Synchronous updates */
  	EXT4_INODE_IMMUTABLE	= 4,	/* Immutable file */
  	EXT4_INODE_APPEND	= 5,	/* writes to file may only append */
  	EXT4_INODE_NODUMP	= 6,	/* do not dump file */
  	EXT4_INODE_NOATIME	= 7,	/* do not update atime */
  /* Reserved for compression usage... */
  	EXT4_INODE_DIRTY	= 8,
  	EXT4_INODE_COMPRBLK	= 9,	/* One or more compressed clusters */
  	EXT4_INODE_NOCOMPR	= 10,	/* Don't compress */
f542fbe8d   Theodore Ts'o   ext4 crypto: rese...
442
  	EXT4_INODE_ENCRYPT	= 11,	/* Encrypted file */
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
443
444
445
446
447
448
449
450
451
452
453
  /* End compression flags --- maybe not all used */
  	EXT4_INODE_INDEX	= 12,	/* hash-indexed directory */
  	EXT4_INODE_IMAGIC	= 13,	/* AFS directory */
  	EXT4_INODE_JOURNAL_DATA	= 14,	/* file data should be journaled */
  	EXT4_INODE_NOTAIL	= 15,	/* file tail should not be merged */
  	EXT4_INODE_DIRSYNC	= 16,	/* dirsync behaviour (directories only) */
  	EXT4_INODE_TOPDIR	= 17,	/* Top of directory hierarchies*/
  	EXT4_INODE_HUGE_FILE	= 18,	/* Set to each huge file */
  	EXT4_INODE_EXTENTS	= 19,	/* Inode uses extents */
  	EXT4_INODE_EA_INODE	= 21,	/* Inode used for large EA */
  	EXT4_INODE_EOFBLOCKS	= 22,	/* Blocks allocated beyond EOF */
67cf5b09a   Tao Ma   ext4: add the bas...
454
  	EXT4_INODE_INLINE_DATA	= 28,	/* Data in inode. */
8b4953e13   Theodore Ts'o   ext4: reserve cod...
455
  	EXT4_INODE_PROJINHERIT	= 29,	/* Create with parents projid */
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
456
457
  	EXT4_INODE_RESERVED	= 31,	/* reserved for ext4 lib */
  };
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
458
  /*
9a4c80194   Carlos Maiolino   ext4: ensure Inod...
459
460
461
462
463
464
465
466
467
   * Since it's pretty easy to mix up bit numbers and hex values, we use a
   * build-time check to make sure that EXT4_XXX_FL is consistent with respect to
   * EXT4_INODE_XXX. If all is well, the macros will be dropped, so, it won't cost
   * any extra space in the compiled kernel image, otherwise, the build will fail.
   * It's important that these values are the same, since we are using
   * EXT4_INODE_XXX to test for flag values, but EXT4_XXX_FL must be consistent
   * with the values of FS_XXX_FL defined in include/linux/fs.h and the on-disk
   * values found in ext2, ext3 and ext4 filesystems, and of course the values
   * defined in e2fsprogs.
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
468
469
470
   *
   * It's not paranoia if the Murphy's Law really *is* out to get you.  :-)
   */
9a4c80194   Carlos Maiolino   ext4: ensure Inod...
471
472
  #define TEST_FLAG_VALUE(FLAG) (EXT4_##FLAG##_FL == (1 << EXT4_INODE_##FLAG))
  #define CHECK_FLAG_VALUE(FLAG) BUILD_BUG_ON(!TEST_FLAG_VALUE(FLAG))
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
473
474
475
476
477
478
479
480
481
482
483
484
485
  static inline void ext4_check_flag_values(void)
  {
  	CHECK_FLAG_VALUE(SECRM);
  	CHECK_FLAG_VALUE(UNRM);
  	CHECK_FLAG_VALUE(COMPR);
  	CHECK_FLAG_VALUE(SYNC);
  	CHECK_FLAG_VALUE(IMMUTABLE);
  	CHECK_FLAG_VALUE(APPEND);
  	CHECK_FLAG_VALUE(NODUMP);
  	CHECK_FLAG_VALUE(NOATIME);
  	CHECK_FLAG_VALUE(DIRTY);
  	CHECK_FLAG_VALUE(COMPRBLK);
  	CHECK_FLAG_VALUE(NOCOMPR);
3edc18d84   Theodore Ts'o   ext4: reserve cod...
486
  	CHECK_FLAG_VALUE(ENCRYPT);
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
487
488
489
490
491
492
493
494
495
496
  	CHECK_FLAG_VALUE(INDEX);
  	CHECK_FLAG_VALUE(IMAGIC);
  	CHECK_FLAG_VALUE(JOURNAL_DATA);
  	CHECK_FLAG_VALUE(NOTAIL);
  	CHECK_FLAG_VALUE(DIRSYNC);
  	CHECK_FLAG_VALUE(TOPDIR);
  	CHECK_FLAG_VALUE(HUGE_FILE);
  	CHECK_FLAG_VALUE(EXTENTS);
  	CHECK_FLAG_VALUE(EA_INODE);
  	CHECK_FLAG_VALUE(EOFBLOCKS);
67cf5b09a   Tao Ma   ext4: add the bas...
497
  	CHECK_FLAG_VALUE(INLINE_DATA);
8b4953e13   Theodore Ts'o   ext4: reserve cod...
498
  	CHECK_FLAG_VALUE(PROJINHERIT);
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
499
500
  	CHECK_FLAG_VALUE(RESERVED);
  }
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
501
  /* Used to pass group descriptor data when online resize is done */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
502
  struct ext4_new_group_input {
8c55e2041   Dave Kleikamp   EXT4: Fix whitespace
503
504
505
506
507
508
  	__u32 group;		/* Group number for this data */
  	__u64 block_bitmap;	/* Absolute block number of block bitmap */
  	__u64 inode_bitmap;	/* Absolute block number of inode bitmap */
  	__u64 inode_table;	/* Absolute block number of inode table start */
  	__u32 blocks_count;	/* Total number of blocks in this group */
  	__u16 reserved_blocks;	/* Number of reserved blocks in this group */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
509
510
  	__u16 unused;
  };
4d92dc0f0   Ben Hutchings   ext4: Fix compat ...
511
512
513
514
515
516
517
518
519
520
521
  #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
  struct compat_ext4_new_group_input {
  	u32 group;
  	compat_u64 block_bitmap;
  	compat_u64 inode_bitmap;
  	compat_u64 inode_table;
  	u32 blocks_count;
  	u16 reserved_blocks;
  	u16 unused;
  };
  #endif
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
522
523
  /* The struct ext4_new_group_input in kernel space, with free_blocks_count */
  struct ext4_new_group_data {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
524
  	__u32 group;
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
525
526
527
  	__u64 block_bitmap;
  	__u64 inode_bitmap;
  	__u64 inode_table;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
528
529
530
531
532
  	__u32 blocks_count;
  	__u16 reserved_blocks;
  	__u16 unused;
  	__u32 free_blocks_count;
  };
33afdcc54   Yongqiang Yang   ext4: add a funct...
533
534
535
536
537
538
539
  /* Indexes used to index group tables in ext4_new_group_data */
  enum {
  	BLOCK_BITMAP = 0,	/* block bitmap */
  	INODE_BITMAP,		/* inode bitmap */
  	INODE_TABLE,		/* inode tables */
  	GROUP_TABLE_COUNT,
  };
a2df2a634   Amit Arora   fallocate support...
540
  /*
79e830367   Eric Sandeen   ext4: fix ext4_ge...
541
   * Flags used by ext4_map_blocks()
a2df2a634   Amit Arora   fallocate support...
542
   */
556615dcb   Lukas Czerner   ext4: rename unin...
543
  	/* Allocate any needed blocks and/or convert an unwritten
c21770573   Theodore Ts'o   ext4: Define a ne...
544
  	   extent to be an initialized ext4 */
2ac3b6e00   Theodore Ts'o   ext4: Clean up ex...
545
  #define EXT4_GET_BLOCKS_CREATE			0x0001
556615dcb   Lukas Czerner   ext4: rename unin...
546
547
548
  	/* Request the creation of an unwritten extent */
  #define EXT4_GET_BLOCKS_UNWRIT_EXT		0x0002
  #define EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT	(EXT4_GET_BLOCKS_UNWRIT_EXT|\
c21770573   Theodore Ts'o   ext4: Define a ne...
549
  						 EXT4_GET_BLOCKS_CREATE)
27dd43854   Lukas Czerner   ext4: introduce r...
550
551
  	/* Caller is from the delayed allocation writeout path
  	 * finally doing the actual allocation of delayed blocks */
03f5d8bcf   Jan Kara   ext4: Get rid of ...
552
  #define EXT4_GET_BLOCKS_DELALLOC_RESERVE	0x0004
0031462b5   Mingming Cao   ext4: Split unini...
553
  	/* caller is from the direct IO path, request to creation of an
556615dcb   Lukas Czerner   ext4: rename unin...
554
  	unwritten extents if not allocated, split the unwritten
0031462b5   Mingming Cao   ext4: Split unini...
555
  	extent if blocks has been preallocated already*/
c7064ef13   Jiaying Zhang   ext4: mechanical ...
556
  #define EXT4_GET_BLOCKS_PRE_IO			0x0008
1296cc85c   Aneesh Kumar K.V   ext4: Drop EXT4_G...
557
  #define EXT4_GET_BLOCKS_CONVERT			0x0010
c7064ef13   Jiaying Zhang   ext4: mechanical ...
558
  #define EXT4_GET_BLOCKS_IO_CREATE_EXT		(EXT4_GET_BLOCKS_PRE_IO|\
556615dcb   Lukas Czerner   ext4: rename unin...
559
  					 EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT)
c7064ef13   Jiaying Zhang   ext4: mechanical ...
560
561
  	/* Convert extent to initialized after IO complete */
  #define EXT4_GET_BLOCKS_IO_CONVERT_EXT		(EXT4_GET_BLOCKS_CONVERT|\
556615dcb   Lukas Czerner   ext4: rename unin...
562
  					 EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT)
27dd43854   Lukas Czerner   ext4: introduce r...
563
564
565
  	/* Eventual metadata allocation (due to growing extent tree)
  	 * should not fail, so try to use reserved blocks for that.*/
  #define EXT4_GET_BLOCKS_METADATA_NOFAIL		0x0020
556b27abf   Vivek Haldar   ext4: do not norm...
566
567
  	/* Don't normalize allocation size (used for fallocate) */
  #define EXT4_GET_BLOCKS_NO_NORMALIZE		0x0040
a4e5d88b1   Dmitry Monakhov   ext4: update EOFB...
568
569
  	/* Request will not result in inode size update (user for fallocate) */
  #define EXT4_GET_BLOCKS_KEEP_SIZE		0x0080
b8a868450   Lukas Czerner   ext4: Introduce F...
570
  	/* Convert written extents to unwritten */
2dcba4781   Jan Kara   ext4: get rid of ...
571
  #define EXT4_GET_BLOCKS_CONVERT_UNWRITTEN	0x0100
c86d8db33   Jan Kara   ext4: implement a...
572
573
574
575
  	/* Write zeros to newly created written extents */
  #define EXT4_GET_BLOCKS_ZERO			0x0200
  #define EXT4_GET_BLOCKS_CREATE_ZERO		(EXT4_GET_BLOCKS_CREATE |\
  					EXT4_GET_BLOCKS_ZERO)
ee0876bc6   Jan Kara   ext4: do not ask ...
576
577
578
  	/* Caller will submit data before dropping transaction handle. This
  	 * allows jbd2 to avoid submitting data before commit. */
  #define EXT4_GET_BLOCKS_IO_SUBMIT		0x0400
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
579
580
  
  /*
7869a4a6c   Theodore Ts'o   ext4: add support...
581
   * The bit position of these flags must not overlap with any of the
ed8a1a766   Theodore Ts'o   ext4: rename ext4...
582
   * EXT4_GET_BLOCKS_*.  They are used by ext4_find_extent(),
107a7bd31   Theodore Ts'o   ext4: cache all o...
583
   * read_extent_tree_block(), ext4_split_extent_at(),
7869a4a6c   Theodore Ts'o   ext4: add support...
584
585
586
587
   * ext4_ext_insert_extent(), and ext4_ext_create_new_leaf().
   * EXT4_EX_NOCACHE is used to indicate that the we shouldn't be
   * caching the extents when reading from the extent tree while a
   * truncate or punch hole operation is in progress.
107a7bd31   Theodore Ts'o   ext4: cache all o...
588
   */
d26e2c4d7   Theodore Ts'o   ext4: renumber EX...
589
590
  #define EXT4_EX_NOCACHE				0x40000000
  #define EXT4_EX_FORCE_CACHE			0x20000000
107a7bd31   Theodore Ts'o   ext4: cache all o...
591
592
  
  /*
e6362609b   Theodore Ts'o   ext4: call ext4_f...
593
594
595
596
   * Flags used by ext4_free_blocks
   */
  #define EXT4_FREE_BLOCKS_METADATA	0x0001
  #define EXT4_FREE_BLOCKS_FORGET		0x0002
1f2acb601   Theodore Ts'o   ext4: Add block v...
597
  #define EXT4_FREE_BLOCKS_VALIDATED	0x0004
7132de744   Maxim Patlasov   ext4: fix i_block...
598
  #define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE	0x0008
84130193e   Theodore Ts'o   ext4: teach ext4_...
599
600
  #define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER	0x0010
  #define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER	0x0020
e6362609b   Theodore Ts'o   ext4: call ext4_f...
601
602
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
603
604
   * ioctl commands
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
605
606
607
608
  #define	EXT4_IOC_GETFLAGS		FS_IOC_GETFLAGS
  #define	EXT4_IOC_SETFLAGS		FS_IOC_SETFLAGS
  #define	EXT4_IOC_GETVERSION		_IOR('f', 3, long)
  #define	EXT4_IOC_SETVERSION		_IOW('f', 4, long)
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
609
610
  #define	EXT4_IOC_GETVERSION_OLD		FS_IOC_GETVERSION
  #define	EXT4_IOC_SETVERSION_OLD		FS_IOC_SETVERSION
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
611
612
  #define EXT4_IOC_GETRSVSZ		_IOR('f', 5, long)
  #define EXT4_IOC_SETRSVSZ		_IOW('f', 6, long)
8eea80d52   Theodore Ts'o   ext4: Renumber EX...
613
614
615
  #define EXT4_IOC_GROUP_EXTEND		_IOW('f', 7, unsigned long)
  #define EXT4_IOC_GROUP_ADD		_IOW('f', 8, struct ext4_new_group_input)
  #define EXT4_IOC_MIGRATE		_IO('f', 9)
ccd2506bd   Theodore Ts'o   ext4: add EXT4_IO...
616
   /* note ioctl 10 reserved for an early version of the FIEMAP ioctl */
8eea80d52   Theodore Ts'o   ext4: Renumber EX...
617
   /* note ioctl 11 reserved for filesystem-independent FIEMAP ioctl */
ccd2506bd   Theodore Ts'o   ext4: add EXT4_IO...
618
  #define EXT4_IOC_ALLOC_DA_BLKS		_IO('f', 12)
748de6736   Akira Fujita   ext4: online defr...
619
  #define EXT4_IOC_MOVE_EXT		_IOWR('f', 15, struct move_extent)
19c5246d2   Yongqiang Yang   ext4: add new onl...
620
  #define EXT4_IOC_RESIZE_FS		_IOW('f', 16, __u64)
393d1d1d7   Dr. Tilmann Bubeck   ext4: implementat...
621
  #define EXT4_IOC_SWAP_BOOT		_IO('f', 17)
7869a4a6c   Theodore Ts'o   ext4: add support...
622
  #define EXT4_IOC_PRECACHE_EXTENTS	_IO('f', 18)
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
623
624
625
  #define EXT4_IOC_SET_ENCRYPTION_POLICY	FS_IOC_SET_ENCRYPTION_POLICY
  #define EXT4_IOC_GET_ENCRYPTION_PWSALT	FS_IOC_GET_ENCRYPTION_PWSALT
  #define EXT4_IOC_GET_ENCRYPTION_POLICY	FS_IOC_GET_ENCRYPTION_POLICY
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
626

9b7365fc1   Li Xi   ext4: add FS_IOC_...
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
  #ifndef FS_IOC_FSGETXATTR
  /* Until the uapi changes get merged for project quota... */
  
  #define FS_IOC_FSGETXATTR		_IOR('X', 31, struct fsxattr)
  #define FS_IOC_FSSETXATTR		_IOW('X', 32, struct fsxattr)
  
  /*
   * Structure for FS_IOC_FSGETXATTR and FS_IOC_FSSETXATTR.
   */
  struct fsxattr {
  	__u32		fsx_xflags;	/* xflags field value (get/set) */
  	__u32		fsx_extsize;	/* extsize field value (get/set)*/
  	__u32		fsx_nextents;	/* nextents field value (get)	*/
  	__u32		fsx_projid;	/* project identifier (get/set) */
  	unsigned char	fsx_pad[12];
  };
  
  /*
   * Flags for the fsx_xflags field
   */
  #define FS_XFLAG_REALTIME	0x00000001	/* data in realtime volume */
  #define FS_XFLAG_PREALLOC	0x00000002	/* preallocated file extents */
  #define FS_XFLAG_IMMUTABLE	0x00000008	/* file cannot be modified */
  #define FS_XFLAG_APPEND		0x00000010	/* all writes append */
  #define FS_XFLAG_SYNC		0x00000020	/* all writes synchronous */
  #define FS_XFLAG_NOATIME	0x00000040	/* do not update access time */
  #define FS_XFLAG_NODUMP		0x00000080	/* do not include in backups */
  #define FS_XFLAG_RTINHERIT	0x00000100	/* create with rt bit set */
  #define FS_XFLAG_PROJINHERIT	0x00000200	/* create with parents projid */
  #define FS_XFLAG_NOSYMLINKS	0x00000400	/* disallow symlink creation */
  #define FS_XFLAG_EXTSIZE	0x00000800	/* extent size allocator hint */
  #define FS_XFLAG_EXTSZINHERIT	0x00001000	/* inherit inode extent size */
  #define FS_XFLAG_NODEFRAG	0x00002000  	/* do not defragment */
  #define FS_XFLAG_FILESTREAM	0x00004000	/* use filestream allocator */
  #define FS_XFLAG_HASATTR	0x80000000	/* no DIFLAG for this */
  #endif /* !defined(FS_IOC_FSGETXATTR) */
  
  #define EXT4_IOC_FSGETXATTR		FS_IOC_FSGETXATTR
  #define EXT4_IOC_FSSETXATTR		FS_IOC_FSSETXATTR
e9be2ac7c   Theodore Ts'o   ext4: rename EXT4...
666
  #define EXT4_IOC_SHUTDOWN _IOR ('X', 125, __u32)
783d94854   Theodore Ts'o   ext4: add EXT4_IO...
667
668
669
670
671
672
673
  
  /*
   * Flags for going down operation
   */
  #define EXT4_GOING_FLAGS_DEFAULT		0x0	/* going down */
  #define EXT4_GOING_FLAGS_LOGFLUSH		0x1	/* flush log but not data */
  #define EXT4_GOING_FLAGS_NOLOGFLUSH		0x2	/* don't flush log nor data */
899ad0cea   Ben Hutchings   ext4: Conditional...
674
  #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
675
676
677
  /*
   * ioctl commands in 32 bit emulation
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
678
679
680
681
682
683
684
  #define EXT4_IOC32_GETFLAGS		FS_IOC32_GETFLAGS
  #define EXT4_IOC32_SETFLAGS		FS_IOC32_SETFLAGS
  #define EXT4_IOC32_GETVERSION		_IOR('f', 3, int)
  #define EXT4_IOC32_SETVERSION		_IOW('f', 4, int)
  #define EXT4_IOC32_GETRSVSZ		_IOR('f', 5, int)
  #define EXT4_IOC32_SETRSVSZ		_IOW('f', 6, int)
  #define EXT4_IOC32_GROUP_EXTEND		_IOW('f', 7, unsigned int)
4d92dc0f0   Ben Hutchings   ext4: Fix compat ...
685
  #define EXT4_IOC32_GROUP_ADD		_IOW('f', 8, struct compat_ext4_new_group_input)
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
686
687
  #define EXT4_IOC32_GETVERSION_OLD	FS_IOC32_GETVERSION
  #define EXT4_IOC32_SETVERSION_OLD	FS_IOC32_SETVERSION
899ad0cea   Ben Hutchings   ext4: Conditional...
688
  #endif
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
689

b595076a1   Uwe Kleine-König   tree-wide: fix co...
690
  /* Max physical block we can address w/o extents */
fb0a387dc   Eric Sandeen   ext4: limit block...
691
  #define EXT4_MAX_BLOCK_FILE_PHYS	0xFFFFFFFF
779af00b3   Theodore Ts'o   ext4: avoid arith...
692
693
  /* Max logical block we can support */
  #define EXT4_MAX_LOGICAL_BLOCK		0xFFFFFFFF
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
694
695
696
  /*
   * Structure of an inode on the disk
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
697
  struct ext4_inode {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
698
699
  	__le16	i_mode;		/* File mode */
  	__le16	i_uid;		/* Low 16 bits of Owner Uid */
a48380f76   Aneesh Kumar K.V   ext4: Rename i_di...
700
  	__le32	i_size_lo;	/* Size in bytes */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
701
  	__le32	i_atime;	/* Access time */
ef7f38359   Kalpak Shah   ext4: Add nanosec...
702
  	__le32	i_ctime;	/* Inode Change time */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
703
704
705
706
  	__le32	i_mtime;	/* Modification time */
  	__le32	i_dtime;	/* Deletion Time */
  	__le16	i_gid;		/* Low 16 bits of Group Id */
  	__le16	i_links_count;	/* Links count */
0fc1b4514   Aneesh Kumar K.V   ext4: Add support...
707
  	__le32	i_blocks_lo;	/* Blocks count */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
708
709
710
  	__le32	i_flags;	/* File flags */
  	union {
  		struct {
25ec56b51   Jean Noel Cordenner   ext4: Add inode v...
711
  			__le32  l_i_version;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
712
713
714
715
716
717
718
719
  		} linux1;
  		struct {
  			__u32  h_i_translator;
  		} hurd1;
  		struct {
  			__u32  m_i_reserved1;
  		} masix1;
  	} osd1;				/* OS dependent 1 */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
720
  	__le32	i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
721
  	__le32	i_generation;	/* File version (for NFS) */
7973c0c19   Aneesh Kumar K.V   ext4: Rename i_fi...
722
  	__le32	i_file_acl_lo;	/* File ACL */
a48380f76   Aneesh Kumar K.V   ext4: Rename i_di...
723
  	__le32	i_size_high;
f077d0d7e   Coly Li   ext4: Remove (par...
724
  	__le32	i_obso_faddr;	/* Obsoleted fragment address */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
725
726
  	union {
  		struct {
0fc1b4514   Aneesh Kumar K.V   ext4: Add support...
727
  			__le16	l_i_blocks_high; /* were l_i_reserved1 */
a1ddeb7ea   Badari Pulavarty   [PATCH] ext4: 48b...
728
  			__le16	l_i_file_acl_high;
8c55e2041   Dave Kleikamp   EXT4: Fix whitespace
729
  			__le16	l_i_uid_high;	/* these 2 fields */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
730
  			__le16	l_i_gid_high;	/* were reserved2[0] */
e61539189   Darrick J. Wong   ext4: change on-d...
731
732
  			__le16	l_i_checksum_lo;/* crc32c(uuid+inum+inode) LE */
  			__le16	l_i_reserved;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
733
734
  		} linux2;
  		struct {
f077d0d7e   Coly Li   ext4: Remove (par...
735
  			__le16	h_i_reserved1;	/* Obsoleted fragment number/size which are removed in ext4 */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
736
737
738
739
740
741
  			__u16	h_i_mode_high;
  			__u16	h_i_uid_high;
  			__u16	h_i_gid_high;
  			__u32	h_i_author;
  		} hurd2;
  		struct {
f077d0d7e   Coly Li   ext4: Remove (par...
742
  			__le16	h_i_reserved1;	/* Obsoleted fragment number/size which are removed in ext4 */
a1ddeb7ea   Badari Pulavarty   [PATCH] ext4: 48b...
743
  			__le16	m_i_file_acl_high;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
744
745
746
747
  			__u32	m_i_reserved2[2];
  		} masix2;
  	} osd2;				/* OS dependent 2 */
  	__le16	i_extra_isize;
e61539189   Darrick J. Wong   ext4: change on-d...
748
  	__le16	i_checksum_hi;	/* crc32c(uuid+inum+inode) BE */
ef7f38359   Kalpak Shah   ext4: Add nanosec...
749
750
751
752
753
  	__le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
  	__le32  i_mtime_extra;  /* extra Modification time(nsec << 2 | epoch) */
  	__le32  i_atime_extra;  /* extra Access time      (nsec << 2 | epoch) */
  	__le32  i_crtime;       /* File Creation time */
  	__le32  i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
25ec56b51   Jean Noel Cordenner   ext4: Add inode v...
754
  	__le32  i_version_hi;	/* high 32 bits for 64-bit version */
8b4953e13   Theodore Ts'o   ext4: reserve cod...
755
  	__le32	i_projid;	/* Project ID */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
756
  };
748de6736   Akira Fujita   ext4: online defr...
757
758
759
760
761
762
763
764
  struct move_extent {
  	__u32 reserved;		/* should be zero */
  	__u32 donor_fd;		/* donor file descriptor */
  	__u64 orig_start;	/* logical start offset in block for orig */
  	__u64 donor_start;	/* logical start offset in block for donor */
  	__u64 len;		/* block length to be moved */
  	__u64 moved_len;	/* moved block length */
  };
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
765

ef7f38359   Kalpak Shah   ext4: Add nanosec...
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
  #define EXT4_EPOCH_BITS 2
  #define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1)
  #define EXT4_NSEC_MASK  (~0UL << EXT4_EPOCH_BITS)
  
  /*
   * Extended fields will fit into an inode if the filesystem was formatted
   * with large inodes (-I 256 or larger) and there are not currently any EAs
   * consuming all of the available space. For new inodes we always reserve
   * enough space for the kernel's known extended fields, but for inodes
   * created with an old kernel this might not have been the case. None of
   * the extended inode fields is critical for correct filesystem operation.
   * This macro checks if a certain field fits in the inode. Note that
   * inode-size = GOOD_OLD_INODE_SIZE + i_extra_isize
   */
  #define EXT4_FITS_IN_INODE(ext4_inode, einode, field)	\
  	((offsetof(typeof(*ext4_inode), field) +	\
  	  sizeof((ext4_inode)->field))			\
  	<= (EXT4_GOOD_OLD_INODE_SIZE +			\
  	    (einode)->i_extra_isize))			\
a4dad1ae2   David Turner   ext4: Fix handlin...
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
  /*
   * We use an encoding that preserves the times for extra epoch "00":
   *
   * extra  msb of                         adjust for signed
   * epoch  32-bit                         32-bit tv_sec to
   * bits   time    decoded 64-bit tv_sec  64-bit tv_sec      valid time range
   * 0 0    1    -0x80000000..-0x00000001  0x000000000 1901-12-13..1969-12-31
   * 0 0    0    0x000000000..0x07fffffff  0x000000000 1970-01-01..2038-01-19
   * 0 1    1    0x080000000..0x0ffffffff  0x100000000 2038-01-19..2106-02-07
   * 0 1    0    0x100000000..0x17fffffff  0x100000000 2106-02-07..2174-02-25
   * 1 0    1    0x180000000..0x1ffffffff  0x200000000 2174-02-25..2242-03-16
   * 1 0    0    0x200000000..0x27fffffff  0x200000000 2242-03-16..2310-04-04
   * 1 1    1    0x280000000..0x2ffffffff  0x300000000 2310-04-04..2378-04-22
   * 1 1    0    0x300000000..0x37fffffff  0x300000000 2378-04-22..2446-05-10
   *
   * Note that previous versions of the kernel on 64-bit systems would
   * incorrectly use extra epoch bits 1,1 for dates between 1901 and
   * 1970.  e2fsck will correct this, assuming that it is run on the
   * affected filesystem before 2242.
   */
ef7f38359   Kalpak Shah   ext4: Add nanosec...
805
806
  static inline __le32 ext4_encode_extra_time(struct timespec *time)
  {
a4dad1ae2   David Turner   ext4: Fix handlin...
807
808
809
  	u32 extra = sizeof(time->tv_sec) > 4 ?
  		((time->tv_sec - (s32)time->tv_sec) >> 32) & EXT4_EPOCH_MASK : 0;
  	return cpu_to_le32(extra | (time->tv_nsec << EXT4_EPOCH_BITS));
ef7f38359   Kalpak Shah   ext4: Add nanosec...
810
811
812
813
  }
  
  static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
  {
a4dad1ae2   David Turner   ext4: Fix handlin...
814
815
  	if (unlikely(sizeof(time->tv_sec) > 4 &&
  			(extra & cpu_to_le32(EXT4_EPOCH_MASK)))) {
eaa093d2c   Christoph Hellwig   ext4: remove time...
816
817
  
  #if 1
a4dad1ae2   David Turner   ext4: Fix handlin...
818
  		/* Handle legacy encoding of pre-1970 dates with epoch
eaa093d2c   Christoph Hellwig   ext4: remove time...
819
820
  		 * bits 1,1. (This backwards compatibility may be removed
  		 * at the discretion of the ext4 developers.)
a4dad1ae2   David Turner   ext4: Fix handlin...
821
822
823
824
825
826
827
828
829
830
  		 */
  		u64 extra_bits = le32_to_cpu(extra) & EXT4_EPOCH_MASK;
  		if (extra_bits == 3 && ((time->tv_sec) & 0x80000000) != 0)
  			extra_bits = 0;
  		time->tv_sec += extra_bits << 32;
  #else
  		time->tv_sec += (u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32;
  #endif
  	}
  	time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS;
ef7f38359   Kalpak Shah   ext4: Add nanosec...
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
  }
  
  #define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode)			       \
  do {									       \
  	(raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec);	       \
  	if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra))     \
  		(raw_inode)->xtime ## _extra =				       \
  				ext4_encode_extra_time(&(inode)->xtime);       \
  } while (0)
  
  #define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode)			       \
  do {									       \
  	if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime))		       \
  		(raw_inode)->xtime = cpu_to_le32((einode)->xtime.tv_sec);      \
  	if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra))	       \
  		(raw_inode)->xtime ## _extra =				       \
  				ext4_encode_extra_time(&(einode)->xtime);      \
  } while (0)
  
  #define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode)			       \
  do {									       \
  	(inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime);       \
  	if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra))     \
  		ext4_decode_extra_time(&(inode)->xtime,			       \
  				       raw_inode->xtime ## _extra);	       \
af0b44a19   Eric Sandeen   ext4: zero out na...
856
857
  	else								       \
  		(inode)->xtime.tv_nsec = 0;				       \
ef7f38359   Kalpak Shah   ext4: Add nanosec...
858
859
860
861
862
863
864
  } while (0)
  
  #define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode)			       \
  do {									       \
  	if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime))		       \
  		(einode)->xtime.tv_sec = 				       \
  			(signed)le32_to_cpu((raw_inode)->xtime);	       \
19ea80603   Theodore Ts'o   ext4: don't leave...
865
866
  	else								       \
  		(einode)->xtime.tv_sec = 0;				       \
ef7f38359   Kalpak Shah   ext4: Add nanosec...
867
868
869
  	if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra))	       \
  		ext4_decode_extra_time(&(einode)->xtime,		       \
  				       raw_inode->xtime ## _extra);	       \
af0b44a19   Eric Sandeen   ext4: zero out na...
870
871
  	else								       \
  		(einode)->xtime.tv_nsec = 0;				       \
ef7f38359   Kalpak Shah   ext4: Add nanosec...
872
  } while (0)
25ec56b51   Jean Noel Cordenner   ext4: Add inode v...
873
  #define i_disk_version osd1.linux1.l_i_version
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
874
875
  #if defined(__KERNEL__) || defined(__linux__)
  #define i_reserved1	osd1.linux1.l_i_reserved1
a1ddeb7ea   Badari Pulavarty   [PATCH] ext4: 48b...
876
  #define i_file_acl_high	osd2.linux2.l_i_file_acl_high
0fc1b4514   Aneesh Kumar K.V   ext4: Add support...
877
  #define i_blocks_high	osd2.linux2.l_i_blocks_high
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
878
879
880
881
  #define i_uid_low	i_uid
  #define i_gid_low	i_gid
  #define i_uid_high	osd2.linux2.l_i_uid_high
  #define i_gid_high	osd2.linux2.l_i_gid_high
e61539189   Darrick J. Wong   ext4: change on-d...
882
  #define i_checksum_lo	osd2.linux2.l_i_checksum_lo
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
883
884
885
886
  
  #elif defined(__GNU__)
  
  #define i_translator	osd1.hurd1.h_i_translator
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
887
888
889
890
891
892
893
  #define i_uid_high	osd2.hurd2.h_i_uid_high
  #define i_gid_high	osd2.hurd2.h_i_gid_high
  #define i_author	osd2.hurd2.h_i_author
  
  #elif defined(__masix__)
  
  #define i_reserved1	osd1.masix1.m_i_reserved1
a1ddeb7ea   Badari Pulavarty   [PATCH] ext4: 48b...
894
  #define i_file_acl_high	osd2.masix2.m_i_file_acl_high
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
895
896
897
  #define i_reserved2	osd2.masix2.m_i_reserved2
  
  #endif /* defined(__KERNEL__) || defined(__linux__) */
c0677e6d0   Zheng Liu   ext4: add data st...
898
  #include "extents_status.h"
d444c3c38   Theodore Ts'o   ext4: Move the ex...
899
  /*
daf647d2d   Theodore Ts'o   ext4: add lockdep...
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
   * Lock subclasses for i_data_sem in the ext4_inode_info structure.
   *
   * These are needed to avoid lockdep false positives when we need to
   * allocate blocks to the quota inode during ext4_map_blocks(), while
   * holding i_data_sem for a normal (non-quota) inode.  Since we don't
   * do quota tracking for the quota inode, this avoids deadlock (as
   * well as infinite recursion, since it isn't turtles all the way
   * down...)
   *
   *  I_DATA_SEM_NORMAL - Used for most inodes
   *  I_DATA_SEM_OTHER  - Used by move_inode.c for the second normal inode
   *			  where the second inode has larger inode number
   *			  than the first
   *  I_DATA_SEM_QUOTA  - Used for quota inodes only
   */
  enum {
  	I_DATA_SEM_NORMAL = 0,
  	I_DATA_SEM_OTHER,
  	I_DATA_SEM_QUOTA,
  };
  
  
  /*
d444c3c38   Theodore Ts'o   ext4: Move the ex...
923
924
925
926
   * fourth extended file system inode data in memory
   */
  struct ext4_inode_info {
  	__le32	i_data[15];	/* unconverted */
d444c3c38   Theodore Ts'o   ext4: Move the ex...
927
  	__u32	i_dtime;
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
928
  	ext4_fsblk_t	i_file_acl;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
929
930
931
932
  
  	/*
  	 * i_block_group is the number of the block group which contains
  	 * this file's inode.  Constant across the lifetime of the inode,
a627b0a7c   Eric Whitney   ext4: remove unus...
933
  	 * it is used for making block allocation decisions - we try to
d444c3c38   Theodore Ts'o   ext4: Move the ex...
934
935
936
937
  	 * place a file's data blocks near its inode block, and new inodes
  	 * near to their parent directory's inode.
  	 */
  	ext4_group_t	i_block_group;
8a2005d3f   Theodore Ts'o   ext4: reorder ext...
938
  	ext4_lblk_t	i_dir_start_lookup;
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
939
  #if (BITS_PER_LONG < 64)
19f5fb7ad   Theodore Ts'o   ext4: Use bitops ...
940
  	unsigned long	i_state_flags;		/* Dynamic state flags */
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
941
  #endif
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
942
  	unsigned long	i_flags;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
943

d444c3c38   Theodore Ts'o   ext4: Move the ex...
944
945
946
947
948
949
950
951
  	/*
  	 * Extended attributes can be read independently of the main file
  	 * data. Taking i_mutex even when reading would cause contention
  	 * between readers of EAs and writers of regular file data, so
  	 * instead we synchronize on xattr_sem when reading or changing
  	 * EAs.
  	 */
  	struct rw_semaphore xattr_sem;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
  
  	struct list_head i_orphan;	/* unlinked but open inodes */
  
  	/*
  	 * i_disksize keeps track of what the inode size is ON DISK, not
  	 * in memory.  During truncate, i_size is set to the new size by
  	 * the VFS prior to calling ext4_truncate(), but the filesystem won't
  	 * set i_disksize to 0 until the truncate is actually under way.
  	 *
  	 * The intent is that i_disksize always represents the blocks which
  	 * are used by this file.  This allows recovery to restart truncate
  	 * on orphans if we crash during truncate.  We actually write i_disksize
  	 * into the on-disk inode when writing inodes out, instead of i_size.
  	 *
  	 * The only time when i_disksize and i_size may be different is when
  	 * a truncate is in progress.  The only things which change i_disksize
  	 * are ext4_get_block (growth) and ext4_truncate (shrinkth).
  	 */
  	loff_t	i_disksize;
  
  	/*
  	 * i_data_sem is for serialising ext4_truncate() against
  	 * ext4_getblock().  In the 2.4 ext2 design, great chunks of inode's
  	 * data tree are chopped off during truncate. We can't do that in
  	 * ext4 because whenever we perform intermediate commits during
  	 * truncate, the inode and all the metadata blocks *must* be in a
  	 * consistent state which allows truncation of the orphans to restart
  	 * during recovery.  Hence we must fix the get_block-vs-truncate race
  	 * by other means, so we have i_data_sem.
  	 */
  	struct rw_semaphore i_data_sem;
ea3d7209c   Jan Kara   ext4: fix races b...
983
984
985
986
987
988
989
990
991
  	/*
  	 * i_mmap_sem is for serializing page faults with truncate / punch hole
  	 * operations. We have to make sure that new page cannot be faulted in
  	 * a section of the inode that is being punched. We cannot easily use
  	 * i_data_sem for this since we need protection for the whole punch
  	 * operation and i_data_sem ranks below transaction start so we have
  	 * to occasionally drop it.
  	 */
  	struct rw_semaphore i_mmap_sem;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
992
  	struct inode vfs_inode;
8aefcd557   Theodore Ts'o   ext4: dynamically...
993
  	struct jbd2_inode *jinode;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
994

202ee5df3   Theodore Ts'o   ext4: add a new s...
995
  	spinlock_t i_raw_lock;	/* protects updates to the raw inode */
d444c3c38   Theodore Ts'o   ext4: Move the ex...
996
997
998
999
1000
1001
1002
1003
1004
  	/*
  	 * File creation time. Its function is same as that of
  	 * struct timespec i_{a,c,m}time in the generic inode.
  	 */
  	struct timespec i_crtime;
  
  	/* mballoc */
  	struct list_head i_prealloc_list;
  	spinlock_t i_prealloc_lock;
c0677e6d0   Zheng Liu   ext4: add data st...
1005
1006
1007
  	/* extents status tree */
  	struct ext4_es_tree i_es_tree;
  	rwlock_t i_es_lock;
edaa53cac   Zheng Liu   ext4: change LRU ...
1008
  	struct list_head i_es_list;
eb68d0e2f   Zheng Liu   ext4: track exten...
1009
  	unsigned int i_es_all_nr;	/* protected by i_es_lock */
edaa53cac   Zheng Liu   ext4: change LRU ...
1010
  	unsigned int i_es_shk_nr;	/* protected by i_es_lock */
dd4759255   Jan Kara   ext4: limit numbe...
1011
1012
1013
  	ext4_lblk_t i_es_shrink_lblk;	/* Offset where we start searching for
  					   extents to shrink. Protected by
  					   i_es_lock  */
c0677e6d0   Zheng Liu   ext4: add data st...
1014

d444c3c38   Theodore Ts'o   ext4: Move the ex...
1015
1016
1017
1018
  	/* ialloc */
  	ext4_group_t	i_last_alloc_group;
  
  	/* allocation reservation info for delalloc */
a627b0a7c   Eric Whitney   ext4: remove unus...
1019
  	/* In case of bigalloc, this refer to clusters rather than blocks */
d444c3c38   Theodore Ts'o   ext4: Move the ex...
1020
  	unsigned int i_reserved_data_blocks;
01f49d0b9   Theodore Ts'o   ext4: use ext4_lb...
1021
  	ext4_lblk_t i_da_metadata_calc_last_lblock;
9d0be5023   Theodore Ts'o   ext4: Calculate m...
1022
  	int i_da_metadata_calc_len;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
1023
1024
1025
  
  	/* on-disk additional length */
  	__u16 i_extra_isize;
67cf5b09a   Tao Ma   ext4: add the bas...
1026
1027
1028
  	/* Indicate the inline data space. */
  	u16 i_inline_off;
  	u16 i_inline_size;
a9e7f4472   Dmitry Monakhov   ext4: Convert to ...
1029
1030
1031
1032
  #ifdef CONFIG_QUOTA
  	/* quota space reservation, managed internally by quota code */
  	qsize_t i_reserved_quota;
  #endif
8d5d02e6b   Mingming Cao   ext4: async direc...
1033

2e8fa54e3   Jan Kara   ext4: split exten...
1034
  	/* Lock protecting lists below */
744692dc0   Jiaying Zhang   ext4: use ext4_ge...
1035
  	spinlock_t i_completed_io_lock;
2e8fa54e3   Jan Kara   ext4: split exten...
1036
1037
1038
1039
1040
  	/*
  	 * Completed IOs that need unwritten extents handling and have
  	 * transaction reserved
  	 */
  	struct list_head i_rsv_conversion_list;
2e8fa54e3   Jan Kara   ext4: split exten...
1041
  	struct work_struct i_rsv_conversion_work;
600be30a8   Jan Kara   ext4: remove i_io...
1042
  	atomic_t i_unwritten; /* Nr. of inflight conversions pending */
8a2005d3f   Theodore Ts'o   ext4: reorder ext...
1043
1044
  
  	spinlock_t i_block_reservation_lock;
b436b9bef   Jan Kara   ext4: Wait for pr...
1045
1046
1047
1048
1049
1050
1051
  
  	/*
  	 * Transactions that contain inode's metadata needed to complete
  	 * fsync and fdatasync, respectively.
  	 */
  	tid_t i_sync_tid;
  	tid_t i_datasync_tid;
814525f4d   Darrick J. Wong   ext4: calculate a...
1052

96c7e0d96   Jan Kara   ext4: Convert to ...
1053
1054
1055
  #ifdef CONFIG_QUOTA
  	struct dquot *i_dquot[MAXQUOTAS];
  #endif
814525f4d   Darrick J. Wong   ext4: calculate a...
1056
1057
  	/* Precomputed uuid+inum+igen checksum for seeding inode checksums */
  	__u32 i_csum_seed;
b30ab0e03   Michael Halcrow   ext4 crypto: add ...
1058

040cb3786   Li Xi   ext4: adds projec...
1059
  	kprojid_t i_projid;
d444c3c38   Theodore Ts'o   ext4: Move the ex...
1060
1061
1062
  };
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1063
1064
   * File system states
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1065
1066
1067
  #define	EXT4_VALID_FS			0x0001	/* Unmounted cleanly */
  #define	EXT4_ERROR_FS			0x0002	/* Errors detected */
  #define	EXT4_ORPHAN_FS			0x0004	/* Orphans being recovered */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1068
1069
  
  /*
469108ff3   Theodore Tso   ext4: Add new "de...
1070
1071
1072
1073
1074
1075
1076
   * Misc. filesystem flags
   */
  #define EXT2_FLAGS_SIGNED_HASH		0x0001  /* Signed dirhash in use */
  #define EXT2_FLAGS_UNSIGNED_HASH	0x0002  /* Unsigned dirhash in use */
  #define EXT2_FLAGS_TEST_FILESYS		0x0004	/* to test development code */
  
  /*
689110098   Lukas Czerner   ext4: make ext4_b...
1077
   * Mount flags set via mount options or defaults
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1078
   */
cdb7ee4c6   Tahsin Erdogan   ext4: add nombcac...
1079
  #define EXT4_MOUNT_NO_MBCACHE		0x00001 /* Do not use mbcache */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1080
1081
1082
1083
1084
  #define EXT4_MOUNT_GRPID		0x00004	/* Create files with directory's group */
  #define EXT4_MOUNT_DEBUG		0x00008	/* Some debugging messages */
  #define EXT4_MOUNT_ERRORS_CONT		0x00010	/* Continue on errors */
  #define EXT4_MOUNT_ERRORS_RO		0x00020	/* Remount fs ro on errors */
  #define EXT4_MOUNT_ERRORS_PANIC		0x00040	/* Panic on errors */
39ef17f1b   Theodore Ts'o   ext4: simplify ha...
1085
  #define EXT4_MOUNT_ERRORS_MASK		0x00070
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1086
1087
  #define EXT4_MOUNT_MINIX_DF		0x00080	/* Mimics the Minix statfs */
  #define EXT4_MOUNT_NOLOAD		0x00100	/* Don't use existing journal*/
923ae0ff9   Ross Zwisler   ext4: add DAX fun...
1088
1089
1090
1091
1092
  #ifdef CONFIG_FS_DAX
  #define EXT4_MOUNT_DAX			0x00200	/* Direct Access */
  #else
  #define EXT4_MOUNT_DAX			0
  #endif
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1093
1094
1095
1096
1097
1098
1099
1100
  #define EXT4_MOUNT_DATA_FLAGS		0x00C00	/* Mode for data writes: */
  #define EXT4_MOUNT_JOURNAL_DATA		0x00400	/* Write data to journal */
  #define EXT4_MOUNT_ORDERED_DATA		0x00800	/* Flush data before commit */
  #define EXT4_MOUNT_WRITEBACK_DATA	0x00C00	/* No data ordering */
  #define EXT4_MOUNT_UPDATE_JOURNAL	0x01000	/* Update the journal format */
  #define EXT4_MOUNT_NO_UID32		0x02000  /* Disable 32-bit UIDs */
  #define EXT4_MOUNT_XATTR_USER		0x04000	/* Extended user attributes */
  #define EXT4_MOUNT_POSIX_ACL		0x08000	/* POSIX Access Control Lists */
afd4672dc   Theodore Ts'o   ext4: Add auto_da...
1101
  #define EXT4_MOUNT_NO_AUTO_DA_ALLOC	0x10000	/* No auto delalloc mapping */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1102
  #define EXT4_MOUNT_BARRIER		0x20000 /* Use block barriers */
49da93927   Jan Kara   ext4: enable quot...
1103
1104
1105
1106
1107
1108
1109
1110
1111
  #define EXT4_MOUNT_QUOTA		0x40000 /* Some quota option set */
  #define EXT4_MOUNT_USRQUOTA		0x80000 /* "old" user quota,
  						 * enable enforcement for hidden
  						 * quota files */
  #define EXT4_MOUNT_GRPQUOTA		0x100000 /* "old" group quota, enable
  						  * enforcement for hidden quota
  						  * files */
  #define EXT4_MOUNT_PRJQUOTA		0x200000 /* Enable project quota
  						  * enforcement */
744692dc0   Jiaying Zhang   ext4: use ext4_ge...
1112
  #define EXT4_MOUNT_DIOREAD_NOLOCK	0x400000 /* Enable support for dio read nolocking */
d4da6c9cc   Linus Torvalds   Revert "ext4: Rem...
1113
  #define EXT4_MOUNT_JOURNAL_CHECKSUM	0x800000 /* Journal checksums */
818d276ce   Girish Shilamkar   ext4: Add the jou...
1114
  #define EXT4_MOUNT_JOURNAL_ASYNC_COMMIT	0x1000000 /* Journal Async Commit */
64769240b   Alex Tomas   ext4: Add delayed...
1115
  #define EXT4_MOUNT_DELALLOC		0x8000000 /* Delalloc support */
5bf5683a3   Hidehiro Kawai   ext4: add an opti...
1116
  #define EXT4_MOUNT_DATA_ERR_ABORT	0x10000000 /* Abort on file data write */
6fd058f77   Theodore Ts'o   ext4: Add a compr...
1117
  #define EXT4_MOUNT_BLOCK_VALIDITY	0x20000000 /* Block validity checking */
5328e6353   Eric Sandeen   ext4: make trim/d...
1118
  #define EXT4_MOUNT_DISCARD		0x40000000 /* Issue DISCARD requests */
bfff68738   Lukas Czerner   ext4: add support...
1119
  #define EXT4_MOUNT_INIT_INODE_TABLE	0x80000000 /* Initialize uninitialized itables */
5bf5683a3   Hidehiro Kawai   ext4: add an opti...
1120

689110098   Lukas Czerner   ext4: make ext4_b...
1121
1122
1123
1124
1125
  /*
   * Mount flags set either automatically (could not be set by mount option)
   * based on per file system feature or property or in special cases such as
   * distinguishing between explicit mount option definition and default.
   */
56889787c   Theodore Ts'o   ext4: improve han...
1126
1127
  #define EXT4_MOUNT2_EXPLICIT_DELALLOC	0x00000001 /* User explicitly
  						      specified delalloc */
689110098   Lukas Czerner   ext4: make ext4_b...
1128
1129
1130
  #define EXT4_MOUNT2_STD_GROUP_SIZE	0x00000002 /* We have standard group
  						      size of blocksize * 8
  						      blocks */
ed3654eb9   Theodore Ts'o   ext4: optimize Hu...
1131
1132
  #define EXT4_MOUNT2_HURD_COMPAT		0x00000004 /* Support HURD-castrated
  						      file systems */
56889787c   Theodore Ts'o   ext4: improve han...
1133

1e381f60d   Dmitry Monakhov   ext4: do not allo...
1134
1135
  #define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM	0x00000008 /* User explicitly
  						specified journal checksum */
fd8c37ecc   Theodore Ts'o   ext4: Simplify th...
1136
1137
1138
1139
  #define clear_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt &= \
  						~EXT4_MOUNT_##opt
  #define set_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt |= \
  						EXT4_MOUNT_##opt
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1140
1141
  #define test_opt(sb, opt)		(EXT4_SB(sb)->s_mount_opt & \
  					 EXT4_MOUNT_##opt)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1142

a2595b8aa   Theodore Ts'o   ext4: Add second ...
1143
1144
1145
1146
1147
1148
  #define clear_opt2(sb, opt)		EXT4_SB(sb)->s_mount_opt2 &= \
  						~EXT4_MOUNT2_##opt
  #define set_opt2(sb, opt)		EXT4_SB(sb)->s_mount_opt2 |= \
  						EXT4_MOUNT2_##opt
  #define test_opt2(sb, opt)		(EXT4_SB(sb)->s_mount_opt2 & \
  					 EXT4_MOUNT2_##opt)
597d508c1   Akinobu Mita   ext4: use proper ...
1149
1150
  #define ext4_test_and_set_bit		__test_and_set_bit_le
  #define ext4_set_bit			__set_bit_le
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1151
  #define ext4_set_bit_atomic		ext2_set_bit_atomic
597d508c1   Akinobu Mita   ext4: use proper ...
1152
1153
  #define ext4_test_and_clear_bit		__test_and_clear_bit_le
  #define ext4_clear_bit			__clear_bit_le
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1154
  #define ext4_clear_bit_atomic		ext2_clear_bit_atomic
50e0168cc   Akinobu Mita   ext4: use little-...
1155
  #define ext4_test_bit			test_bit_le
50e0168cc   Akinobu Mita   ext4: use little-...
1156
1157
  #define ext4_find_next_zero_bit		find_next_zero_bit_le
  #define ext4_find_next_bit		find_next_bit_le
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1158

c3e94d1df   Yongqiang Yang   ext4: let setup_n...
1159
  extern void ext4_set_bits(void *bm, int cur, int len);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1160
1161
1162
  /*
   * Maximal mount counts between two filesystem checks
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1163
1164
  #define EXT4_DFL_MAX_MNT_COUNT		20	/* Allow 20 mounts */
  #define EXT4_DFL_CHECKINTERVAL		0	/* Don't use interval check */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1165
1166
1167
1168
  
  /*
   * Behaviour when detecting errors
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1169
1170
1171
1172
  #define EXT4_ERRORS_CONTINUE		1	/* Continue execution */
  #define EXT4_ERRORS_RO			2	/* Remount fs read-only */
  #define EXT4_ERRORS_PANIC		3	/* Panic */
  #define EXT4_ERRORS_DEFAULT		EXT4_ERRORS_CONTINUE
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1173

e61539189   Darrick J. Wong   ext4: change on-d...
1174
1175
  /* Metadata checksum algorithm codes */
  #define EXT4_CRC32C_CHKSUM		1
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1176
1177
1178
  /*
   * Structure of the super block
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1179
  struct ext4_super_block {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1180
  /*00*/	__le32	s_inodes_count;		/* Inodes count */
6bc9feff1   Aneesh Kumar K.V   ext4: Convert s_b...
1181
  	__le32	s_blocks_count_lo;	/* Blocks count */
308ba3ece   Aneesh Kumar K.V   ext4: Convert s_r...
1182
1183
  	__le32	s_r_blocks_count_lo;	/* Reserved blocks count */
  	__le32	s_free_blocks_count_lo;	/* Free blocks count */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1184
1185
1186
  /*10*/	__le32	s_free_inodes_count;	/* Free inodes count */
  	__le32	s_first_data_block;	/* First Data Block */
  	__le32	s_log_block_size;	/* Block size */
281b59959   Theodore Ts'o   ext4: read-only s...
1187
  	__le32	s_log_cluster_size;	/* Allocation cluster size */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1188
  /*20*/	__le32	s_blocks_per_group;	/* # Blocks per group */
281b59959   Theodore Ts'o   ext4: read-only s...
1189
  	__le32	s_clusters_per_group;	/* # Clusters per group */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
  	__le32	s_inodes_per_group;	/* # Inodes per group */
  	__le32	s_mtime;		/* Mount time */
  /*30*/	__le32	s_wtime;		/* Write time */
  	__le16	s_mnt_count;		/* Mount count */
  	__le16	s_max_mnt_count;	/* Maximal mount count */
  	__le16	s_magic;		/* Magic signature */
  	__le16	s_state;		/* File system state */
  	__le16	s_errors;		/* Behaviour when detecting errors */
  	__le16	s_minor_rev_level;	/* minor revision level */
  /*40*/	__le32	s_lastcheck;		/* time of last check */
  	__le32	s_checkinterval;	/* max. time between checks */
  	__le32	s_creator_os;		/* OS */
  	__le32	s_rev_level;		/* Revision level */
  /*50*/	__le16	s_def_resuid;		/* Default uid for reserved blocks */
  	__le16	s_def_resgid;		/* Default gid for reserved blocks */
  	/*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1206
  	 * These fields are for EXT4_DYNAMIC_REV superblocks only.
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
  	 *
  	 * Note: the difference between the compatible feature set and
  	 * the incompatible feature set is that if there is a bit set
  	 * in the incompatible feature set that the kernel doesn't
  	 * know about, it should refuse to mount the filesystem.
  	 *
  	 * e2fsck's requirements are more strict; if it doesn't know
  	 * about a feature in either the compatible or incompatible
  	 * feature set, it must abort and not try to meddle with
  	 * things it doesn't understand...
  	 */
  	__le32	s_first_ino;		/* First non-reserved inode */
0d1ee42f2   Alexandre Ratchov   [PATCH] ext4: all...
1219
  	__le16  s_inode_size;		/* size of inode structure */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
  	__le16	s_block_group_nr;	/* block group # of this superblock */
  	__le32	s_feature_compat;	/* compatible feature set */
  /*60*/	__le32	s_feature_incompat;	/* incompatible feature set */
  	__le32	s_feature_ro_compat;	/* readonly-compatible feature set */
  /*68*/	__u8	s_uuid[16];		/* 128-bit uuid for volume */
  /*78*/	char	s_volume_name[16];	/* volume name */
  /*88*/	char	s_last_mounted[64];	/* directory where last mounted */
  /*C8*/	__le32	s_algorithm_usage_bitmap; /* For compression */
  	/*
  	 * Performance hints.  Directory preallocation should only
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1230
  	 * happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on.
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1231
1232
1233
1234
1235
  	 */
  	__u8	s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/
  	__u8	s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */
  	__le16	s_reserved_gdt_blocks;	/* Per group desc for online growth */
  	/*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1236
  	 * Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set.
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1237
1238
1239
1240
1241
1242
1243
  	 */
  /*D0*/	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
  /*E0*/	__le32	s_journal_inum;		/* inode number of journal file */
  	__le32	s_journal_dev;		/* device number of journal file */
  	__le32	s_last_orphan;		/* start of list of inodes to delete */
  	__le32	s_hash_seed[4];		/* HTREE hash seed */
  	__u8	s_def_hash_version;	/* Default hash version to use */
89eeddf03   Theodore Ts'o   ext4: Define s_jn...
1244
  	__u8	s_jnl_backup_type;
0d1ee42f2   Alexandre Ratchov   [PATCH] ext4: all...
1245
  	__le16  s_desc_size;		/* size of group descriptor */
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
1246
  /*100*/	__le32	s_default_mount_opts;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1247
  	__le32	s_first_meta_bg;	/* First metablock block group */
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
1248
1249
1250
1251
1252
1253
  	__le32	s_mkfs_time;		/* When the filesystem was created */
  	__le32	s_jnl_blocks[17];	/* Backup of the journal inode */
  	/* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
  /*150*/	__le32	s_blocks_count_hi;	/* Blocks count */
  	__le32	s_r_blocks_count_hi;	/* Reserved blocks count */
  	__le32	s_free_blocks_count_hi;	/* Free blocks count */
c1bddad94   Aneesh Kumar K.V   ext4: Fix sparse ...
1254
1255
1256
1257
  	__le16	s_min_extra_isize;	/* All inodes have at least # bytes */
  	__le16	s_want_extra_isize; 	/* New inodes should reserve # bytes */
  	__le32	s_flags;		/* Miscellaneous flags */
  	__le16  s_raid_stride;		/* RAID stride */
c5e06d101   Johann Lombardi   ext4: add support...
1258
  	__le16  s_mmp_update_interval;  /* # seconds to wait in MMP checking */
c1bddad94   Aneesh Kumar K.V   ext4: Fix sparse ...
1259
1260
  	__le64  s_mmp_block;            /* Block for multi-mount protection */
  	__le32  s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/
772cb7c83   Jose R. Santos   ext4: New inode a...
1261
  	__u8	s_log_groups_per_flex;  /* FLEX_BG group size */
e61539189   Darrick J. Wong   ext4: change on-d...
1262
  	__u8	s_checksum_type;	/* metadata checksum algorithm used */
f542fbe8d   Theodore Ts'o   ext4 crypto: rese...
1263
1264
  	__u8	s_encryption_level;	/* versioning level for encryption */
  	__u8	s_reserved_pad;		/* Padding to next 32bits */
afc32f7ee   Theodore Ts'o   ext4: Track lifet...
1265
  	__le64	s_kbytes_written;	/* nr of lifetime kilobytes written */
4a9cdec73   Theodore Ts'o   ext4: Add new sup...
1266
1267
1268
1269
1270
1271
  	__le32	s_snapshot_inum;	/* Inode number of active snapshot */
  	__le32	s_snapshot_id;		/* sequential ID of active snapshot */
  	__le64	s_snapshot_r_blocks_count; /* reserved blocks for active
  					      snapshot's future use */
  	__le32	s_snapshot_list;	/* inode number of the head of the
  					   on-disk snapshot list */
1c13d5c08   Theodore Ts'o   ext4: Save error ...
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
  #define EXT4_S_ERR_START offsetof(struct ext4_super_block, s_error_count)
  	__le32	s_error_count;		/* number of fs errors */
  	__le32	s_first_error_time;	/* first time an error happened */
  	__le32	s_first_error_ino;	/* inode involved in first error */
  	__le64	s_first_error_block;	/* block involved of first error */
  	__u8	s_first_error_func[32];	/* function where the error happened */
  	__le32	s_first_error_line;	/* line number where error happened */
  	__le32	s_last_error_time;	/* most recent time of an error */
  	__le32	s_last_error_ino;	/* inode involved in last error */
  	__le32	s_last_error_line;	/* line number where error happened */
  	__le64	s_last_error_block;	/* block involved of last error */
  	__u8	s_last_error_func[32];	/* function where the error happened */
8b67f04ab   Theodore Ts'o   ext4: Add mount o...
1284
1285
  #define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts)
  	__u8	s_mount_opts[64];
281b59959   Theodore Ts'o   ext4: read-only s...
1286
1287
1288
  	__le32	s_usr_quota_inum;	/* inode for tracking user quota */
  	__le32	s_grp_quota_inum;	/* inode for tracking group quota */
  	__le32	s_overhead_clusters;	/* overhead blocks/clusters in fs */
1beeef1b5   Darrick J. Wong   ext4: fix block b...
1289
  	__le32	s_backup_bgs[2];	/* groups with sparse_super2 SBs */
3edc18d84   Theodore Ts'o   ext4: reserve cod...
1290
  	__u8	s_encrypt_algos[4];	/* Encryption algorithms in use  */
f542fbe8d   Theodore Ts'o   ext4 crypto: rese...
1291
1292
  	__u8	s_encrypt_pw_salt[16];	/* Salt used for string2key algorithm */
  	__le32	s_lpf_ino;		/* Location of the lost+found inode */
8b4953e13   Theodore Ts'o   ext4: reserve cod...
1293
  	__le32	s_prj_quota_inum;	/* inode for tracking project quota */
8c81bd8f5   Darrick J. Wong   ext4: store check...
1294
1295
  	__le32	s_checksum_seed;	/* crc32c(uuid) if csum_seed set */
  	__le32	s_reserved[98];		/* Padding to the end of the block */
e61539189   Darrick J. Wong   ext4: change on-d...
1296
  	__le32	s_checksum;		/* crc32c(superblock) */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1297
  };
1c13d5c08   Theodore Ts'o   ext4: Save error ...
1298
  #define EXT4_S_ERR_LEN (EXT4_S_ERR_END - EXT4_S_ERR_START)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1299
  #ifdef __KERNEL__
bc0b0d6d6   Theodore Ts'o   ext4: update the ...
1300
1301
  
  /*
4ab2f15b7   Theodore Ts'o   ext4: move the ab...
1302
   * run-time mount flags
bc0b0d6d6   Theodore Ts'o   ext4: update the ...
1303
   */
6ddb24478   Theodore Ts'o   ext4 crypto: enab...
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
  #define EXT4_MF_MNTDIR_SAMPLED		0x0001
  #define EXT4_MF_FS_ABORTED		0x0002	/* Fatal error detected */
  #define EXT4_MF_TEST_DUMMY_ENCRYPTION	0x0004
  
  #ifdef CONFIG_EXT4_FS_ENCRYPTION
  #define DUMMY_ENCRYPTION_ENABLED(sbi) (unlikely((sbi)->s_mount_flags & \
  						EXT4_MF_TEST_DUMMY_ENCRYPTION))
  #else
  #define DUMMY_ENCRYPTION_ENABLED(sbi) (0)
  #endif
bc0b0d6d6   Theodore Ts'o   ext4: update the ...
1314

a2d4a646e   Jan Kara   ext4: don't use M...
1315
  /* Number of quota types we support */
689c958cb   Li Xi   ext4: add project...
1316
  #define EXT4_MAXQUOTAS 3
a2d4a646e   Jan Kara   ext4: don't use M...
1317

ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1318
1319
1320
1321
1322
1323
1324
  /*
   * fourth extended-fs super-block data in memory
   */
  struct ext4_sb_info {
  	unsigned long s_desc_size;	/* Size of a group descriptor in bytes */
  	unsigned long s_inodes_per_block;/* Number of inodes per block */
  	unsigned long s_blocks_per_group;/* Number of blocks in a group */
281b59959   Theodore Ts'o   ext4: read-only s...
1325
  	unsigned long s_clusters_per_group; /* Number of clusters in a group */
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1326
1327
1328
1329
1330
  	unsigned long s_inodes_per_group;/* Number of inodes in a group */
  	unsigned long s_itb_per_group;	/* Number of inode table blocks per group */
  	unsigned long s_gdb_count;	/* Number of group descriptor blocks */
  	unsigned long s_desc_per_block;	/* Number of group descriptors per block */
  	ext4_group_t s_groups_count;	/* Number of groups in the fs */
fb0a387dc   Eric Sandeen   ext4: limit block...
1331
  	ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */
952fc18ef   Theodore Ts'o   ext4: fix overhea...
1332
  	unsigned long s_overhead;  /* # of fs overhead clusters */
281b59959   Theodore Ts'o   ext4: read-only s...
1333
1334
  	unsigned int s_cluster_ratio;	/* Number of blocks per cluster */
  	unsigned int s_cluster_bits;	/* log2 of s_cluster_ratio */
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1335
1336
1337
1338
  	loff_t s_bitmap_maxbytes;	/* max bytes for bitmap files */
  	struct buffer_head * s_sbh;	/* Buffer containing the super block */
  	struct ext4_super_block *s_es;	/* Pointer to the super block in the buffer */
  	struct buffer_head **s_group_desc;
7f4520cc6   Theodore Ts'o   ext4: change s_mo...
1339
  	unsigned int s_mount_opt;
a2595b8aa   Theodore Ts'o   ext4: Add second ...
1340
  	unsigned int s_mount_opt2;
bc0b0d6d6   Theodore Ts'o   ext4: update the ...
1341
  	unsigned int s_mount_flags;
5a916be1b   Theodore Ts'o   ext4: make ext4_s...
1342
  	unsigned int s_def_mount_opt;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1343
  	ext4_fsblk_t s_sb_block;
27dd43854   Lukas Czerner   ext4: introduce r...
1344
  	atomic64_t s_resv_clusters;
08cefc7ab   Eric W. Biederman   userns: Convert e...
1345
1346
  	kuid_t s_resuid;
  	kgid_t s_resgid;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1347
1348
1349
1350
1351
1352
1353
  	unsigned short s_mount_state;
  	unsigned short s_pad;
  	int s_addr_per_block_bits;
  	int s_desc_per_block_bits;
  	int s_inode_size;
  	int s_first_ino;
  	unsigned int s_inode_readahead_blks;
11013911d   Andreas Dilger   ext4: teach the i...
1354
  	unsigned int s_inode_goal;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1355
1356
1357
1358
1359
  	spinlock_t s_next_gen_lock;
  	u32 s_next_generation;
  	u32 s_hash_seed[4];
  	int s_def_hash_version;
  	int s_hash_unsigned;	/* 3 if hash should be signed, 0 if not */
570426518   Theodore Ts'o   ext4: convert s_{...
1360
  	struct percpu_counter s_freeclusters_counter;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1361
1362
  	struct percpu_counter s_freeinodes_counter;
  	struct percpu_counter s_dirs_counter;
570426518   Theodore Ts'o   ext4: convert s_{...
1363
  	struct percpu_counter s_dirtyclusters_counter;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1364
1365
1366
1367
  	struct blockgroup_lock *s_blockgroup_lock;
  	struct proc_dir_entry *s_proc;
  	struct kobject s_kobj;
  	struct completion s_kobj_unregister;
2c0544b23   Theodore Ts'o   ext4: add debuggi...
1368
  	struct super_block *s_sb;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1369
1370
  
  	/* Journaling */
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1371
1372
1373
  	struct journal_s *s_journal;
  	struct list_head s_orphan;
  	struct mutex s_orphan_lock;
9549a168b   Theodore Ts'o   ext4: rename s_re...
1374
  	unsigned long s_ext4_flags;		/* Ext4 superblock flags */
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1375
1376
1377
1378
  	unsigned long s_commit_interval;
  	u32 s_max_batch_time;
  	u32 s_min_batch_time;
  	struct block_device *journal_bdev;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1379
  #ifdef CONFIG_QUOTA
44dcd01ee   Theodore Ts'o   ext4: fix use-aft...
1380
1381
  	/* Names of quota files with journalled quota */
  	char __rcu *s_qf_names[EXT4_MAXQUOTAS];
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1382
1383
1384
  	int s_jquota_fmt;			/* Format of quota to use */
  #endif
  	unsigned int s_want_extra_isize; /* New inodes should reserve # bytes */
6fd058f77   Theodore Ts'o   ext4: Add a compr...
1385
  	struct rb_root system_blks;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
  
  #ifdef EXTENTS_STATS
  	/* ext4 extents stats */
  	unsigned long s_ext_min;
  	unsigned long s_ext_max;
  	unsigned long s_depth_max;
  	spinlock_t s_ext_stats_lock;
  	unsigned long s_ext_blocks;
  	unsigned long s_ext_extents;
  #endif
  
  	/* for buddy allocator */
  	struct ext4_group_info ***s_group_info;
  	struct inode *s_buddy_cache;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1400
  	spinlock_t s_md_lock;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1401
1402
  	unsigned short *s_mb_offsets;
  	unsigned int *s_mb_maxs;
28623c2f5   Theodore Ts'o   ext4: grow the s_...
1403
  	unsigned int s_group_info_size;
d08854f5b   Theodore Ts'o   ext4: optimize ex...
1404
  	unsigned int s_mb_free_pending;
a01543448   Daeho Jeong   ext4: send parall...
1405
1406
  	struct list_head s_freed_data_list;	/* List of blocks to be freed
  						   after commit completed */
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1407
1408
1409
1410
1411
1412
1413
1414
1415
  
  	/* tunables */
  	unsigned long s_stripe;
  	unsigned int s_mb_stream_request;
  	unsigned int s_mb_max_to_scan;
  	unsigned int s_mb_min_to_scan;
  	unsigned int s_mb_stats;
  	unsigned int s_mb_order2_reqs;
  	unsigned int s_mb_group_prealloc;
df981d03e   Theodore Ts'o   ext4: add max_dir...
1416
  	unsigned int s_max_dir_size_kb;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1417
1418
1419
  	/* where last allocation was done - for stream allocation */
  	unsigned long s_mb_last_group;
  	unsigned long s_mb_last_start;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1420
  	/* stats for buddy allocator */
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
  	atomic_t s_bal_reqs;	/* number of reqs with len > 1 */
  	atomic_t s_bal_success;	/* we found long enough chunks */
  	atomic_t s_bal_allocated;	/* in blocks */
  	atomic_t s_bal_ex_scanned;	/* total extents scanned */
  	atomic_t s_bal_goals;	/* goal hits */
  	atomic_t s_bal_breaks;	/* too long searches */
  	atomic_t s_bal_2orders;	/* 2^order hits */
  	spinlock_t s_bal_lock;
  	unsigned long s_mb_buddies_generated;
  	unsigned long long s_mb_generation_time;
  	atomic_t s_mb_lost_chunks;
  	atomic_t s_mb_preallocated;
  	atomic_t s_mb_discarded;
50797481a   Theodore Ts'o   ext4: Avoid group...
1434
  	atomic_t s_lock_busy;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1435
1436
  
  	/* locality groups */
003cb608a   Tejun Heo   percpu: add __per...
1437
  	struct ext4_locality_group __percpu *s_locality_groups;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1438
1439
1440
1441
  
  	/* for write statistics */
  	unsigned long s_sectors_written_start;
  	u64 s_kbytes_written;
67a5da564   Zheng Liu   ext4: make the ze...
1442
1443
  	/* the size of zero-out chunk */
  	unsigned int s_extent_max_zeroout_kb;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1444
1445
  	unsigned int s_log_groups_per_flex;
  	struct flex_groups *s_flex_groups;
117fff10d   Theodore Ts'o   ext4: grow the s_...
1446
  	ext4_group_t s_flex_groups_allocated;
4c0425ff6   Mingming Cao   ext4: Use end_io ...
1447

2e8fa54e3   Jan Kara   ext4: split exten...
1448
1449
  	/* workqueue for reserved extent conversions (buffered io) */
  	struct workqueue_struct *rsv_conversion_wq;
66e61a9e9   Theodore Ts'o   ext4: Once a day,...
1450
1451
1452
  
  	/* timer for periodic error stats printing */
  	struct timer_list s_err_report;
bfff68738   Lukas Czerner   ext4: add support...
1453
1454
1455
1456
1457
  
  	/* Lazy inode table initialization info */
  	struct ext4_li_request *s_li_request;
  	/* Wait multiplier for lazy initialization thread */
  	unsigned int s_li_wait_mult;
c5e06d101   Johann Lombardi   ext4: add support...
1458
1459
1460
  
  	/* Kernel thread for multiple mount protection */
  	struct task_struct *s_mmp_tsk;
3d56b8d2c   Tao Ma   ext4: Speed up FI...
1461
1462
1463
  
  	/* record the last minlen when FITRIM is called. */
  	atomic_t s_last_trim_minblks;
0441984a3   Darrick J. Wong   ext4: load the cr...
1464
1465
1466
  
  	/* Reference to checksum algorithm driver via cryptoapi */
  	struct crypto_shash *s_chksum_driver;
a9c473178   Darrick J. Wong   ext4: calculate a...
1467
1468
1469
  
  	/* Precomputed FS UUID checksum for seeding other checksums */
  	__u32 s_csum_seed;
74cd15cd0   Zheng Liu   ext4: reclaim ext...
1470
1471
1472
  
  	/* Reclaim extents from extent status tree */
  	struct shrinker s_es_shrinker;
dd4759255   Jan Kara   ext4: limit numbe...
1473
  	struct list_head s_es_list;	/* List of inodes with reclaimable extents */
edaa53cac   Zheng Liu   ext4: change LRU ...
1474
  	long s_es_nr_inode;
eb68d0e2f   Zheng Liu   ext4: track exten...
1475
  	struct ext4_es_stats s_es_stats;
47387409e   Tahsin Erdogan   ext2, ext4: make ...
1476
  	struct mb_cache *s_ea_block_cache;
dec214d00   Tahsin Erdogan   ext4: xattr inode...
1477
  	struct mb_cache *s_ea_inode_cache;
edaa53cac   Zheng Liu   ext4: change LRU ...
1478
  	spinlock_t s_es_lock ____cacheline_aligned_in_smp;
efbed4dc5   Theodore Ts'o   ext4: add ratelim...
1479
1480
1481
1482
1483
  
  	/* Ratelimit ext4 messages. */
  	struct ratelimit_state s_err_ratelimit_state;
  	struct ratelimit_state s_warning_ratelimit_state;
  	struct ratelimit_state s_msg_ratelimit_state;
c8585c6fc   Daeho Jeong   ext4: fix races b...
1484
1485
1486
  
  	/* Barrier between changing inodes' journal flags and writepages ops. */
  	struct percpu_rw_semaphore s_journal_flag_rwsem;
5e405595e   Dan Williams   ext4: perform dax...
1487
  	struct dax_device *s_daxdev;
ca0faba0e   Theodore Ts'o   ext4: Move the ex...
1488
  };
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
1489
  static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1490
1491
1492
  {
  	return sb->s_fs_info;
  }
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1493
  static inline struct ext4_inode_info *EXT4_I(struct inode *inode)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1494
  {
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1495
  	return container_of(inode, struct ext4_inode_info, vfs_inode);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1496
  }
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1497
  static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1498
  {
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1499
  	return ino == EXT4_ROOT_INO ||
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1500
1501
  		(ino >= EXT4_FIRST_INO(sb) &&
  		 ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count));
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1502
  }
19f5fb7ad   Theodore Ts'o   ext4: Use bitops ...
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
  
  /*
   * Inode dynamic state flags
   */
  enum {
  	EXT4_STATE_JDATA,		/* journaled data exists */
  	EXT4_STATE_NEW,			/* inode is newly created */
  	EXT4_STATE_XATTR,		/* has in-inode xattrs */
  	EXT4_STATE_NO_EXPAND,		/* No space for expansion */
  	EXT4_STATE_DA_ALLOC_CLOSE,	/* Alloc DA blks on close */
  	EXT4_STATE_EXT_MIGRATE,		/* Inode is migrating */
  	EXT4_STATE_DIO_UNWRITTEN,	/* need convert on dio done*/
14ece1028   Frank Mayhar   ext4: Make fsync ...
1515
  	EXT4_STATE_NEWENTRY,		/* File just added to dir */
17335dcc4   Dmitry Monakhov   ext4: serialize d...
1516
1517
  	EXT4_STATE_DIOREAD_LOCK,	/* Disable support for dio read
  					   nolocking */
67cf5b09a   Tao Ma   ext4: add the bas...
1518
  	EXT4_STATE_MAY_INLINE_DATA,	/* may have in-inode data */
7869a4a6c   Theodore Ts'o   ext4: add support...
1519
  	EXT4_STATE_EXT_PRECACHED,	/* extents have been precached */
a6d056760   Tahsin Erdogan   ext4: backward co...
1520
  	EXT4_STATE_LUSTRE_EA_INODE,	/* Lustre-style ea_inode */
19f5fb7ad   Theodore Ts'o   ext4: Use bitops ...
1521
  };
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
1522
  #define EXT4_INODE_BIT_FNS(name, field, offset)				\
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
1523
1524
  static inline int ext4_test_inode_##name(struct inode *inode, int bit)	\
  {									\
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
1525
  	return test_bit(bit + (offset), &EXT4_I(inode)->i_##field);	\
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
1526
1527
1528
  }									\
  static inline void ext4_set_inode_##name(struct inode *inode, int bit)	\
  {									\
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
1529
  	set_bit(bit + (offset), &EXT4_I(inode)->i_##field);		\
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
1530
1531
1532
  }									\
  static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \
  {									\
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
1533
  	clear_bit(bit + (offset), &EXT4_I(inode)->i_##field);		\
19f5fb7ad   Theodore Ts'o   ext4: Use bitops ...
1534
  }
3f61c0cc7   Andreas Dilger   ext4: add prototy...
1535
1536
1537
1538
1539
  /* Add these declarations here only so that these functions can be
   * found by name.  Otherwise, they are very hard to locate. */
  static inline int ext4_test_inode_flag(struct inode *inode, int bit);
  static inline void ext4_set_inode_flag(struct inode *inode, int bit);
  static inline void ext4_clear_inode_flag(struct inode *inode, int bit);
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
1540
  EXT4_INODE_BIT_FNS(flag, flags, 0)
3f61c0cc7   Andreas Dilger   ext4: add prototy...
1541
1542
1543
1544
1545
1546
  
  /* Add these declarations here only so that these functions can be
   * found by name.  Otherwise, they are very hard to locate. */
  static inline int ext4_test_inode_state(struct inode *inode, int bit);
  static inline void ext4_set_inode_state(struct inode *inode, int bit);
  static inline void ext4_clear_inode_state(struct inode *inode, int bit);
353eb83c1   Theodore Ts'o   ext4: drop i_stat...
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
  #if (BITS_PER_LONG < 64)
  EXT4_INODE_BIT_FNS(state, state_flags, 0)
  
  static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
  {
  	(ei)->i_state_flags = 0;
  }
  #else
  EXT4_INODE_BIT_FNS(state, flags, 32)
  
  static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
  {
  	/* We depend on the fact that callers will set i_flags */
  }
  #endif
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1562
  #else
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1563
  /* Assume that user mode programs are passing in an ext4fs superblock, not
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1564
1565
   * a kernel struct super_block.  This will allow us to call the feature-test
   * macros from user land. */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1566
  #define EXT4_SB(sb)	(sb)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1567
  #endif
b30ab0e03   Michael Halcrow   ext4 crypto: add ...
1568
1569
1570
  /*
   * Returns true if the inode is inode is encrypted
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1571
  #define NEXT_ORPHAN(inode) EXT4_I(inode)->i_dtime
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1572
1573
1574
1575
  
  /*
   * Codes for operating systems
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1576
1577
1578
1579
1580
  #define EXT4_OS_LINUX		0
  #define EXT4_OS_HURD		1
  #define EXT4_OS_MASIX		2
  #define EXT4_OS_FREEBSD		3
  #define EXT4_OS_LITES		4
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1581
1582
1583
1584
  
  /*
   * Revision levels
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1585
1586
  #define EXT4_GOOD_OLD_REV	0	/* The good old (original) format */
  #define EXT4_DYNAMIC_REV	1	/* V2 format w/ dynamic inode sizes */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1587

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1588
1589
  #define EXT4_CURRENT_REV	EXT4_GOOD_OLD_REV
  #define EXT4_MAX_SUPP_REV	EXT4_DYNAMIC_REV
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1590

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1591
  #define EXT4_GOOD_OLD_INODE_SIZE 128
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1592
1593
1594
1595
  
  /*
   * Feature set definitions
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1596
1597
1598
1599
1600
1601
  #define EXT4_FEATURE_COMPAT_DIR_PREALLOC	0x0001
  #define EXT4_FEATURE_COMPAT_IMAGIC_INODES	0x0002
  #define EXT4_FEATURE_COMPAT_HAS_JOURNAL		0x0004
  #define EXT4_FEATURE_COMPAT_EXT_ATTR		0x0008
  #define EXT4_FEATURE_COMPAT_RESIZE_INODE	0x0010
  #define EXT4_FEATURE_COMPAT_DIR_INDEX		0x0020
1beeef1b5   Darrick J. Wong   ext4: fix block b...
1602
  #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2	0x0200
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1603
1604
1605
1606
  
  #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001
  #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE	0x0002
  #define EXT4_FEATURE_RO_COMPAT_BTREE_DIR	0x0004
0fc1b4514   Aneesh Kumar K.V   ext4: Add support...
1607
  #define EXT4_FEATURE_RO_COMPAT_HUGE_FILE        0x0008
717d50e49   Andreas Dilger   Ext4: Uninitializ...
1608
  #define EXT4_FEATURE_RO_COMPAT_GDT_CSUM		0x0010
f8628a14a   Andreas Dilger   ext4: Remove 6500...
1609
  #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK	0x0020
ef7f38359   Kalpak Shah   ext4: Add nanosec...
1610
  #define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE	0x0040
ae8123068   Aditya Kali   ext4: reserve ino...
1611
  #define EXT4_FEATURE_RO_COMPAT_QUOTA		0x0100
281b59959   Theodore Ts'o   ext4: read-only s...
1612
  #define EXT4_FEATURE_RO_COMPAT_BIGALLOC		0x0200
e61539189   Darrick J. Wong   ext4: change on-d...
1613
1614
1615
1616
1617
1618
  /*
   * METADATA_CSUM also enables group descriptor checksums (GDT_CSUM).  When
   * METADATA_CSUM is set, group descriptor checksums use the same algorithm as
   * all other data structures' checksums.  However, the METADATA_CSUM and
   * GDT_CSUM bits are mutually exclusive.
   */
9b90e5e02   Theodore Ts'o   ext4: reserve new...
1619
  #define EXT4_FEATURE_RO_COMPAT_METADATA_CSUM	0x0400
2cb5cc8b0   Darrick J. Wong   ext4: support rea...
1620
  #define EXT4_FEATURE_RO_COMPAT_READONLY		0x1000
8b4953e13   Theodore Ts'o   ext4: reserve cod...
1621
  #define EXT4_FEATURE_RO_COMPAT_PROJECT		0x2000
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1622
1623
1624
1625
1626
1627
  
  #define EXT4_FEATURE_INCOMPAT_COMPRESSION	0x0001
  #define EXT4_FEATURE_INCOMPAT_FILETYPE		0x0002
  #define EXT4_FEATURE_INCOMPAT_RECOVER		0x0004 /* Needs recovery */
  #define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV	0x0008 /* Journal device */
  #define EXT4_FEATURE_INCOMPAT_META_BG		0x0010
a86c61812   Alex Tomas   [PATCH] ext3: add...
1628
  #define EXT4_FEATURE_INCOMPAT_EXTENTS		0x0040 /* extents support */
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
1629
  #define EXT4_FEATURE_INCOMPAT_64BIT		0x0080
0fc1b4514   Aneesh Kumar K.V   ext4: Add support...
1630
  #define EXT4_FEATURE_INCOMPAT_MMP               0x0100
ce4215817   Jose R. Santos   ext4: FLEX_BG Ker...
1631
  #define EXT4_FEATURE_INCOMPAT_FLEX_BG		0x0200
f710b4b96   Theodore Ts'o   ext4: Reserve INC...
1632
1633
  #define EXT4_FEATURE_INCOMPAT_EA_INODE		0x0400 /* EA in inode */
  #define EXT4_FEATURE_INCOMPAT_DIRDATA		0x1000 /* data in dirent */
8c81bd8f5   Darrick J. Wong   ext4: store check...
1634
  #define EXT4_FEATURE_INCOMPAT_CSUM_SEED		0x2000
9b90e5e02   Theodore Ts'o   ext4: reserve new...
1635
  #define EXT4_FEATURE_INCOMPAT_LARGEDIR		0x4000 /* >2GB or 3-lvl htree */
67cf5b09a   Tao Ma   ext4: add the bas...
1636
  #define EXT4_FEATURE_INCOMPAT_INLINE_DATA	0x8000 /* data in inode */
3edc18d84   Theodore Ts'o   ext4: reserve cod...
1637
  #define EXT4_FEATURE_INCOMPAT_ENCRYPT		0x10000
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1638

e2b911c53   Darrick J. Wong   ext4: clean up fe...
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
  #define EXT4_FEATURE_COMPAT_FUNCS(name, flagname) \
  static inline bool ext4_has_feature_##name(struct super_block *sb) \
  { \
  	return ((EXT4_SB(sb)->s_es->s_feature_compat & \
  		cpu_to_le32(EXT4_FEATURE_COMPAT_##flagname)) != 0); \
  } \
  static inline void ext4_set_feature_##name(struct super_block *sb) \
  { \
  	EXT4_SB(sb)->s_es->s_feature_compat |= \
  		cpu_to_le32(EXT4_FEATURE_COMPAT_##flagname); \
  } \
  static inline void ext4_clear_feature_##name(struct super_block *sb) \
  { \
  	EXT4_SB(sb)->s_es->s_feature_compat &= \
  		~cpu_to_le32(EXT4_FEATURE_COMPAT_##flagname); \
  }
  
  #define EXT4_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
  static inline bool ext4_has_feature_##name(struct super_block *sb) \
  { \
  	return ((EXT4_SB(sb)->s_es->s_feature_ro_compat & \
  		cpu_to_le32(EXT4_FEATURE_RO_COMPAT_##flagname)) != 0); \
  } \
  static inline void ext4_set_feature_##name(struct super_block *sb) \
  { \
  	EXT4_SB(sb)->s_es->s_feature_ro_compat |= \
  		cpu_to_le32(EXT4_FEATURE_RO_COMPAT_##flagname); \
  } \
  static inline void ext4_clear_feature_##name(struct super_block *sb) \
  { \
  	EXT4_SB(sb)->s_es->s_feature_ro_compat &= \
  		~cpu_to_le32(EXT4_FEATURE_RO_COMPAT_##flagname); \
  }
  
  #define EXT4_FEATURE_INCOMPAT_FUNCS(name, flagname) \
  static inline bool ext4_has_feature_##name(struct super_block *sb) \
  { \
  	return ((EXT4_SB(sb)->s_es->s_feature_incompat & \
  		cpu_to_le32(EXT4_FEATURE_INCOMPAT_##flagname)) != 0); \
  } \
  static inline void ext4_set_feature_##name(struct super_block *sb) \
  { \
  	EXT4_SB(sb)->s_es->s_feature_incompat |= \
  		cpu_to_le32(EXT4_FEATURE_INCOMPAT_##flagname); \
  } \
  static inline void ext4_clear_feature_##name(struct super_block *sb) \
  { \
  	EXT4_SB(sb)->s_es->s_feature_incompat &= \
  		~cpu_to_le32(EXT4_FEATURE_INCOMPAT_##flagname); \
  }
  
  EXT4_FEATURE_COMPAT_FUNCS(dir_prealloc,		DIR_PREALLOC)
  EXT4_FEATURE_COMPAT_FUNCS(imagic_inodes,	IMAGIC_INODES)
  EXT4_FEATURE_COMPAT_FUNCS(journal,		HAS_JOURNAL)
  EXT4_FEATURE_COMPAT_FUNCS(xattr,		EXT_ATTR)
  EXT4_FEATURE_COMPAT_FUNCS(resize_inode,		RESIZE_INODE)
  EXT4_FEATURE_COMPAT_FUNCS(dir_index,		DIR_INDEX)
  EXT4_FEATURE_COMPAT_FUNCS(sparse_super2,	SPARSE_SUPER2)
  
  EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super,	SPARSE_SUPER)
  EXT4_FEATURE_RO_COMPAT_FUNCS(large_file,	LARGE_FILE)
  EXT4_FEATURE_RO_COMPAT_FUNCS(btree_dir,		BTREE_DIR)
  EXT4_FEATURE_RO_COMPAT_FUNCS(huge_file,		HUGE_FILE)
  EXT4_FEATURE_RO_COMPAT_FUNCS(gdt_csum,		GDT_CSUM)
  EXT4_FEATURE_RO_COMPAT_FUNCS(dir_nlink,		DIR_NLINK)
  EXT4_FEATURE_RO_COMPAT_FUNCS(extra_isize,	EXTRA_ISIZE)
  EXT4_FEATURE_RO_COMPAT_FUNCS(quota,		QUOTA)
  EXT4_FEATURE_RO_COMPAT_FUNCS(bigalloc,		BIGALLOC)
  EXT4_FEATURE_RO_COMPAT_FUNCS(metadata_csum,	METADATA_CSUM)
  EXT4_FEATURE_RO_COMPAT_FUNCS(readonly,		READONLY)
  EXT4_FEATURE_RO_COMPAT_FUNCS(project,		PROJECT)
  
  EXT4_FEATURE_INCOMPAT_FUNCS(compression,	COMPRESSION)
  EXT4_FEATURE_INCOMPAT_FUNCS(filetype,		FILETYPE)
  EXT4_FEATURE_INCOMPAT_FUNCS(journal_needs_recovery,	RECOVER)
  EXT4_FEATURE_INCOMPAT_FUNCS(journal_dev,	JOURNAL_DEV)
  EXT4_FEATURE_INCOMPAT_FUNCS(meta_bg,		META_BG)
  EXT4_FEATURE_INCOMPAT_FUNCS(extents,		EXTENTS)
  EXT4_FEATURE_INCOMPAT_FUNCS(64bit,		64BIT)
  EXT4_FEATURE_INCOMPAT_FUNCS(mmp,		MMP)
  EXT4_FEATURE_INCOMPAT_FUNCS(flex_bg,		FLEX_BG)
  EXT4_FEATURE_INCOMPAT_FUNCS(ea_inode,		EA_INODE)
  EXT4_FEATURE_INCOMPAT_FUNCS(dirdata,		DIRDATA)
  EXT4_FEATURE_INCOMPAT_FUNCS(csum_seed,		CSUM_SEED)
  EXT4_FEATURE_INCOMPAT_FUNCS(largedir,		LARGEDIR)
  EXT4_FEATURE_INCOMPAT_FUNCS(inline_data,	INLINE_DATA)
  EXT4_FEATURE_INCOMPAT_FUNCS(encrypt,		ENCRYPT)
2035e7760   Theodore Ts'o   ext4: check for e...
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
  #define EXT2_FEATURE_COMPAT_SUPP	EXT4_FEATURE_COMPAT_EXT_ATTR
  #define EXT2_FEATURE_INCOMPAT_SUPP	(EXT4_FEATURE_INCOMPAT_FILETYPE| \
  					 EXT4_FEATURE_INCOMPAT_META_BG)
  #define EXT2_FEATURE_RO_COMPAT_SUPP	(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
  					 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
  					 EXT4_FEATURE_RO_COMPAT_BTREE_DIR)
  
  #define EXT3_FEATURE_COMPAT_SUPP	EXT4_FEATURE_COMPAT_EXT_ATTR
  #define EXT3_FEATURE_INCOMPAT_SUPP	(EXT4_FEATURE_INCOMPAT_FILETYPE| \
  					 EXT4_FEATURE_INCOMPAT_RECOVER| \
  					 EXT4_FEATURE_INCOMPAT_META_BG)
  #define EXT3_FEATURE_RO_COMPAT_SUPP	(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
  					 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
  					 EXT4_FEATURE_RO_COMPAT_BTREE_DIR)
e2b911c53   Darrick J. Wong   ext4: clean up fe...
1740
  #define EXT4_FEATURE_COMPAT_SUPP	EXT4_FEATURE_COMPAT_EXT_ATTR
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1741
1742
  #define EXT4_FEATURE_INCOMPAT_SUPP	(EXT4_FEATURE_INCOMPAT_FILETYPE| \
  					 EXT4_FEATURE_INCOMPAT_RECOVER| \
a86c61812   Alex Tomas   [PATCH] ext3: add...
1743
  					 EXT4_FEATURE_INCOMPAT_META_BG| \
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
1744
  					 EXT4_FEATURE_INCOMPAT_EXTENTS| \
ce4215817   Jose R. Santos   ext4: FLEX_BG Ker...
1745
  					 EXT4_FEATURE_INCOMPAT_64BIT| \
c5e06d101   Johann Lombardi   ext4: add support...
1746
  					 EXT4_FEATURE_INCOMPAT_FLEX_BG| \
e50e5129f   Andreas Dilger   ext4: xattr-in-in...
1747
  					 EXT4_FEATURE_INCOMPAT_EA_INODE| \
6ddb24478   Theodore Ts'o   ext4 crypto: enab...
1748
1749
  					 EXT4_FEATURE_INCOMPAT_MMP | \
  					 EXT4_FEATURE_INCOMPAT_INLINE_DATA | \
8c81bd8f5   Darrick J. Wong   ext4: store check...
1750
  					 EXT4_FEATURE_INCOMPAT_ENCRYPT | \
e08ac99fa   Artem Blagodarenko   ext4: add largedi...
1751
1752
  					 EXT4_FEATURE_INCOMPAT_CSUM_SEED | \
  					 EXT4_FEATURE_INCOMPAT_LARGEDIR)
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1753
1754
  #define EXT4_FEATURE_RO_COMPAT_SUPP	(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
  					 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
717d50e49   Andreas Dilger   Ext4: Uninitializ...
1755
  					 EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \
f8628a14a   Andreas Dilger   ext4: Remove 6500...
1756
  					 EXT4_FEATURE_RO_COMPAT_DIR_NLINK | \
ef7f38359   Kalpak Shah   ext4: Add nanosec...
1757
  					 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE | \
0fc1b4514   Aneesh Kumar K.V   ext4: Add support...
1758
  					 EXT4_FEATURE_RO_COMPAT_BTREE_DIR |\
6f16b6069   Theodore Ts'o   ext4: enable moun...
1759
  					 EXT4_FEATURE_RO_COMPAT_HUGE_FILE |\
e93376c20   Darrick J. Wong   ext4/jbd2: add me...
1760
  					 EXT4_FEATURE_RO_COMPAT_BIGALLOC |\
7c319d328   Aditya Kali   ext4: make quota ...
1761
  					 EXT4_FEATURE_RO_COMPAT_METADATA_CSUM|\
040cb3786   Li Xi   ext4: adds projec...
1762
1763
  					 EXT4_FEATURE_RO_COMPAT_QUOTA |\
  					 EXT4_FEATURE_RO_COMPAT_PROJECT)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1764

e2b911c53   Darrick J. Wong   ext4: clean up fe...
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
  #define EXTN_FEATURE_FUNCS(ver) \
  static inline bool ext4_has_unknown_ext##ver##_compat_features(struct super_block *sb) \
  { \
  	return ((EXT4_SB(sb)->s_es->s_feature_compat & \
  		cpu_to_le32(~EXT##ver##_FEATURE_COMPAT_SUPP)) != 0); \
  } \
  static inline bool ext4_has_unknown_ext##ver##_ro_compat_features(struct super_block *sb) \
  { \
  	return ((EXT4_SB(sb)->s_es->s_feature_ro_compat & \
  		cpu_to_le32(~EXT##ver##_FEATURE_RO_COMPAT_SUPP)) != 0); \
  } \
  static inline bool ext4_has_unknown_ext##ver##_incompat_features(struct super_block *sb) \
  { \
  	return ((EXT4_SB(sb)->s_es->s_feature_incompat & \
  		cpu_to_le32(~EXT##ver##_FEATURE_INCOMPAT_SUPP)) != 0); \
  }
  
  EXTN_FEATURE_FUNCS(2)
  EXTN_FEATURE_FUNCS(3)
  EXTN_FEATURE_FUNCS(4)
  
  static inline bool ext4_has_compat_features(struct super_block *sb)
  {
  	return (EXT4_SB(sb)->s_es->s_feature_compat != 0);
  }
  static inline bool ext4_has_ro_compat_features(struct super_block *sb)
  {
  	return (EXT4_SB(sb)->s_es->s_feature_ro_compat != 0);
  }
  static inline bool ext4_has_incompat_features(struct super_block *sb)
  {
  	return (EXT4_SB(sb)->s_es->s_feature_incompat != 0);
  }
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1798
  /*
9549a168b   Theodore Ts'o   ext4: rename s_re...
1799
1800
1801
   * Superblock flags
   */
  #define EXT4_FLAGS_RESIZING	0
0db1ff222   Theodore Ts'o   ext4: add shutdow...
1802
1803
1804
1805
1806
1807
  #define EXT4_FLAGS_SHUTDOWN	1
  
  static inline int ext4_forced_shutdown(struct ext4_sb_info *sbi)
  {
  	return test_bit(EXT4_FLAGS_SHUTDOWN, &sbi->s_ext4_flags);
  }
9549a168b   Theodore Ts'o   ext4: rename s_re...
1808
1809
1810
  
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1811
1812
   * Default values for user and/or group using reserved blocks
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1813
1814
  #define	EXT4_DEF_RESUID		0
  #define	EXT4_DEF_RESGID		0
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1815

040cb3786   Li Xi   ext4: adds projec...
1816
1817
1818
1819
  /*
   * Default project ID
   */
  #define	EXT4_DEF_PROJID		0
240799cdf   Theodore Ts'o   ext4: Use readahe...
1820
  #define EXT4_DEF_INODE_READAHEAD_BLKS	32
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1821
1822
1823
  /*
   * Default mount options
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1824
1825
1826
1827
1828
1829
1830
1831
1832
  #define EXT4_DEFM_DEBUG		0x0001
  #define EXT4_DEFM_BSDGROUPS	0x0002
  #define EXT4_DEFM_XATTR_USER	0x0004
  #define EXT4_DEFM_ACL		0x0008
  #define EXT4_DEFM_UID16		0x0010
  #define EXT4_DEFM_JMODE		0x0060
  #define EXT4_DEFM_JMODE_DATA	0x0020
  #define EXT4_DEFM_JMODE_ORDERED	0x0040
  #define EXT4_DEFM_JMODE_WBACK	0x0060
8b67f04ab   Theodore Ts'o   ext4: Add mount o...
1833
1834
1835
1836
  #define EXT4_DEFM_NOBARRIER	0x0100
  #define EXT4_DEFM_BLOCK_VALIDITY 0x0200
  #define EXT4_DEFM_DISCARD	0x0400
  #define EXT4_DEFM_NODELALLOC	0x0800
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1837
1838
  
  /*
30773840c   Theodore Ts'o   ext4: add fsync b...
1839
1840
1841
1842
1843
1844
   * Default journal batch times
   */
  #define EXT4_DEF_MIN_BATCH_TIME	0
  #define EXT4_DEF_MAX_BATCH_TIME	15000 /* 15ms */
  
  /*
a4912123b   Theodore Ts'o   ext4: New inode/b...
1845
1846
1847
1848
1849
1850
   * Minimum number of groups in a flexgroup before we separate out
   * directories into the first block group of a flexgroup
   */
  #define EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME	4
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1851
1852
   * Structure of a directory entry
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1853
  #define EXT4_NAME_LEN 255
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1854

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1855
  struct ext4_dir_entry {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1856
1857
1858
  	__le32	inode;			/* Inode number */
  	__le16	rec_len;		/* Directory entry length */
  	__le16	name_len;		/* Name length */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1859
  	char	name[EXT4_NAME_LEN];	/* File name */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1860
1861
1862
  };
  
  /*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1863
   * The new version of the directory entry.  Since EXT4 structures are
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1864
1865
1866
1867
   * stored in intel byte order, and the name_len field could never be
   * bigger than 255 chars, it's safe to reclaim the extra byte for the
   * file_type field.
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1868
  struct ext4_dir_entry_2 {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1869
1870
1871
1872
  	__le32	inode;			/* Inode number */
  	__le16	rec_len;		/* Directory entry length */
  	__u8	name_len;		/* Name length */
  	__u8	file_type;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1873
  	char	name[EXT4_NAME_LEN];	/* File name */
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1874
1875
1876
  };
  
  /*
e61539189   Darrick J. Wong   ext4: change on-d...
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
   * This is a bogus directory entry at the end of each leaf block that
   * records checksums.
   */
  struct ext4_dir_entry_tail {
  	__le32	det_reserved_zero1;	/* Pretend to be unused */
  	__le16	det_rec_len;		/* 12 */
  	__u8	det_reserved_zero2;	/* Zero name length */
  	__u8	det_reserved_ft;	/* 0xDE, fake file type */
  	__le32	det_checksum;		/* crc32c(uuid+inum+dirblock) */
  };
3c47d5417   Tao Ma   ext4: let add_dir...
1887
1888
1889
1890
  #define EXT4_DIRENT_TAIL(block, blocksize) \
  	((struct ext4_dir_entry_tail *)(((void *)(block)) + \
  					((blocksize) - \
  					 sizeof(struct ext4_dir_entry_tail))))
e61539189   Darrick J. Wong   ext4: change on-d...
1891
  /*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1892
   * Ext4 directory file types.  Only the low 3 bits are used.  The
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1893
1894
   * other bits are reserved for now.
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1895
1896
1897
1898
1899
1900
1901
1902
  #define EXT4_FT_UNKNOWN		0
  #define EXT4_FT_REG_FILE	1
  #define EXT4_FT_DIR		2
  #define EXT4_FT_CHRDEV		3
  #define EXT4_FT_BLKDEV		4
  #define EXT4_FT_FIFO		5
  #define EXT4_FT_SOCK		6
  #define EXT4_FT_SYMLINK		7
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1903

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1904
  #define EXT4_FT_MAX		8
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1905

e61539189   Darrick J. Wong   ext4: change on-d...
1906
  #define EXT4_FT_DIR_CSUM	0xDE
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1907
  /*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1908
   * EXT4_DIR_PAD defines the directory entries boundaries
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1909
1910
1911
   *
   * NOTE: It must be a multiple of 4
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1912
1913
1914
1915
  #define EXT4_DIR_PAD			4
  #define EXT4_DIR_ROUND			(EXT4_DIR_PAD - 1)
  #define EXT4_DIR_REC_LEN(name_len)	(((name_len) + 8 + EXT4_DIR_ROUND) & \
  					 ~EXT4_DIR_ROUND)
a72d7f834   Jan Kara   ext4: Avoid rec_l...
1916
  #define EXT4_MAX_REC_LEN		((1<<16)-1)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1917
  /*
0cfc9255a   Eric Sandeen   ext4: re-inline e...
1918
1919
1920
1921
1922
1923
1924
   * If we ever get support for fs block sizes > page_size, we'll need
   * to remove the #if statements in the next two functions...
   */
  static inline unsigned int
  ext4_rec_len_from_disk(__le16 dlen, unsigned blocksize)
  {
  	unsigned len = le16_to_cpu(dlen);
ea1754a08   Kirill A. Shutemov   mm, fs: remove re...
1925
  #if (PAGE_SIZE >= 65536)
0cfc9255a   Eric Sandeen   ext4: re-inline e...
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
  	if (len == EXT4_MAX_REC_LEN || len == 0)
  		return blocksize;
  	return (len & 65532) | ((len & 3) << 16);
  #else
  	return len;
  #endif
  }
  
  static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)
  {
  	if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3))
  		BUG();
ea1754a08   Kirill A. Shutemov   mm, fs: remove re...
1938
  #if (PAGE_SIZE >= 65536)
0cfc9255a   Eric Sandeen   ext4: re-inline e...
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
  	if (len < 65536)
  		return cpu_to_le16(len);
  	if (len == blocksize) {
  		if (blocksize == 65536)
  			return cpu_to_le16(EXT4_MAX_REC_LEN);
  		else
  			return cpu_to_le16(0);
  	}
  	return cpu_to_le16((len & 65532) | ((len >> 16) & 3));
  #else
  	return cpu_to_le16(len);
  #endif
  }
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1954
1955
1956
   * Hash Tree Directory indexing
   * (c) Daniel Phillips, 2001
   */
e2b911c53   Darrick J. Wong   ext4: clean up fe...
1957
  #define is_dx(dir) (ext4_has_feature_dir_index((dir)->i_sb) && \
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
1958
  		    ext4_test_inode_flag((dir), EXT4_INODE_INDEX))
c74148920   Andreas Dilger   ext4: fix dir_nli...
1959
1960
  #define EXT4_DIR_LINK_MAX(dir) unlikely((dir)->i_nlink >= EXT4_LINK_MAX && \
  		    !(ext4_has_feature_dir_nlink((dir)->i_sb) && is_dx(dir)))
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
1961
  #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1962
1963
1964
1965
1966
1967
  
  /* Legal values for the dx_root hash_version field: */
  
  #define DX_HASH_LEGACY		0
  #define DX_HASH_HALF_MD4	1
  #define DX_HASH_TEA		2
f99b25897   Theodore Ts'o   ext4: Add support...
1968
1969
1970
  #define DX_HASH_LEGACY_UNSIGNED	3
  #define DX_HASH_HALF_MD4_UNSIGNED	4
  #define DX_HASH_TEA_UNSIGNED		5
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1971

0441984a3   Darrick J. Wong   ext4: load the cr...
1972
1973
1974
1975
1976
  static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc,
  			      const void *address, unsigned int length)
  {
  	struct {
  		struct shash_desc shash;
3108b54bc   Theodore Ts'o   ext4: remove dyna...
1977
  		char ctx[4];
0441984a3   Darrick J. Wong   ext4: load the cr...
1978
1979
  	} desc;
  	int err;
3108b54bc   Theodore Ts'o   ext4: remove dyna...
1980
  	BUG_ON(crypto_shash_descsize(sbi->s_chksum_driver)!=sizeof(desc.ctx));
0441984a3   Darrick J. Wong   ext4: load the cr...
1981
1982
1983
1984
1985
1986
1987
1988
1989
  	desc.shash.tfm = sbi->s_chksum_driver;
  	desc.shash.flags = 0;
  	*(u32 *)desc.ctx = crc;
  
  	err = crypto_shash_update(&desc.shash, address, length);
  	BUG_ON(err);
  
  	return *(u32 *)desc.ctx;
  }
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
  #ifdef __KERNEL__
  
  /* hash info structure used by the directory hash */
  struct dx_hash_info
  {
  	u32		hash;
  	u32		minor_hash;
  	int		hash_version;
  	u32		*seed;
  };
d1f5273e9   Fan Yong   ext4: return 32/6...
2000
2001
2002
2003
  
  /* 32 and 64 bit signed EOF for dx directories */
  #define EXT4_HTREE_EOF_32BIT   ((1UL  << (32 - 1)) - 1)
  #define EXT4_HTREE_EOF_64BIT   ((1ULL << (64 - 1)) - 1)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2004
2005
  
  /*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2006
   * Control parameters used by ext4_htree_next_block
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2007
2008
   */
  #define HASH_NB_ALWAYS		1
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2009
2010
  struct ext4_filename {
  	const struct qstr *usr_fname;
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2011
  	struct fscrypt_str disk_name;
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2012
2013
  	struct dx_hash_info hinfo;
  #ifdef CONFIG_EXT4_FS_ENCRYPTION
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2014
  	struct fscrypt_str crypto_buf;
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2015
2016
2017
2018
2019
  #endif
  };
  
  #define fname_name(p) ((p)->disk_name.name)
  #define fname_len(p)  ((p)->disk_name.len)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2020
2021
2022
2023
  
  /*
   * Describe an inode's exact location on disk and in memory
   */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2024
  struct ext4_iloc
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2025
2026
2027
  {
  	struct buffer_head *bh;
  	unsigned long offset;
fd2d42912   Avantika Mathur   ext4: add ext4_gr...
2028
  	ext4_group_t block_group;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2029
  };
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2030
  static inline struct ext4_inode *ext4_raw_inode(struct ext4_iloc *iloc)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2031
  {
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2032
  	return (struct ext4_inode *) (iloc->bh->b_data + iloc->offset);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2033
  }
dec214d00   Tahsin Erdogan   ext4: xattr inode...
2034
2035
2036
2037
2038
  static inline bool ext4_is_quota_file(struct inode *inode)
  {
  	return IS_NOQUOTA(inode) &&
  	       !(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL);
  }
02749a4c2   Tahsin Erdogan   ext4: add ext4_is...
2039

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
  /*
   * This structure is stuffed into the struct file's private_data field
   * for directories.  It is where we put information so that we can do
   * readdir operations in hash tree order.
   */
  struct dir_private_info {
  	struct rb_root	root;
  	struct rb_node	*curr_node;
  	struct fname	*extra_fname;
  	loff_t		last_pos;
  	__u32		curr_hash;
  	__u32		curr_minor_hash;
  	__u32		next_hash;
  };
  
  /* calculate the first block number of the group */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2056
  static inline ext4_fsblk_t
fd2d42912   Avantika Mathur   ext4: add ext4_gr...
2057
  ext4_group_first_block_no(struct super_block *sb, ext4_group_t group_no)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2058
  {
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2059
2060
  	return group_no * (ext4_fsblk_t)EXT4_BLOCKS_PER_GROUP(sb) +
  		le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2061
2062
2063
2064
2065
  }
  
  /*
   * Special error return code only used by dx_probe() and its callers.
   */
36de92864   Theodore Ts'o   ext4: propagate e...
2066
  #define ERR_BAD_DX_DIR	(-(MAX_ERRNO - 1))
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2067

e08ac99fa   Artem Blagodarenko   ext4: add largedi...
2068
2069
2070
2071
2072
2073
2074
2075
2076
  /* htree levels for ext4 */
  #define	EXT4_HTREE_LEVEL_COMPAT	2
  #define	EXT4_HTREE_LEVEL	3
  
  static inline int ext4_dir_htree_level(struct super_block *sb)
  {
  	return ext4_has_feature_largedir(sb) ?
  		EXT4_HTREE_LEVEL : EXT4_HTREE_LEVEL_COMPAT;
  }
3a5b2ecdd   Mingming Cao   [PATCH] ext4: swi...
2077
  /*
bfff68738   Lukas Czerner   ext4: add support...
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
   * Timeout and state flag for lazy initialization inode thread.
   */
  #define EXT4_DEF_LI_WAIT_MULT			10
  #define EXT4_DEF_LI_MAX_START_DELAY		5
  #define EXT4_LAZYINIT_QUIT			0x0001
  #define EXT4_LAZYINIT_RUNNING			0x0002
  
  /*
   * Lazy inode table initialization info
   */
  struct ext4_lazy_init {
  	unsigned long		li_state;
bfff68738   Lukas Czerner   ext4: add support...
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
  	struct list_head	li_request_list;
  	struct mutex		li_list_mtx;
  };
  
  struct ext4_li_request {
  	struct super_block	*lr_super;
  	struct ext4_sb_info	*lr_sbi;
  	ext4_group_t		lr_next_group;
  	struct list_head	lr_request;
  	unsigned long		lr_next_sched;
  	unsigned long		lr_timeout;
  };
857ac889c   Lukas Czerner   ext4: add interfa...
2102
2103
2104
2105
  struct ext4_features {
  	struct kobject f_kobj;
  	struct completion f_kobj_unregister;
  };
bfff68738   Lukas Czerner   ext4: add support...
2106
  /*
c5e06d101   Johann Lombardi   ext4: add support...
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
   * This structure will be used for multiple mount protection. It will be
   * written into the block number saved in the s_mmp_block field in the
   * superblock. Programs that check MMP should assume that if
   * SEQ_FSCK (or any unknown code above SEQ_MAX) is present then it is NOT safe
   * to use the filesystem, regardless of how old the timestamp is.
   */
  #define EXT4_MMP_MAGIC     0x004D4D50U /* ASCII for MMP */
  #define EXT4_MMP_SEQ_CLEAN 0xFF4D4D50U /* mmp_seq value for clean unmount */
  #define EXT4_MMP_SEQ_FSCK  0xE24D4D50U /* mmp_seq value when being fscked */
  #define EXT4_MMP_SEQ_MAX   0xE24D4D4FU /* maximum valid mmp_seq value */
  
  struct mmp_struct {
  	__le32	mmp_magic;		/* Magic number for MMP */
  	__le32	mmp_seq;		/* Sequence no. updated periodically */
  
  	/*
  	 * mmp_time, mmp_nodename & mmp_bdevname are only used for information
  	 * purposes and do not affect the correctness of the algorithm
  	 */
  	__le64	mmp_time;		/* Time last updated */
  	char	mmp_nodename[64];	/* Node which last updated MMP block */
  	char	mmp_bdevname[32];	/* Bdev which last updated MMP block */
  
  	/*
  	 * mmp_check_interval is used to verify if the MMP block has been
  	 * updated on the block device. The value is updated based on the
  	 * maximum time to write the MMP block during an update cycle.
  	 */
  	__le16	mmp_check_interval;
  
  	__le16	mmp_pad1;
e61539189   Darrick J. Wong   ext4: change on-d...
2138
2139
  	__le32	mmp_pad2[226];
  	__le32	mmp_checksum;		/* crc32c(uuid+mmp_block) */
c5e06d101   Johann Lombardi   ext4: add support...
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
  };
  
  /* arguments passed to the mmp thread */
  struct mmpd_data {
  	struct buffer_head *bh; /* bh from initial read_mmp_block() */
  	struct super_block *sb;  /* super block of the fs */
  };
  
  /*
   * Check interval multiplier
   * The MMP block is written every update interval and initially checked every
   * update interval x the multiplier (the value is then adapted based on the
   * write latency). The reason is that writes can be delayed under load and we
   * don't want readers to incorrectly assume that the filesystem is no longer
   * in use.
   */
  #define EXT4_MMP_CHECK_MULT		2UL
  
  /*
   * Minimum interval for MMP checking in seconds.
   */
  #define EXT4_MMP_MIN_CHECK_INTERVAL	5UL
  
  /*
   * Maximum interval for MMP checking in seconds.
   */
  #define EXT4_MMP_MAX_CHECK_INTERVAL	300UL
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2169
2170
2171
2172
2173
   * Function prototypes
   */
  
  /*
   * Ok, these declarations are also in <linux/kernel.h> but none of the
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2174
   * ext4 source programs needs to include it so they are duplicated here.
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2175
   */
8c55e2041   Dave Kleikamp   EXT4: Fix whitespace
2176
2177
2178
  # define NORET_TYPE	/**/
  # define ATTRIB_NORET	__attribute__((noreturn))
  # define NORET_AND	noreturn,
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2179

498e5f241   Theodore Ts'o   ext4: Change unsi...
2180
  /* bitmap.c */
f6fb99cad   Theodore Ts'o   ext4: pass a char...
2181
  extern unsigned int ext4_count_free(char *bitmap, unsigned numchars);
41a246d1f   Darrick J. Wong   ext4: calculate a...
2182
2183
2184
2185
2186
2187
  void ext4_inode_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
  				struct ext4_group_desc *gdp,
  				struct buffer_head *bh, int sz);
  int ext4_inode_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
  				  struct ext4_group_desc *gdp,
  				  struct buffer_head *bh, int sz);
fa77dcfaf   Darrick J. Wong   ext4: calculate a...
2188
2189
  void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
  				struct ext4_group_desc *gdp,
79f1ba495   Tao Ma   ext4: Checksum th...
2190
  				struct buffer_head *bh);
fa77dcfaf   Darrick J. Wong   ext4: calculate a...
2191
2192
  int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
  				  struct ext4_group_desc *gdp,
79f1ba495   Tao Ma   ext4: Checksum th...
2193
  				  struct buffer_head *bh);
498e5f241   Theodore Ts'o   ext4: Change unsi...
2194

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2195
  /* balloc.c */
bd86298e6   Lukas Czerner   ext4: introduce e...
2196
2197
2198
2199
2200
2201
  extern void ext4_get_group_no_and_offset(struct super_block *sb,
  					 ext4_fsblk_t blocknr,
  					 ext4_group_t *blockgrpp,
  					 ext4_grpblk_t *offsetp);
  extern ext4_group_t ext4_get_group_number(struct super_block *sb,
  					  ext4_fsblk_t block);
3a5b2ecdd   Mingming Cao   [PATCH] ext4: swi...
2202
2203
2204
2205
  extern unsigned int ext4_block_group(struct super_block *sb,
  			ext4_fsblk_t blocknr);
  extern ext4_grpblk_t ext4_block_group_offset(struct super_block *sb,
  			ext4_fsblk_t blocknr);
fd2d42912   Avantika Mathur   ext4: add ext4_gr...
2206
2207
2208
  extern int ext4_bg_has_super(struct super_block *sb, ext4_group_t group);
  extern unsigned long ext4_bg_num_gdb(struct super_block *sb,
  			ext4_group_t group);
7061eba75   Aneesh Kumar K.V   ext4: Use inode p...
2209
  extern ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
55f020db6   Allison Henderson   ext4: add flag to...
2210
2211
2212
2213
  					 ext4_fsblk_t goal,
  					 unsigned int flags,
  					 unsigned long *count,
  					 int *errp);
e7d5f3156   Theodore Ts'o   ext4: rename ext4...
2214
2215
  extern int ext4_claim_free_clusters(struct ext4_sb_info *sbi,
  				    s64 nclusters, unsigned int flags);
5dee54372   Theodore Ts'o   ext4: rename ext4...
2216
  extern ext4_fsblk_t ext4_count_free_clusters(struct super_block *);
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2217
  extern void ext4_check_blocks_bitmap(struct super_block *);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2218
  extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
fd2d42912   Avantika Mathur   ext4: add ext4_gr...
2219
  						    ext4_group_t block_group,
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2220
  						    struct buffer_head ** bh);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2221
  extern int ext4_should_retry_alloc(struct super_block *sb, int *retries);
813e57276   Theodore Ts'o   ext4: fix race wh...
2222
2223
2224
2225
2226
2227
2228
2229
  
  extern struct buffer_head *ext4_read_block_bitmap_nowait(struct super_block *sb,
  						ext4_group_t block_group);
  extern int ext4_wait_block_bitmap(struct super_block *sb,
  				  ext4_group_t block_group,
  				  struct buffer_head *bh);
  extern struct buffer_head *ext4_read_block_bitmap(struct super_block *sb,
  						  ext4_group_t block_group);
cff1dfd76   Theodore Ts'o   ext4: rename ext4...
2230
2231
2232
  extern unsigned ext4_free_clusters_after_init(struct super_block *sb,
  					      ext4_group_t block_group,
  					      struct ext4_group_desc *gdp);
f86186b44   Eric Sandeen   ext4: refactor du...
2233
  ext4_fsblk_t ext4_inode_to_goal_block(struct inode *);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2234

a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2235
  static inline bool ext4_encrypted_inode(struct inode *inode)
b30ab0e03   Michael Halcrow   ext4 crypto: add ...
2236
  {
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2237
  	return ext4_test_inode_flag(inode, EXT4_INODE_ENCRYPT);
b30ab0e03   Michael Halcrow   ext4 crypto: add ...
2238
  }
b30ab0e03   Michael Halcrow   ext4 crypto: add ...
2239

d5d0e8c72   Michael Halcrow   ext4 crypto: file...
2240
  #ifdef CONFIG_EXT4_FS_ENCRYPTION
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2241
  static inline int ext4_fname_setup_filename(struct inode *dir,
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2242
2243
  			const struct qstr *iname,
  			int lookup, struct ext4_filename *fname)
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2244
  {
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2245
2246
  	struct fscrypt_name name;
  	int err;
d5d0e8c72   Michael Halcrow   ext4 crypto: file...
2247

a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2248
  	memset(fname, 0, sizeof(struct ext4_filename));
88bd6ccdc   Michael Halcrow   ext4 crypto: add ...
2249

a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2250
  	err = fscrypt_setup_filename(dir, iname, lookup, &name);
b7236e21d   Theodore Ts'o   ext4 crypto: reor...
2251

a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2252
2253
2254
2255
2256
2257
  	fname->usr_fname = name.usr_fname;
  	fname->disk_name = name.disk_name;
  	fname->hinfo.hash = name.hash;
  	fname->hinfo.minor_hash = name.minor_hash;
  	fname->crypto_buf = name.crypto_buf;
  	return err;
b7236e21d   Theodore Ts'o   ext4 crypto: reor...
2258
  }
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2259
  static inline void ext4_fname_free_filename(struct ext4_filename *fname)
e709e9df6   Theodore Ts'o   ext4 crypto: encr...
2260
  {
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2261
  	struct fscrypt_name name;
e709e9df6   Theodore Ts'o   ext4 crypto: encr...
2262

a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2263
2264
2265
2266
2267
2268
  	name.crypto_buf = fname->crypto_buf;
  	fscrypt_free_filename(&name);
  
  	fname->crypto_buf.name = NULL;
  	fname->usr_fname = NULL;
  	fname->disk_name.name = NULL;
88bd6ccdc   Michael Halcrow   ext4 crypto: add ...
2269
  }
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2270
2271
2272
2273
  #else
  static inline int ext4_fname_setup_filename(struct inode *dir,
  		const struct qstr *iname,
  		int lookup, struct ext4_filename *fname)
b7236e21d   Theodore Ts'o   ext4 crypto: reor...
2274
  {
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2275
2276
2277
  	fname->usr_fname = iname;
  	fname->disk_name.name = (unsigned char *) iname->name;
  	fname->disk_name.len = iname->len;
b7236e21d   Theodore Ts'o   ext4 crypto: reor...
2278
2279
  	return 0;
  }
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2280
  static inline void ext4_fname_free_filename(struct ext4_filename *fname) { }
88bd6ccdc   Michael Halcrow   ext4 crypto: add ...
2281

a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2282
  #endif
88bd6ccdc   Michael Halcrow   ext4 crypto: add ...
2283

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2284
  /* dir.c */
60fd4da34   Theodore Ts'o   ext4: Cleanup ext...
2285
  extern int __ext4_check_dir_entry(const char *, unsigned int, struct inode *,
f7c21177a   Theodore Ts'o   ext4: Use ext4_er...
2286
  				  struct file *,
60fd4da34   Theodore Ts'o   ext4: Cleanup ext...
2287
  				  struct ext4_dir_entry_2 *,
226ba972b   Tao Ma   ext4: refactor __...
2288
2289
2290
  				  struct buffer_head *, char *, int,
  				  unsigned int);
  #define ext4_check_dir_entry(dir, filp, de, bh, buf, size, offset)	\
f7c21177a   Theodore Ts'o   ext4: Use ext4_er...
2291
  	unlikely(__ext4_check_dir_entry(__func__, __LINE__, (dir), (filp), \
226ba972b   Tao Ma   ext4: refactor __...
2292
  					(de), (bh), (buf), (size), (offset)))
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2293
  extern int ext4_htree_store_dirent(struct file *dir_file, __u32 hash,
2f61830ae   Theodore Ts'o   ext4 crypto: teac...
2294
2295
  				__u32 minor_hash,
  				struct ext4_dir_entry_2 *dirent,
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2296
  				struct fscrypt_str *ent_name);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2297
  extern void ext4_htree_free_dir_info(struct dir_private_info *p);
978fef914   Tao Ma   ext4: create __ex...
2298
2299
2300
  extern int ext4_find_dest_de(struct inode *dir, struct inode *inode,
  			     struct buffer_head *bh,
  			     void *buf, int buf_size,
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2301
  			     struct ext4_filename *fname,
978fef914   Tao Ma   ext4: create __ex...
2302
  			     struct ext4_dir_entry_2 **dest_de);
1bc0af600   Eric Biggers   ext4: trim return...
2303
2304
2305
2306
  void ext4_insert_dentry(struct inode *inode,
  			struct ext4_dir_entry_2 *de,
  			int buf_size,
  			struct ext4_filename *fname);
978fef914   Tao Ma   ext4: create __ex...
2307
2308
  static inline void ext4_update_dx_flag(struct inode *inode)
  {
e2b911c53   Darrick J. Wong   ext4: clean up fe...
2309
  	if (!ext4_has_feature_dir_index(inode->i_sb))
978fef914   Tao Ma   ext4: create __ex...
2310
2311
  		ext4_clear_inode_flag(inode, EXT4_INODE_INDEX);
  }
d60061867   Eric Biggers   ext4: constify st...
2312
  static const unsigned char ext4_filetype_table[] = {
65d165d93   Tao Ma   ext4: let ext4_re...
2313
2314
2315
2316
2317
  	DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK
  };
  
  static inline  unsigned char get_dtype(struct super_block *sb, int filetype)
  {
e2b911c53   Darrick J. Wong   ext4: clean up fe...
2318
  	if (!ext4_has_feature_filetype(sb) || filetype >= EXT4_FT_MAX)
65d165d93   Tao Ma   ext4: let ext4_re...
2319
2320
2321
2322
  		return DT_UNKNOWN;
  
  	return ext4_filetype_table[filetype];
  }
40b163f1c   Darrick J. Wong   ext4: check inlin...
2323
2324
  extern int ext4_check_all_de(struct inode *dir, struct buffer_head *bh,
  			     void *buf, int buf_size);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2325
2326
  
  /* fsync.c */
02c24a821   Josef Bacik   fs: push i_mutex ...
2327
  extern int ext4_sync_file(struct file *, loff_t, loff_t, int);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2328
2329
  
  /* hash.c */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2330
  extern int ext4fs_dirhash(const char *name, int len, struct
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2331
2332
2333
  			  dx_hash_info *hinfo);
  
  /* ialloc.c */
1139575a9   Theodore Ts'o   ext4: start handl...
2334
2335
  extern struct inode *__ext4_new_inode(handle_t *, struct inode *, umode_t,
  				      const struct qstr *qstr, __u32 goal,
1b917ed8a   Tahsin Erdogan   ext4: do not set ...
2336
2337
2338
  				      uid_t *owner, __u32 i_flags,
  				      int handle_type, unsigned int line_no,
  				      int nblocks);
1139575a9   Theodore Ts'o   ext4: start handl...
2339

1b917ed8a   Tahsin Erdogan   ext4: do not set ...
2340
  #define ext4_new_inode(handle, dir, mode, qstr, goal, owner, i_flags) \
1139575a9   Theodore Ts'o   ext4: start handl...
2341
  	__ext4_new_inode((handle), (dir), (mode), (qstr), (goal), (owner), \
1b917ed8a   Tahsin Erdogan   ext4: do not set ...
2342
  			 i_flags, 0, 0, 0)
1139575a9   Theodore Ts'o   ext4: start handl...
2343
2344
2345
  #define ext4_new_inode_start_handle(dir, mode, qstr, goal, owner, \
  				    type, nblocks)		    \
  	__ext4_new_inode(NULL, (dir), (mode), (qstr), (goal), (owner), \
1b917ed8a   Tahsin Erdogan   ext4: do not set ...
2346
  			 0, (type), __LINE__, (nblocks))
1139575a9   Theodore Ts'o   ext4: start handl...
2347

af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2348
2349
2350
2351
2352
  extern void ext4_free_inode(handle_t *, struct inode *);
  extern struct inode * ext4_orphan_get(struct super_block *, unsigned long);
  extern unsigned long ext4_count_free_inodes(struct super_block *);
  extern unsigned long ext4_count_dirs(struct super_block *);
  extern void ext4_check_inodes_bitmap(struct super_block *);
61d08673d   Theodore Ts'o   ext4: rename mark...
2353
  extern void ext4_mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
bfff68738   Lukas Czerner   ext4: add support...
2354
2355
  extern int ext4_init_inode_table(struct super_block *sb,
  				 ext4_group_t group, int barrier);
813e57276   Theodore Ts'o   ext4: fix race wh...
2356
  extern void ext4_end_bitmap_read(struct buffer_head *bh, int uptodate);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2357

c9de560de   Alex Tomas   ext4: Add multi b...
2358
  /* mballoc.c */
ebd173beb   Theodore Ts'o   ext4: move procfs...
2359
  extern const struct file_operations ext4_seq_mb_groups_fops;
c9de560de   Alex Tomas   ext4: Add multi b...
2360
2361
  extern long ext4_mb_stats;
  extern long ext4_mb_max_to_scan;
9d99012ff   Akira Fujita   ext4: remove need...
2362
  extern int ext4_mb_init(struct super_block *);
c9de560de   Alex Tomas   ext4: Add multi b...
2363
2364
2365
2366
  extern int ext4_mb_release(struct super_block *);
  extern ext4_fsblk_t ext4_mb_new_blocks(handle_t *,
  				struct ext4_allocation_request *, int *);
  extern int ext4_mb_reserve_blocks(struct super_block *, int);
c2ea3fde6   Theodore Ts'o   ext4: Remove old ...
2367
  extern void ext4_discard_preallocations(struct inode *);
5dabfc78d   Theodore Ts'o   ext4: rename {exi...
2368
2369
  extern int __init ext4_init_mballoc(void);
  extern void ext4_exit_mballoc(void);
443387113   Theodore Ts'o   ext4: fold ext4_f...
2370
  extern void ext4_free_blocks(handle_t *handle, struct inode *inode,
e6362609b   Theodore Ts'o   ext4: call ext4_f...
2371
2372
  			     struct buffer_head *bh, ext4_fsblk_t block,
  			     unsigned long count, int flags);
28623c2f5   Theodore Ts'o   ext4: grow the s_...
2373
2374
  extern int ext4_mb_alloc_groupinfo(struct super_block *sb,
  				   ext4_group_t ngroups);
920313a72   Aneesh Kumar K.V   ext4: Use EXT4_GR...
2375
  extern int ext4_mb_add_groupinfo(struct super_block *sb,
5f21b0e64   Frederic Bohe   ext4: fix online ...
2376
  		ext4_group_t i, struct ext4_group_desc *desc);
cc7365dfe   Yongqiang Yang   ext4: let ext4_gr...
2377
  extern int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
2846e8200   Amir Goldstein   ext4: move ext4_a...
2378
  				ext4_fsblk_t block, unsigned long count);
7360d1731   Lukas Czerner   ext4: Add batched...
2379
  extern int ext4_trim_fs(struct super_block *, struct fstrim_range *);
a01543448   Daeho Jeong   ext4: send parall...
2380
  extern void ext4_process_freed_data(struct super_block *sb, tid_t commit_tid);
7360d1731   Lukas Czerner   ext4: Add batched...
2381

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2382
  /* inode.c */
f348c2523   Theodore Ts'o   ext4 crypto: add ...
2383
  int ext4_inode_is_fast_symlink(struct inode *inode);
105600822   Theodore Ts'o   ext4: convert ext...
2384
  struct buffer_head *ext4_getblk(handle_t *, struct inode *, ext4_lblk_t, int);
1c2150283   Theodore Ts'o   ext4: convert ext...
2385
  struct buffer_head *ext4_bread(handle_t *, struct inode *, ext4_lblk_t, int);
9699d4f91   Tahsin Erdogan   ext4: make xattr ...
2386
2387
  int ext4_bread_batch(struct inode *inode, ext4_lblk_t block, int bh_count,
  		     bool wait, struct buffer_head **bhs);
705965bd6   Jan Kara   ext4: rename and ...
2388
2389
  int ext4_get_block_unwritten(struct inode *inode, sector_t iblock,
  			     struct buffer_head *bh_result, int create);
6873fa0de   Eric Sandeen   Hook ext4 to the ...
2390
  int ext4_get_block(struct inode *inode, sector_t iblock,
705965bd6   Jan Kara   ext4: rename and ...
2391
2392
2393
  		   struct buffer_head *bh_result, int create);
  int ext4_dio_get_block(struct inode *inode, sector_t iblock,
  		       struct buffer_head *bh_result, int create);
9c3569b50   Tao Ma   ext4: add delallo...
2394
2395
  int ext4_da_get_block_prep(struct inode *inode, sector_t iblock,
  			   struct buffer_head *bh, int create);
f19d5870c   Tao Ma   ext4: add normal ...
2396
2397
2398
2399
2400
2401
2402
2403
2404
  int ext4_walk_page_buffers(handle_t *handle,
  			   struct buffer_head *head,
  			   unsigned from,
  			   unsigned to,
  			   int *partial,
  			   int (*fn)(handle_t *handle,
  				     struct buffer_head *bh));
  int do_journal_get_write_access(handle_t *handle,
  				struct buffer_head *bh);
9c3569b50   Tao Ma   ext4: add delallo...
2405
2406
  #define FALL_BACK_TO_NONDELALLOC 1
  #define CONVERT_INLINE_DATA	 2
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2407

1d1fe1ee0   David Howells   iget: stop EXT4 f...
2408
  extern struct inode *ext4_iget(struct super_block *, unsigned long);
f4bb29810   Theodore Ts'o   ext4: add ext4_ig...
2409
  extern struct inode *ext4_iget_normal(struct super_block *, unsigned long);
a9185b41a   Christoph Hellwig   pass writeback_co...
2410
  extern int  ext4_write_inode(struct inode *, struct writeback_control *);
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2411
  extern int  ext4_setattr(struct dentry *, struct iattr *);
a528d35e8   David Howells   statx: Add a syst...
2412
  extern int  ext4_getattr(const struct path *, struct kstat *, u32, unsigned int);
0930fcc1e   Al Viro   convert ext4 to -...
2413
2414
  extern void ext4_evict_inode(struct inode *);
  extern void ext4_clear_inode(struct inode *);
99652ea56   David Howells   ext4: Add statx s...
2415
  extern int  ext4_file_getattr(const struct path *, struct kstat *, u32, unsigned int);
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2416
  extern int  ext4_sync_inode(handle_t *, struct inode *);
aa3857295   Christoph Hellwig   fs: pass exact ty...
2417
  extern void ext4_dirty_inode(struct inode *, int);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2418
2419
  extern int ext4_change_inode_journal_flag(struct inode *, int);
  extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *);
a361293f5   Jan Kara   jbd2: Fix oops in...
2420
  extern int ext4_inode_attach_jinode(struct inode *inode);
91ef4caf8   Duane Griffin   ext4: handle corr...
2421
  extern int ext4_can_truncate(struct inode *inode);
2c98eb5ea   Theodore Ts'o   ext4: allow ext4_...
2422
  extern int ext4_truncate(struct inode *);
aeb2817a4   Ashish Sangwan   ext4: pass inode ...
2423
  extern int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length);
487caeef9   Jan Kara   ext4: Fix possibl...
2424
  extern int ext4_truncate_restart_trans(handle_t *, struct inode *, int nblocks);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2425
  extern void ext4_set_inode_flags(struct inode *);
ccd2506bd   Theodore Ts'o   ext4: add EXT4_IO...
2426
  extern int ext4_alloc_da_blocks(struct inode *inode);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2427
  extern void ext4_set_aops(struct inode *inode);
a86c61812   Alex Tomas   [PATCH] ext3: add...
2428
  extern int ext4_writepage_trans_blocks(struct inode *);
f3bd1f3fa   Mingming Cao   ext4: journal cre...
2429
  extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks);
a87dd18ce   Lukas Czerner   ext4: use ext4_ze...
2430
2431
  extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
  			     loff_t lstart, loff_t lend);
11bac8000   Dave Jiang   mm, fs: reduce fa...
2432
2433
  extern int ext4_page_mkwrite(struct vm_fault *vmf);
  extern int ext4_filemap_fault(struct vm_fault *vmf);
a9e7f4472   Dmitry Monakhov   ext4: Convert to ...
2434
  extern qsize_t *ext4_get_reserved_space(struct inode *inode);
040cb3786   Li Xi   ext4: adds projec...
2435
  extern int ext4_get_projid(struct inode *inode, kprojid_t *projid);
5f634d064   Aneesh Kumar K.V   ext4: Fix quota a...
2436
2437
  extern void ext4_da_update_reserve_space(struct inode *inode,
  					int used, int quota_claim);
53085fac0   Jan Kara   ext4: provide ext...
2438
2439
  extern int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk,
  			      ext4_fsblk_t pblk, ext4_lblk_t len);
2d90c160e   Jan Kara   ext4: more effici...
2440
2441
2442
  extern int ext4_get_next_extent(struct inode *inode, ext4_lblk_t lblk,
  				unsigned int map_len,
  				struct extent_status *result);
dae1e52cb   Amir Goldstein   ext4: move ext4_i...
2443
2444
2445
2446
  
  /* indirect.c */
  extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
  				struct ext4_map_blocks *map, int flags);
dae1e52cb   Amir Goldstein   ext4: move ext4_i...
2447
  extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock);
fa55a0ed0   Jan Kara   ext4: improve wri...
2448
  extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks);
819c4920b   Theodore Ts'o   ext4: refactor tr...
2449
  extern void ext4_ind_truncate(handle_t *, struct inode *inode);
4f579ae7d   Lukas Czerner   ext4: fix punch h...
2450
2451
  extern int ext4_ind_remove_space(handle_t *handle, struct inode *inode,
  				 ext4_lblk_t start, ext4_lblk_t end);
ff9893dc8   Amir Goldstein   ext4: split ext4_...
2452

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2453
  /* ioctl.c */
5cdd7b2d7   Andi Kleen   Convert ext4 to u...
2454
  extern long ext4_ioctl(struct file *, unsigned int, unsigned long);
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2455
  extern long ext4_compat_ioctl(struct file *, unsigned int, unsigned long);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2456

c14c6fd5c   Aneesh Kumar K.V   ext4: Add EXT4_IO...
2457
  /* migrate.c */
2a43a8780   Aneesh Kumar K.V   ext4: elevate wri...
2458
  extern int ext4_ext_migrate(struct inode *);
0d14b098c   Lukas Czerner   ext4: move ext4_i...
2459
  extern int ext4_ind_migrate(struct inode *inode);
3d0518f47   Wei Yongjun   ext4: New rec_len...
2460

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2461
  /* namei.c */
b0336e8d2   Darrick J. Wong   ext4: calculate a...
2462
2463
  extern int ext4_dirent_csum_verify(struct inode *inode,
  				   struct ext4_dir_entry *dirent);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2464
2465
2466
  extern int ext4_orphan_add(handle_t *, struct inode *);
  extern int ext4_orphan_del(handle_t *, struct inode *);
  extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2467
  				__u32 start_minor_hash, __u32 *next_hash);
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2468
2469
2470
2471
2472
  extern int ext4_search_dir(struct buffer_head *bh,
  			   char *search_buf,
  			   int buf_size,
  			   struct inode *dir,
  			   struct ext4_filename *fname,
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2473
2474
  			   unsigned int offset,
  			   struct ext4_dir_entry_2 **res_dir);
05019a9e7   Tao Ma   ext4: make ext4_d...
2475
2476
2477
2478
2479
2480
2481
  extern int ext4_generic_delete_entry(handle_t *handle,
  				     struct inode *dir,
  				     struct ext4_dir_entry_2 *de_del,
  				     struct buffer_head *bh,
  				     void *entry_buf,
  				     int buf_size,
  				     int csum_size);
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2482
  extern bool ext4_empty_dir(struct inode *inode);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2483
2484
  
  /* resize.c */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2485
2486
2487
2488
2489
  extern int ext4_group_add(struct super_block *sb,
  				struct ext4_new_group_data *input);
  extern int ext4_group_extend(struct super_block *sb,
  				struct ext4_super_block *es,
  				ext4_fsblk_t n_blocks_count);
19c5246d2   Yongqiang Yang   ext4: add new onl...
2490
  extern int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2491
2492
  
  /* super.c */
9da1f6d06   Theodore Ts'o   ext4: add ext4_sb...
2493
2494
  extern struct buffer_head *ext4_sb_bread(struct super_block *sb,
  					 sector_t block, int op_flags);
ebd173beb   Theodore Ts'o   ext4: move procfs...
2495
  extern int ext4_seq_options_show(struct seq_file *seq, void *offset);
952fc18ef   Theodore Ts'o   ext4: fix overhea...
2496
  extern int ext4_calculate_overhead(struct super_block *sb);
06db49e68   Theodore Ts'o   ext4: fix metadat...
2497
  extern void ext4_superblock_csum_set(struct super_block *sb);
9933fc0ac   Theodore Ts'o   ext4: introduce e...
2498
2499
  extern void *ext4_kvmalloc(size_t size, gfp_t flags);
  extern void *ext4_kvzalloc(size_t size, gfp_t flags);
117fff10d   Theodore Ts'o   ext4: grow the s_...
2500
2501
  extern int ext4_alloc_flex_bg_array(struct super_block *sb,
  				    ext4_group_t ngroup);
722887ddc   Theodore Ts'o   ext4: move the jb...
2502
2503
  extern const char *ext4_decode_error(struct super_block *sb, int errno,
  				     char nbuf[16]);
e7c96e8e4   Joe Perches   ext4: reduce obje...
2504

b9075fa96   Joe Perches   treewide: use __p...
2505
2506
2507
  extern __printf(4, 5)
  void __ext4_error(struct super_block *, const char *, unsigned int,
  		  const char *, ...);
b9075fa96   Joe Perches   treewide: use __p...
2508
  extern __printf(5, 6)
e7c96e8e4   Joe Perches   ext4: reduce obje...
2509
  void __ext4_error_inode(struct inode *, const char *, unsigned int, ext4_fsblk_t,
b9075fa96   Joe Perches   treewide: use __p...
2510
2511
  		      const char *, ...);
  extern __printf(5, 6)
e7c96e8e4   Joe Perches   ext4: reduce obje...
2512
  void __ext4_error_file(struct file *, const char *, unsigned int, ext4_fsblk_t,
b9075fa96   Joe Perches   treewide: use __p...
2513
  		     const char *, ...);
c398eda0e   Theodore Ts'o   ext4: Pass line n...
2514
2515
  extern void __ext4_std_error(struct super_block *, const char *,
  			     unsigned int, int);
b9075fa96   Joe Perches   treewide: use __p...
2516
2517
2518
  extern __printf(4, 5)
  void __ext4_abort(struct super_block *, const char *, unsigned int,
  		  const char *, ...);
b9075fa96   Joe Perches   treewide: use __p...
2519
2520
2521
  extern __printf(4, 5)
  void __ext4_warning(struct super_block *, const char *, unsigned int,
  		    const char *, ...);
b03a2f7eb   Andreas Dilger   ext4: improve war...
2522
2523
2524
  extern __printf(4, 5)
  void __ext4_warning_inode(const struct inode *inode, const char *function,
  			  unsigned int line, const char *fmt, ...);
b9075fa96   Joe Perches   treewide: use __p...
2525
  extern __printf(3, 4)
e7c96e8e4   Joe Perches   ext4: reduce obje...
2526
  void __ext4_msg(struct super_block *, const char *, const char *, ...);
c5e06d101   Johann Lombardi   ext4: add support...
2527
2528
  extern void __dump_mmp_msg(struct super_block *, struct mmp_struct *mmp,
  			   const char *, unsigned int, const char *);
b9075fa96   Joe Perches   treewide: use __p...
2529
2530
2531
2532
2533
  extern __printf(7, 8)
  void __ext4_grp_locked_error(const char *, unsigned int,
  			     struct super_block *, ext4_group_t,
  			     unsigned long, ext4_fsblk_t,
  			     const char *, ...);
e7c96e8e4   Joe Perches   ext4: reduce obje...
2534

b03a2f7eb   Andreas Dilger   ext4: improve war...
2535
2536
2537
2538
2539
2540
2541
2542
  #define EXT4_ERROR_INODE(inode, fmt, a...) \
  	ext4_error_inode((inode), __func__, __LINE__, 0, (fmt), ## a)
  
  #define EXT4_ERROR_INODE_BLOCK(inode, block, fmt, a...)			\
  	ext4_error_inode((inode), __func__, __LINE__, (block), (fmt), ## a)
  
  #define EXT4_ERROR_FILE(file, block, fmt, a...)				\
  	ext4_error_file((file), __func__, __LINE__, (block), (fmt), ## a)
e7c96e8e4   Joe Perches   ext4: reduce obje...
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
  #ifdef CONFIG_PRINTK
  
  #define ext4_error_inode(inode, func, line, block, fmt, ...)		\
  	__ext4_error_inode(inode, func, line, block, fmt, ##__VA_ARGS__)
  #define ext4_error_file(file, func, line, block, fmt, ...)		\
  	__ext4_error_file(file, func, line, block, fmt, ##__VA_ARGS__)
  #define ext4_error(sb, fmt, ...)					\
  	__ext4_error(sb, __func__, __LINE__, fmt, ##__VA_ARGS__)
  #define ext4_abort(sb, fmt, ...)					\
  	__ext4_abort(sb, __func__, __LINE__, fmt, ##__VA_ARGS__)
  #define ext4_warning(sb, fmt, ...)					\
  	__ext4_warning(sb, __func__, __LINE__, fmt, ##__VA_ARGS__)
b03a2f7eb   Andreas Dilger   ext4: improve war...
2555
2556
  #define ext4_warning_inode(inode, fmt, ...)				\
  	__ext4_warning_inode(inode, __func__, __LINE__, fmt, ##__VA_ARGS__)
e7c96e8e4   Joe Perches   ext4: reduce obje...
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
  #define ext4_msg(sb, level, fmt, ...)				\
  	__ext4_msg(sb, level, fmt, ##__VA_ARGS__)
  #define dump_mmp_msg(sb, mmp, msg)					\
  	__dump_mmp_msg(sb, mmp, __func__, __LINE__, msg)
  #define ext4_grp_locked_error(sb, grp, ino, block, fmt, ...)		\
  	__ext4_grp_locked_error(__func__, __LINE__, sb, grp, ino, block, \
  				fmt, ##__VA_ARGS__)
  
  #else
  
  #define ext4_error_inode(inode, func, line, block, fmt, ...)		\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_error_inode(inode, "", 0, block, " ");			\
  } while (0)
  #define ext4_error_file(file, func, line, block, fmt, ...)		\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_error_file(file, "", 0, block, " ");			\
  } while (0)
  #define ext4_error(sb, fmt, ...)					\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_error(sb, "", 0, " ");					\
  } while (0)
  #define ext4_abort(sb, fmt, ...)					\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_abort(sb, "", 0, " ");					\
  } while (0)
  #define ext4_warning(sb, fmt, ...)					\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_warning(sb, "", 0, " ");					\
  } while (0)
b03a2f7eb   Andreas Dilger   ext4: improve war...
2592
2593
2594
2595
2596
  #define ext4_warning_inode(inode, fmt, ...)				\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_warning_inode(inode, "", 0, " ");			\
  } while (0)
e7c96e8e4   Joe Perches   ext4: reduce obje...
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
  #define ext4_msg(sb, level, fmt, ...)					\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);					\
  	__ext4_msg(sb, "", " ");					\
  } while (0)
  #define dump_mmp_msg(sb, mmp, msg)					\
  	__dump_mmp_msg(sb, mmp, "", 0, "")
  #define ext4_grp_locked_error(sb, grp, ino, block, fmt, ...)		\
  do {									\
  	no_printk(fmt, ##__VA_ARGS__);				\
  	__ext4_grp_locked_error("", 0, sb, grp, ino, block, " ");	\
  } while (0)
  
  #endif
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2611
  extern void ext4_update_dynamic_rev(struct super_block *sb);
99e6f829a   Aneesh Kumar K.V   ext4: Introduce e...
2612
2613
2614
2615
2616
2617
  extern int ext4_update_compat_feature(handle_t *handle, struct super_block *sb,
  					__u32 compat);
  extern int ext4_update_rocompat_feature(handle_t *handle,
  					struct super_block *sb,	__u32 rocompat);
  extern int ext4_update_incompat_feature(handle_t *handle,
  					struct super_block *sb,	__u32 incompat);
8fadc1432   Alexandre Ratchov   [PATCH] ext4: mov...
2618
2619
2620
2621
2622
2623
  extern ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
  				      struct ext4_group_desc *bg);
  extern ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb,
  				      struct ext4_group_desc *bg);
  extern ext4_fsblk_t ext4_inode_table(struct super_block *sb,
  				     struct ext4_group_desc *bg);
021b65bb1   Theodore Ts'o   ext4: Rename ext4...
2624
2625
  extern __u32 ext4_free_group_clusters(struct super_block *sb,
  				      struct ext4_group_desc *bg);
560671a0d   Aneesh Kumar K.V   ext4: Use high 16...
2626
2627
2628
2629
2630
2631
  extern __u32 ext4_free_inodes_count(struct super_block *sb,
  				 struct ext4_group_desc *bg);
  extern __u32 ext4_used_dirs_count(struct super_block *sb,
  				struct ext4_group_desc *bg);
  extern __u32 ext4_itable_unused_count(struct super_block *sb,
  				   struct ext4_group_desc *bg);
8fadc1432   Alexandre Ratchov   [PATCH] ext4: mov...
2632
2633
2634
2635
2636
2637
  extern void ext4_block_bitmap_set(struct super_block *sb,
  				  struct ext4_group_desc *bg, ext4_fsblk_t blk);
  extern void ext4_inode_bitmap_set(struct super_block *sb,
  				  struct ext4_group_desc *bg, ext4_fsblk_t blk);
  extern void ext4_inode_table_set(struct super_block *sb,
  				 struct ext4_group_desc *bg, ext4_fsblk_t blk);
021b65bb1   Theodore Ts'o   ext4: Rename ext4...
2638
2639
2640
  extern void ext4_free_group_clusters_set(struct super_block *sb,
  					 struct ext4_group_desc *bg,
  					 __u32 count);
560671a0d   Aneesh Kumar K.V   ext4: Use high 16...
2641
2642
2643
2644
2645
2646
  extern void ext4_free_inodes_set(struct super_block *sb,
  				struct ext4_group_desc *bg, __u32 count);
  extern void ext4_used_dirs_set(struct super_block *sb,
  				struct ext4_group_desc *bg, __u32 count);
  extern void ext4_itable_unused_set(struct super_block *sb,
  				   struct ext4_group_desc *bg, __u32 count);
feb0ab32a   Darrick J. Wong   ext4: make block ...
2647
  extern int ext4_group_desc_csum_verify(struct super_block *sb, __u32 group,
bb23c20a8   Theodore Ts'o   ext4: Move fs/ext...
2648
  				       struct ext4_group_desc *gdp);
feb0ab32a   Darrick J. Wong   ext4: make block ...
2649
2650
  extern void ext4_group_desc_csum_set(struct super_block *sb, __u32 group,
  				     struct ext4_group_desc *gdp);
7f5118629   Theodore Ts'o   ext4: trigger the...
2651
2652
  extern int ext4_register_li_request(struct super_block *sb,
  				    ext4_group_t first_not_zeroed);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2653

9aa5d32ba   Dmitry Monakhov   ext4: Replace ope...
2654
2655
  static inline int ext4_has_metadata_csum(struct super_block *sb)
  {
e2b911c53   Darrick J. Wong   ext4: clean up fe...
2656
  	WARN_ON_ONCE(ext4_has_feature_metadata_csum(sb) &&
9aa5d32ba   Dmitry Monakhov   ext4: Replace ope...
2657
  		     !EXT4_SB(sb)->s_chksum_driver);
dec214d00   Tahsin Erdogan   ext4: xattr inode...
2658
2659
  	return ext4_has_feature_metadata_csum(sb) &&
  	       (EXT4_SB(sb)->s_chksum_driver != NULL);
9aa5d32ba   Dmitry Monakhov   ext4: Replace ope...
2660
  }
dec214d00   Tahsin Erdogan   ext4: xattr inode...
2661
2662
2663
2664
2665
  
  static inline int ext4_has_group_desc_csum(struct super_block *sb)
  {
  	return ext4_has_feature_gdt_csum(sb) || ext4_has_metadata_csum(sb);
  }
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2666
2667
2668
  static inline ext4_fsblk_t ext4_blocks_count(struct ext4_super_block *es)
  {
  	return ((ext4_fsblk_t)le32_to_cpu(es->s_blocks_count_hi) << 32) |
6bc9feff1   Aneesh Kumar K.V   ext4: Convert s_b...
2669
  		le32_to_cpu(es->s_blocks_count_lo);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2670
2671
2672
2673
2674
  }
  
  static inline ext4_fsblk_t ext4_r_blocks_count(struct ext4_super_block *es)
  {
  	return ((ext4_fsblk_t)le32_to_cpu(es->s_r_blocks_count_hi) << 32) |
308ba3ece   Aneesh Kumar K.V   ext4: Convert s_r...
2675
  		le32_to_cpu(es->s_r_blocks_count_lo);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2676
2677
2678
2679
2680
  }
  
  static inline ext4_fsblk_t ext4_free_blocks_count(struct ext4_super_block *es)
  {
  	return ((ext4_fsblk_t)le32_to_cpu(es->s_free_blocks_count_hi) << 32) |
308ba3ece   Aneesh Kumar K.V   ext4: Convert s_r...
2681
  		le32_to_cpu(es->s_free_blocks_count_lo);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2682
2683
2684
2685
2686
  }
  
  static inline void ext4_blocks_count_set(struct ext4_super_block *es,
  					 ext4_fsblk_t blk)
  {
6bc9feff1   Aneesh Kumar K.V   ext4: Convert s_b...
2687
  	es->s_blocks_count_lo = cpu_to_le32((u32)blk);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2688
2689
2690
2691
2692
2693
  	es->s_blocks_count_hi = cpu_to_le32(blk >> 32);
  }
  
  static inline void ext4_free_blocks_count_set(struct ext4_super_block *es,
  					      ext4_fsblk_t blk)
  {
308ba3ece   Aneesh Kumar K.V   ext4: Convert s_r...
2694
  	es->s_free_blocks_count_lo = cpu_to_le32((u32)blk);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2695
2696
2697
2698
2699
2700
  	es->s_free_blocks_count_hi = cpu_to_le32(blk >> 32);
  }
  
  static inline void ext4_r_blocks_count_set(struct ext4_super_block *es,
  					   ext4_fsblk_t blk)
  {
308ba3ece   Aneesh Kumar K.V   ext4: Convert s_r...
2701
  	es->s_r_blocks_count_lo = cpu_to_le32((u32)blk);
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2702
2703
  	es->s_r_blocks_count_hi = cpu_to_le32(blk >> 32);
  }
e08ac99fa   Artem Blagodarenko   ext4: add largedi...
2704
2705
  static inline loff_t ext4_isize(struct super_block *sb,
  				struct ext4_inode *raw_inode)
a48380f76   Aneesh Kumar K.V   ext4: Rename i_di...
2706
  {
e08ac99fa   Artem Blagodarenko   ext4: add largedi...
2707
2708
  	if (ext4_has_feature_largedir(sb) ||
  	    S_ISREG(le16_to_cpu(raw_inode->i_mode)))
06a279d63   Theodore Ts'o   ext4: only use i_...
2709
2710
  		return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
  			le32_to_cpu(raw_inode->i_size_lo);
e08ac99fa   Artem Blagodarenko   ext4: add largedi...
2711
2712
  
  	return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
a48380f76   Aneesh Kumar K.V   ext4: Rename i_di...
2713
  }
bd81d8eec   Laurent Vivier   [PATCH] ext4: 64b...
2714

a48380f76   Aneesh Kumar K.V   ext4: Rename i_di...
2715
2716
2717
2718
2719
  static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
  {
  	raw_inode->i_size_lo = cpu_to_le32(i_size);
  	raw_inode->i_size_high = cpu_to_le32(i_size >> 32);
  }
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2720

c9de560de   Alex Tomas   ext4: Add multi b...
2721
2722
  static inline
  struct ext4_group_info *ext4_get_group_info(struct super_block *sb,
af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
2723
  					    ext4_group_t group)
c9de560de   Alex Tomas   ext4: Add multi b...
2724
2725
2726
  {
  	 struct ext4_group_info ***grp_info;
  	 long indexv, indexh;
2f2e09eb1   Theodore Ts'o   ext4: add sanity ...
2727
  	 BUG_ON(group >= EXT4_SB(sb)->s_groups_count);
c9de560de   Alex Tomas   ext4: Add multi b...
2728
2729
2730
2731
2732
  	 grp_info = EXT4_SB(sb)->s_group_info;
  	 indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb));
  	 indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1);
  	 return grp_info[indexv][indexh];
  }
8df9675f8   Theodore Ts'o   ext4: Avoid races...
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
  /*
   * Reading s_groups_count requires using smp_rmb() afterwards.  See
   * the locking protocol documented in the comments of ext4_group_add()
   * in resize.c
   */
  static inline ext4_group_t ext4_get_groups_count(struct super_block *sb)
  {
  	ext4_group_t	ngroups = EXT4_SB(sb)->s_groups_count;
  
  	smp_rmb();
  	return ngroups;
  }
c9de560de   Alex Tomas   ext4: Add multi b...
2745

772cb7c83   Jose R. Santos   ext4: New inode a...
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
  static inline ext4_group_t ext4_flex_group(struct ext4_sb_info *sbi,
  					     ext4_group_t block_group)
  {
  	return block_group >> sbi->s_log_groups_per_flex;
  }
  
  static inline unsigned int ext4_flex_bg_size(struct ext4_sb_info *sbi)
  {
  	return 1 << sbi->s_log_groups_per_flex;
  }
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2756
  #define ext4_std_error(sb, errno)				\
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2757
2758
  do {								\
  	if ((errno))						\
c398eda0e   Theodore Ts'o   ext4: Pass line n...
2759
  		__ext4_std_error((sb), __func__, __LINE__, (errno));	\
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2760
  } while (0)
a30d542a0   Aneesh Kumar K.V   ext4: Make sure a...
2761
  #ifdef CONFIG_SMP
df55c99dc   Theodore Ts'o   ext4: rename ext4...
2762
2763
  /* Each CPU can accumulate percpu_counter_batch clusters in their local
   * counters. So we need to make sure we have free clusters more
179f7ebff   Eric Dumazet   percpu_counter: F...
2764
   * than percpu_counter_batch  * nr_cpu_ids. Also add a window of 4 times.
a30d542a0   Aneesh Kumar K.V   ext4: Make sure a...
2765
   */
df55c99dc   Theodore Ts'o   ext4: rename ext4...
2766
  #define EXT4_FREECLUSTERS_WATERMARK (4 * (percpu_counter_batch * nr_cpu_ids))
a30d542a0   Aneesh Kumar K.V   ext4: Make sure a...
2767
  #else
df55c99dc   Theodore Ts'o   ext4: rename ext4...
2768
  #define EXT4_FREECLUSTERS_WATERMARK 0
a30d542a0   Aneesh Kumar K.V   ext4: Make sure a...
2769
  #endif
90e775b71   Jan Kara   ext4: fix lost tr...
2770
  /* Update i_disksize. Requires i_mutex to avoid races with truncate */
cf17fea65   Aneesh Kumar K.V   ext4: Properly up...
2771
2772
  static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize)
  {
90e775b71   Jan Kara   ext4: fix lost tr...
2773
  	WARN_ON_ONCE(S_ISREG(inode->i_mode) &&
5955102c9   Al Viro   wrappers for ->i_...
2774
  		     !inode_is_locked(inode));
90e775b71   Jan Kara   ext4: fix lost tr...
2775
2776
2777
2778
2779
  	down_write(&EXT4_I(inode)->i_data_sem);
  	if (newsize > EXT4_I(inode)->i_disksize)
  		EXT4_I(inode)->i_disksize = newsize;
  	up_write(&EXT4_I(inode)->i_data_sem);
  }
4631dbf67   Dmitry Monakhov   ext4: move i_size...
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
  /* Update i_size, i_disksize. Requires i_mutex to avoid races with truncate */
  static inline int ext4_update_inode_size(struct inode *inode, loff_t newsize)
  {
  	int changed = 0;
  
  	if (newsize > inode->i_size) {
  		i_size_write(inode, newsize);
  		changed = 1;
  	}
  	if (newsize > EXT4_I(inode)->i_disksize) {
  		ext4_update_i_disksize(inode, newsize);
  		changed |= 2;
  	}
  	return changed;
  }
011278485   Jan Kara   ext4: fix races o...
2795
2796
  int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset,
  				      loff_t len);
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2797
2798
2799
  struct ext4_group_info {
  	unsigned long   bb_state;
  	struct rb_root  bb_free_root;
a36b44988   Eric Sandeen   ext4: use ext4_gr...
2800
2801
2802
  	ext4_grpblk_t	bb_first_free;	/* first free block */
  	ext4_grpblk_t	bb_free;	/* total free blocks */
  	ext4_grpblk_t	bb_fragments;	/* nr of freespace fragments */
8a57d9d61   Curt Wohlgemuth   ext4: check for a...
2803
  	ext4_grpblk_t	bb_largest_free_order;/* order of largest frag in BG */
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2804
2805
2806
2807
2808
  	struct          list_head bb_prealloc_list;
  #ifdef DOUBLE_CHECK
  	void            *bb_bitmap;
  #endif
  	struct rw_semaphore alloc_sem;
a36b44988   Eric Sandeen   ext4: use ext4_gr...
2809
2810
2811
2812
  	ext4_grpblk_t	bb_counters[];	/* Nr of free power-of-two-block
  					 * regions, index is order.
  					 * bb_counters[3] = 5 means
  					 * 5 free 8-block regions. */
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2813
  };
3d56b8d2c   Tao Ma   ext4: Speed up FI...
2814
2815
  #define EXT4_GROUP_INFO_NEED_INIT_BIT		0
  #define EXT4_GROUP_INFO_WAS_TRIMMED_BIT		1
163a203dd   Darrick J. Wong   ext4: mark block ...
2816
  #define EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT	2
87a39389b   Darrick J. Wong   ext4: mark block ...
2817
  #define EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT	3
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2818
2819
2820
  
  #define EXT4_MB_GRP_NEED_INIT(grp)	\
  	(test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state)))
163a203dd   Darrick J. Wong   ext4: mark block ...
2821
2822
  #define EXT4_MB_GRP_BBITMAP_CORRUPT(grp)	\
  	(test_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &((grp)->bb_state)))
87a39389b   Darrick J. Wong   ext4: mark block ...
2823
2824
  #define EXT4_MB_GRP_IBITMAP_CORRUPT(grp)	\
  	(test_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &((grp)->bb_state)))
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2825

3d56b8d2c   Tao Ma   ext4: Speed up FI...
2826
2827
2828
2829
2830
2831
  #define EXT4_MB_GRP_WAS_TRIMMED(grp)	\
  	(test_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state)))
  #define EXT4_MB_GRP_SET_TRIMMED(grp)	\
  	(set_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state)))
  #define EXT4_MB_GRP_CLEAR_TRIMMED(grp)	\
  	(clear_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state)))
50797481a   Theodore Ts'o   ext4: Avoid group...
2832
2833
  #define EXT4_MAX_CONTENTION		8
  #define EXT4_CONTENTION_THRESHOLD	2
955ce5f5b   Aneesh Kumar K.V   ext4: Convert ext...
2834
2835
  static inline spinlock_t *ext4_group_lock_ptr(struct super_block *sb,
  					      ext4_group_t group)
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2836
  {
955ce5f5b   Aneesh Kumar K.V   ext4: Convert ext...
2837
2838
  	return bgl_lock_ptr(EXT4_SB(sb)->s_blockgroup_lock, group);
  }
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2839

50797481a   Theodore Ts'o   ext4: Avoid group...
2840
2841
2842
2843
2844
2845
2846
2847
  /*
   * Returns true if the filesystem is busy enough that attempts to
   * access the block group locks has run into contention.
   */
  static inline int ext4_fs_is_busy(struct ext4_sb_info *sbi)
  {
  	return (atomic_read(&sbi->s_lock_busy) > EXT4_CONTENTION_THRESHOLD);
  }
955ce5f5b   Aneesh Kumar K.V   ext4: Convert ext...
2848
2849
  static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group)
  {
50797481a   Theodore Ts'o   ext4: Avoid group...
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
  	spinlock_t *lock = ext4_group_lock_ptr(sb, group);
  	if (spin_trylock(lock))
  		/*
  		 * We're able to grab the lock right away, so drop the
  		 * lock contention counter.
  		 */
  		atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0);
  	else {
  		/*
  		 * The lock is busy, so bump the contention counter,
  		 * and then wait on the spin lock.
  		 */
  		atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, 1,
  				  EXT4_MAX_CONTENTION);
  		spin_lock(lock);
  	}
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2866
2867
2868
2869
2870
  }
  
  static inline void ext4_unlock_group(struct super_block *sb,
  					ext4_group_t group)
  {
955ce5f5b   Aneesh Kumar K.V   ext4: Convert ext...
2871
  	spin_unlock(ext4_group_lock_ptr(sb, group));
5d1b1b3f4   Aneesh Kumar K.V   ext4: fix BUG whe...
2872
  }
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2873
  /*
1f7d1e774   Theodore Ts'o   ext4: move __ext4...
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
   * Block validity checking
   */
  #define ext4_check_indirect_blockref(inode, bh)				\
  	ext4_check_blockref(__func__, __LINE__, inode,			\
  			    (__le32 *)(bh)->b_data,			\
  			    EXT4_ADDR_PER_BLOCK((inode)->i_sb))
  
  #define ext4_ind_check_inode(inode)					\
  	ext4_check_blockref(__func__, __LINE__, inode,			\
  			    EXT4_I(inode)->i_data,			\
  			    EXT4_NDIR_BLOCKS)
  
  /*
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2887
2888
2889
2890
   * Inodes and files operations
   */
  
  /* dir.c */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2891
  extern const struct file_operations ext4_dir_operations;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2892
2893
  
  /* file.c */
c5ef1c42c   Arjan van de Ven   [PATCH] mark stru...
2894
  extern const struct inode_operations ext4_file_inode_operations;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2895
  extern const struct file_operations ext4_file_operations;
e0d10bfa9   Toshiyuki Okajima   ext4: improve lls...
2896
  extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2897

95eaefbde   Theodore Ts'o   ext4: fix the num...
2898
  /* inline.c */
95eaefbde   Theodore Ts'o   ext4: fix the num...
2899
2900
  extern int ext4_get_max_inline_size(struct inode *inode);
  extern int ext4_find_inline_data_nolock(struct inode *inode);
95eaefbde   Theodore Ts'o   ext4: fix the num...
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
  extern int ext4_init_inline_data(handle_t *handle, struct inode *inode,
  				 unsigned int len);
  extern int ext4_destroy_inline_data(handle_t *handle, struct inode *inode);
  
  extern int ext4_readpage_inline(struct inode *inode, struct page *page);
  extern int ext4_try_to_write_inline_data(struct address_space *mapping,
  					 struct inode *inode,
  					 loff_t pos, unsigned len,
  					 unsigned flags,
  					 struct page **pagep);
  extern int ext4_write_inline_data_end(struct inode *inode,
  				      loff_t pos, unsigned len,
  				      unsigned copied,
  				      struct page *page);
  extern struct buffer_head *
  ext4_journalled_write_inline_data(struct inode *inode,
  				  unsigned len,
  				  struct page *page);
  extern int ext4_da_write_inline_data_begin(struct address_space *mapping,
  					   struct inode *inode,
  					   loff_t pos, unsigned len,
  					   unsigned flags,
  					   struct page **pagep,
  					   void **fsdata);
  extern int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
  					 unsigned len, unsigned copied,
  					 struct page *page);
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2928
2929
  extern int ext4_try_add_inline_entry(handle_t *handle,
  				     struct ext4_filename *fname,
56a04915d   Theodore Ts'o   ext4 crypto: simp...
2930
  				     struct inode *dir, struct inode *inode);
95eaefbde   Theodore Ts'o   ext4: fix the num...
2931
2932
2933
2934
  extern int ext4_try_create_inline_dir(handle_t *handle,
  				      struct inode *parent,
  				      struct inode *inode);
  extern int ext4_read_inline_dir(struct file *filp,
725bebb27   Al Viro   [readdir] convert...
2935
  				struct dir_context *ctx,
95eaefbde   Theodore Ts'o   ext4: fix the num...
2936
  				int *has_inline_data);
8af0f0822   Tao Ma   ext4: fix readdir...
2937
2938
2939
2940
2941
  extern int htree_inlinedir_to_tree(struct file *dir_file,
  				   struct inode *dir, ext4_lblk_t block,
  				   struct dx_hash_info *hinfo,
  				   __u32 start_hash, __u32 start_minor_hash,
  				   int *has_inline_data);
95eaefbde   Theodore Ts'o   ext4: fix the num...
2942
  extern struct buffer_head *ext4_find_inline_entry(struct inode *dir,
5b643f9ce   Theodore Ts'o   ext4 crypto: opti...
2943
  					struct ext4_filename *fname,
95eaefbde   Theodore Ts'o   ext4: fix the num...
2944
2945
2946
2947
2948
2949
2950
  					struct ext4_dir_entry_2 **res_dir,
  					int *has_inline_data);
  extern int ext4_delete_inline_entry(handle_t *handle,
  				    struct inode *dir,
  				    struct ext4_dir_entry_2 *de_del,
  				    struct buffer_head *bh,
  				    int *has_inline_data);
a7550b30a   Jaegeuk Kim   ext4 crypto: migr...
2951
  extern bool empty_inline_dir(struct inode *dir, int *has_inline_data);
95eaefbde   Theodore Ts'o   ext4: fix the num...
2952
2953
2954
2955
2956
  extern struct buffer_head *ext4_get_first_inline_block(struct inode *inode,
  					struct ext4_dir_entry_2 **parent_de,
  					int *retval);
  extern int ext4_inline_data_fiemap(struct inode *inode,
  				   struct fiemap_extent_info *fieinfo,
d952d69e2   Dmitry Monakhov   ext4: ext4_inline...
2957
  				   int *has_inline, __u64 start, __u64 len);
01daf9452   Theodore Ts'o   ext4: propagate e...
2958
  extern int ext4_inline_data_truncate(struct inode *inode, int *has_inline);
95eaefbde   Theodore Ts'o   ext4: fix the num...
2959
2960
  
  extern int ext4_convert_inline_data(struct inode *inode);
83447ccb4   Zheng Liu   ext4: make ext4_h...
2961
2962
2963
2964
2965
  static inline int ext4_has_inline_data(struct inode *inode)
  {
  	return ext4_test_inode_flag(inode, EXT4_INODE_INLINE_DATA) &&
  	       EXT4_I(inode)->i_inline_off;
  }
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
2966
  /* namei.c */
c5ef1c42c   Arjan van de Ven   [PATCH] mark stru...
2967
2968
  extern const struct inode_operations ext4_dir_inode_operations;
  extern const struct inode_operations ext4_special_inode_operations;
596397b77   Theodore Ts'o   ext4: Move fs/ext...
2969
  extern struct dentry *ext4_get_parent(struct dentry *child);
a774f9c20   Tao Ma   ext4: make ext4_i...
2970
2971
2972
2973
  extern struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
  				 struct ext4_dir_entry_2 *de,
  				 int blocksize, int csum_size,
  				 unsigned int parent_ino, int dotdot_real_len);
3c47d5417   Tao Ma   ext4: let add_dir...
2974
2975
2976
2977
2978
  extern void initialize_dirent_tail(struct ext4_dir_entry_tail *t,
  				   unsigned int blocksize);
  extern int ext4_handle_dirty_dirent_node(handle_t *handle,
  					 struct inode *inode,
  					 struct buffer_head *bh);
8af0f0822   Tao Ma   ext4: fix readdir...
2979
  #define S_SHIFT 12
381cebfe7   Dan Carpenter   ext4: silence arr...
2980
  static const unsigned char ext4_type_by_mode[(S_IFMT >> S_SHIFT) + 1] = {
8af0f0822   Tao Ma   ext4: fix readdir...
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
  	[S_IFREG >> S_SHIFT]	= EXT4_FT_REG_FILE,
  	[S_IFDIR >> S_SHIFT]	= EXT4_FT_DIR,
  	[S_IFCHR >> S_SHIFT]	= EXT4_FT_CHRDEV,
  	[S_IFBLK >> S_SHIFT]	= EXT4_FT_BLKDEV,
  	[S_IFIFO >> S_SHIFT]	= EXT4_FT_FIFO,
  	[S_IFSOCK >> S_SHIFT]	= EXT4_FT_SOCK,
  	[S_IFLNK >> S_SHIFT]	= EXT4_FT_SYMLINK,
  };
  
  static inline void ext4_set_de_type(struct super_block *sb,
  				struct ext4_dir_entry_2 *de,
  				umode_t mode) {
e2b911c53   Darrick J. Wong   ext4: clean up fe...
2993
  	if (ext4_has_feature_filetype(sb))
8af0f0822   Tao Ma   ext4: fix readdir...
2994
2995
  		de->file_type = ext4_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
  }
f64e02fe9   Theodore Ts'o   ext4 crypto: add ...
2996
2997
2998
2999
  /* readpages.c */
  extern int ext4_mpage_readpages(struct address_space *mapping,
  				struct list_head *pages, struct page *page,
  				unsigned nr_pages);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
3000
3001
  
  /* symlink.c */
a7a67e8a0   Al Viro   ext4: split inode...
3002
  extern const struct inode_operations ext4_encrypted_symlink_inode_operations;
c5ef1c42c   Arjan van de Ven   [PATCH] mark stru...
3003
3004
  extern const struct inode_operations ext4_symlink_inode_operations;
  extern const struct inode_operations ext4_fast_symlink_inode_operations;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
3005

b57990188   Theodore Ts'o   ext4: move sysfs ...
3006
3007
  /* sysfs.c */
  extern int ext4_register_sysfs(struct super_block *sb);
ebd173beb   Theodore Ts'o   ext4: move procfs...
3008
  extern void ext4_unregister_sysfs(struct super_block *sb);
b57990188   Theodore Ts'o   ext4: move sysfs ...
3009
3010
  extern int __init ext4_init_sysfs(void);
  extern void ext4_exit_sysfs(void);
6fd058f77   Theodore Ts'o   ext4: Add a compr...
3011
3012
3013
  /* block_validity */
  extern void ext4_release_system_zone(struct super_block *sb);
  extern int ext4_setup_system_zone(struct super_block *sb);
5dabfc78d   Theodore Ts'o   ext4: rename {exi...
3014
3015
  extern int __init ext4_init_system_zone(void);
  extern void ext4_exit_system_zone(void);
6fd058f77   Theodore Ts'o   ext4: Add a compr...
3016
3017
3018
  extern int ext4_data_block_valid(struct ext4_sb_info *sbi,
  				 ext4_fsblk_t start_blk,
  				 unsigned int count);
1f7d1e774   Theodore Ts'o   ext4: move __ext4...
3019
3020
  extern int ext4_check_blockref(const char *, unsigned int,
  			       struct inode *, __le32 *, unsigned int);
6fd058f77   Theodore Ts'o   ext4: Add a compr...
3021

a86c61812   Alex Tomas   [PATCH] ext3: add...
3022
  /* extents.c */
4a092d737   Theodore Ts'o   ext4: rationalize...
3023
3024
  struct ext4_ext_path;
  struct ext4_extent;
d7b2a00c2   Zheng Liu   ext4: isolate ext...
3025
3026
3027
3028
3029
  /*
   * Maximum number of logical blocks in a file; ext4_extent's ee_block is
   * __le32.
   */
  #define EXT_MAX_BLOCKS	0xffffffff
a86c61812   Alex Tomas   [PATCH] ext3: add...
3030
3031
  extern int ext4_ext_tree_init(handle_t *handle, struct inode *);
  extern int ext4_ext_writepage_trans_blocks(struct inode *, int);
fffb27399   Jan Kara   ext4: better esti...
3032
  extern int ext4_ext_index_trans_blocks(struct inode *inode, int extents);
e35fd6609   Theodore Ts'o   ext4: Add new abs...
3033
3034
  extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
  			       struct ext4_map_blocks *map, int flags);
d0abb36db   Theodore Ts'o   ext4: allow ext4_...
3035
  extern int ext4_ext_truncate(handle_t *, struct inode *);
26a4c0c6c   Theodore Ts'o   ext4: refactor pu...
3036
3037
  extern int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
  				 ext4_lblk_t end);
a86c61812   Alex Tomas   [PATCH] ext3: add...
3038
3039
  extern void ext4_ext_init(struct super_block *);
  extern void ext4_ext_release(struct super_block *);
2fe17c107   Christoph Hellwig   fallocate should ...
3040
  extern long ext4_fallocate(struct file *file, int mode, loff_t offset,
a2df2a634   Amit Arora   fallocate support...
3041
  			  loff_t len);
6b523df4f   Jan Kara   ext4: use transac...
3042
3043
  extern int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode,
  					  loff_t offset, ssize_t len);
e35fd6609   Theodore Ts'o   ext4: Add new abs...
3044
3045
  extern int ext4_map_blocks(handle_t *handle, struct inode *inode,
  			   struct ext4_map_blocks *map, int flags);
4a092d737   Theodore Ts'o   ext4: rationalize...
3046
3047
  extern int ext4_ext_calc_metadata_amount(struct inode *inode,
  					 ext4_lblk_t lblocks);
4a092d737   Theodore Ts'o   ext4: rationalize...
3048
3049
3050
3051
3052
3053
3054
  extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode,
  						   int num,
  						   struct ext4_ext_path *path);
  extern int ext4_can_extents_be_merged(struct inode *inode,
  				      struct ext4_extent *ex1,
  				      struct ext4_extent *ex2);
  extern int ext4_ext_insert_extent(handle_t *, struct inode *,
dfe508093   Theodore Ts'o   ext4: drop EXT4_E...
3055
  				  struct ext4_ext_path **,
4a092d737   Theodore Ts'o   ext4: rationalize...
3056
  				  struct ext4_extent *, int);
ed8a1a766   Theodore Ts'o   ext4: rename ext4...
3057
3058
3059
  extern struct ext4_ext_path *ext4_find_extent(struct inode *, ext4_lblk_t,
  					      struct ext4_ext_path **,
  					      int flags);
4a092d737   Theodore Ts'o   ext4: rationalize...
3060
3061
  extern void ext4_ext_drop_refs(struct ext4_ext_path *);
  extern int ext4_ext_check_inode(struct inode *inode);
f7fec032a   Zheng Liu   ext4: track all e...
3062
3063
3064
  extern int ext4_find_delalloc_range(struct inode *inode,
  				    ext4_lblk_t lblk_start,
  				    ext4_lblk_t lblk_end);
4a092d737   Theodore Ts'o   ext4: rationalize...
3065
  extern int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk);
fcf6b1b72   Dmitry Monakhov   ext4: refactor ex...
3066
  extern ext4_lblk_t ext4_ext_next_allocated_block(struct ext4_ext_path *path);
3a06d778d   Aneesh Kumar K.V   ext4: sparse fixes
3067
3068
  extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
  			__u64 start, __u64 len);
7869a4a6c   Theodore Ts'o   ext4: add support...
3069
  extern int ext4_ext_precache(struct inode *inode);
9eb79482a   Namjae Jeon   ext4: Add support...
3070
  extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len);
331573feb   Namjae Jeon   ext4: Add support...
3071
  extern int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len);
fcf6b1b72   Dmitry Monakhov   ext4: refactor ex...
3072
3073
3074
3075
  extern int ext4_swap_extents(handle_t *handle, struct inode *inode1,
  				struct inode *inode2, ext4_lblk_t lblk1,
  			     ext4_lblk_t lblk2,  ext4_lblk_t count,
  			     int mark_unwritten,int *err);
4a092d737   Theodore Ts'o   ext4: rationalize...
3076

748de6736   Akira Fujita   ext4: online defr...
3077
  /* move_extent.c */
393d1d1d7   Dr. Tilmann Bubeck   ext4: implementat...
3078
3079
3080
3081
  extern void ext4_double_down_write_data_sem(struct inode *first,
  					    struct inode *second);
  extern void ext4_double_up_write_data_sem(struct inode *orig_inode,
  					  struct inode *donor_inode);
748de6736   Akira Fujita   ext4: online defr...
3082
3083
3084
  extern int ext4_move_extents(struct file *o_filp, struct file *d_filp,
  			     __u64 start_orig, __u64 start_donor,
  			     __u64 len, __u64 *moved_len);
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
3085
  /* page-io.c */
5dabfc78d   Theodore Ts'o   ext4: rename {exi...
3086
3087
  extern int __init ext4_init_pageio(void);
  extern void ext4_exit_pageio(void);
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
3088
  extern ext4_io_end_t *ext4_init_io_end(struct inode *inode, gfp_t flags);
97a851ed7   Jan Kara   ext4: use io_end ...
3089
3090
3091
3092
3093
  extern ext4_io_end_t *ext4_get_io_end(ext4_io_end_t *io_end);
  extern int ext4_put_io_end(ext4_io_end_t *io_end);
  extern void ext4_put_io_end_defer(ext4_io_end_t *io_end);
  extern void ext4_io_submit_init(struct ext4_io_submit *io,
  				struct writeback_control *wbc);
2e8fa54e3   Jan Kara   ext4: split exten...
3094
  extern void ext4_end_io_rsv_work(struct work_struct *work);
bd2d0210c   Theodore Ts'o   ext4: use bio lay...
3095
3096
3097
3098
  extern void ext4_io_submit(struct ext4_io_submit *io);
  extern int ext4_bio_write_page(struct ext4_io_submit *io,
  			       struct page *page,
  			       int len,
1c8349a17   Namjae Jeon   ext4: fix data in...
3099
3100
  			       struct writeback_control *wbc,
  			       bool keep_towrite);
3a06d778d   Aneesh Kumar K.V   ext4: sparse fixes
3101

c5e06d101   Johann Lombardi   ext4: add support...
3102
3103
  /* mmp.c */
  extern int ext4_multi_mount_protect(struct super_block *, ext4_fsblk_t);
3613d2280   Jan Kara   ext4: remove buff...
3104
  /*
48fc7f7e7   Adam Buchbinder   Fix misspellings ...
3105
   * Add new method to test whether block and inode bitmaps are properly
2ccb5fb9f   Aneesh Kumar K.V   ext4: Use new buf...
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
   * initialized. With uninit_bg reading the block from disk is not enough
   * to mark the bitmap uptodate. We need to also zero-out the bitmap
   */
  #define BH_BITMAP_UPTODATE BH_JBDPrivateStart
  
  static inline int bitmap_uptodate(struct buffer_head *bh)
  {
  	return (buffer_uptodate(bh) &&
  			test_bit(BH_BITMAP_UPTODATE, &(bh)->b_state));
  }
  static inline void set_bitmap_uptodate(struct buffer_head *bh)
  {
  	set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
  }
17335dcc4   Dmitry Monakhov   ext4: serialize d...
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
  /*
   * Disable DIO read nolock optimization, so new dioreaders will be forced
   * to grab i_mutex
   */
  static inline void ext4_inode_block_unlocked_dio(struct inode *inode)
  {
  	ext4_set_inode_state(inode, EXT4_STATE_DIOREAD_LOCK);
  	smp_mb();
  }
  static inline void ext4_inode_resume_unlocked_dio(struct inode *inode)
  {
  	smp_mb();
  	ext4_clear_inode_state(inode, EXT4_STATE_DIOREAD_LOCK);
  }
731eb1a03   Akinobu Mita   ext4: consolidate...
3134
  #define in_range(b, first, len)	((b) >= (first) && (b) <= (first) + (len) - 1)
e9e3bcecf   Eric Sandeen   ext4: serialize u...
3135
3136
3137
3138
  /* For ioend & aio unwritten conversion wait queues */
  #define EXT4_WQ_HASH_SZ		37
  #define ext4_ioend_wq(v)   (&ext4__ioend_wq[((unsigned long)(v)) %\
  					    EXT4_WQ_HASH_SZ])
e9e3bcecf   Eric Sandeen   ext4: serialize u...
3139
  extern wait_queue_head_t ext4__ioend_wq[EXT4_WQ_HASH_SZ];
e9e3bcecf   Eric Sandeen   ext4: serialize u...
3140

8f82f840e   Yongqiang Yang   ext4: prevent par...
3141
3142
  extern int ext4_resize_begin(struct super_block *sb);
  extern void ext4_resize_end(struct super_block *sb);
74c66bcb7   Jan Kara   ext4: Fix data ex...
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
  static inline void ext4_set_io_unwritten_flag(struct inode *inode,
  					      struct ext4_io_end *io_end)
  {
  	if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) {
  		io_end->flag |= EXT4_IO_END_UNWRITTEN;
  		atomic_inc(&EXT4_I(inode)->i_unwritten);
  	}
  }
  
  static inline void ext4_clear_io_unwritten_flag(ext4_io_end_t *io_end)
  {
  	struct inode *inode = io_end->inode;
  
  	if (io_end->flag & EXT4_IO_END_UNWRITTEN) {
  		io_end->flag &= ~EXT4_IO_END_UNWRITTEN;
  		/* Wake up anyone waiting on unwritten extent conversion */
  		if (atomic_dec_and_test(&EXT4_I(inode)->i_unwritten))
  			wake_up_all(ext4_ioend_wq(inode));
  	}
  }
8ff6daa17   Christoph Hellwig   iomap: constify s...
3163
  extern const struct iomap_ops ext4_iomap_ops;
364443cbc   Jan Kara   ext4: convert DAX...
3164

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
3165
  #endif	/* __KERNEL__ */
6a797d273   Darrick J. Wong   ext4: call out CR...
3166
3167
  #define EFSBADCRC	EBADMSG		/* Bad CRC detected */
  #define EFSCORRUPTED	EUCLEAN		/* Filesystem is corrupted */
3dcf54515   Christoph Hellwig   ext4: move header...
3168
  #endif	/* _EXT4_H */