1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _EXT4_H
18#define _EXT4_H
19
20#include <linux/types.h>
21#include <linux/blkdev.h>
22#include <linux/magic.h>
23#include <linux/jbd2.h>
24#include <linux/quota.h>
25#include <linux/rwsem.h>
26#include <linux/rbtree.h>
27#include <linux/seqlock.h>
28#include <linux/mutex.h>
29#include <linux/timer.h>
30#include <linux/wait.h>
31#include <linux/sched/signal.h>
32#include <linux/blockgroup_lock.h>
33#include <linux/percpu_counter.h>
34#include <linux/ratelimit.h>
35#include <crypto/hash.h>
36#include <linux/falloc.h>
37#include <linux/percpu-rwsem.h>
38#include <linux/fiemap.h>
39#ifdef __KERNEL__
40#include <linux/compat.h>
41#endif
42
43#include <linux/fscrypt.h>
44#include <linux/fsverity.h>
45
46#include <linux/compiler.h>
47
48
49
50
51
52
53
54
55
56#define AGGRESSIVE_CHECK__
57
58
59
60
61
62#define DOUBLE_CHECK__
63
64
65
66
67#undef EXT4FS_DEBUG
68
69
70
71
72#ifdef EXT4FS_DEBUG
73#define ext4_debug(f, a...) \
74 do { \
75 printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:", \
76 __FILE__, __LINE__, __func__); \
77 printk(KERN_DEBUG f, ## a); \
78 } while (0)
79#else
80#define ext4_debug(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
81#endif
82
83
84
85
86#define EXT_DEBUG__
87
88
89
90
91#ifdef CONFIG_EXT4_DEBUG
92#define ext_debug(ino, fmt, ...) \
93 pr_debug("[%s/%d] EXT4-fs (%s): ino %lu: (%s, %d): %s:" fmt, \
94 current->comm, task_pid_nr(current), \
95 ino->i_sb->s_id, ino->i_ino, __FILE__, __LINE__, \
96 __func__, ##__VA_ARGS__)
97#else
98#define ext_debug(ino, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
99#endif
100
101
102typedef int ext4_grpblk_t;
103
104
105typedef unsigned long long ext4_fsblk_t;
106
107
108typedef __u32 ext4_lblk_t;
109
110
111typedef unsigned int ext4_group_t;
112
113enum SHIFT_DIRECTION {
114 SHIFT_LEFT = 0,
115 SHIFT_RIGHT,
116};
117
118
119
120
121
122
123
124
125
126#define EXT4_MB_HINT_MERGE 0x0001
127
128#define EXT4_MB_HINT_RESERVED 0x0002
129
130#define EXT4_MB_HINT_METADATA 0x0004
131
132#define EXT4_MB_HINT_FIRST 0x0008
133
134#define EXT4_MB_HINT_BEST 0x0010
135
136#define EXT4_MB_HINT_DATA 0x0020
137
138#define EXT4_MB_HINT_NOPREALLOC 0x0040
139
140#define EXT4_MB_HINT_GROUP_ALLOC 0x0080
141
142#define EXT4_MB_HINT_GOAL_ONLY 0x0100
143
144#define EXT4_MB_HINT_TRY_GOAL 0x0200
145
146#define EXT4_MB_DELALLOC_RESERVED 0x0400
147
148#define EXT4_MB_STREAM_ALLOC 0x0800
149
150#define EXT4_MB_USE_ROOT_BLOCKS 0x1000
151
152#define EXT4_MB_USE_RESERVED 0x2000
153
154#define EXT4_MB_STRICT_CHECK 0x4000
155
156struct ext4_allocation_request {
157
158 struct inode *inode;
159
160 unsigned int len;
161
162 ext4_lblk_t logical;
163
164 ext4_lblk_t lleft;
165
166 ext4_lblk_t lright;
167
168 ext4_fsblk_t goal;
169
170 ext4_fsblk_t pleft;
171
172 ext4_fsblk_t pright;
173
174 unsigned int flags;
175};
176
177
178
179
180
181
182
183
184#define EXT4_MAP_NEW BIT(BH_New)
185#define EXT4_MAP_MAPPED BIT(BH_Mapped)
186#define EXT4_MAP_UNWRITTEN BIT(BH_Unwritten)
187#define EXT4_MAP_BOUNDARY BIT(BH_Boundary)
188#define EXT4_MAP_FLAGS (EXT4_MAP_NEW | EXT4_MAP_MAPPED |\
189 EXT4_MAP_UNWRITTEN | EXT4_MAP_BOUNDARY)
190
191struct ext4_map_blocks {
192 ext4_fsblk_t m_pblk;
193 ext4_lblk_t m_lblk;
194 unsigned int m_len;
195 unsigned int m_flags;
196};
197
198
199
200
201struct ext4_system_blocks {
202 struct rb_root root;
203 struct rcu_head rcu;
204};
205
206
207
208
209#define EXT4_IO_END_UNWRITTEN 0x0001
210
211struct ext4_io_end_vec {
212 struct list_head list;
213 loff_t offset;
214 ssize_t size;
215};
216
217
218
219
220
221typedef struct ext4_io_end {
222 struct list_head list;
223 handle_t *handle;
224
225 struct inode *inode;
226 struct bio *bio;
227
228 unsigned int flag;
229 atomic_t count;
230 struct list_head list_vec;
231} ext4_io_end_t;
232
233struct ext4_io_submit {
234 struct writeback_control *io_wbc;
235 struct bio *io_bio;
236 ext4_io_end_t *io_end;
237 sector_t io_next_block;
238};
239
240
241
242
243#define EXT4_BAD_INO 1
244#define EXT4_ROOT_INO 2
245#define EXT4_USR_QUOTA_INO 3
246#define EXT4_GRP_QUOTA_INO 4
247#define EXT4_BOOT_LOADER_INO 5
248#define EXT4_UNDEL_DIR_INO 6
249#define EXT4_RESIZE_INO 7
250#define EXT4_JOURNAL_INO 8
251
252
253#define EXT4_GOOD_OLD_FIRST_INO 11
254
255
256
257
258#define EXT4_LINK_MAX 65000
259
260
261
262
263#define EXT4_MIN_BLOCK_SIZE 1024
264#define EXT4_MAX_BLOCK_SIZE 65536
265#define EXT4_MIN_BLOCK_LOG_SIZE 10
266#define EXT4_MAX_BLOCK_LOG_SIZE 16
267#define EXT4_MAX_CLUSTER_LOG_SIZE 30
268#ifdef __KERNEL__
269# define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize)
270#else
271# define EXT4_BLOCK_SIZE(s) (EXT4_MIN_BLOCK_SIZE << (s)->s_log_block_size)
272#endif
273#define EXT4_ADDR_PER_BLOCK(s) (EXT4_BLOCK_SIZE(s) / sizeof(__u32))
274#define EXT4_CLUSTER_SIZE(s) (EXT4_BLOCK_SIZE(s) << \
275 EXT4_SB(s)->s_cluster_bits)
276#ifdef __KERNEL__
277# define EXT4_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
278# define EXT4_CLUSTER_BITS(s) (EXT4_SB(s)->s_cluster_bits)
279#else
280# define EXT4_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
281#endif
282#ifdef __KERNEL__
283#define EXT4_ADDR_PER_BLOCK_BITS(s) (EXT4_SB(s)->s_addr_per_block_bits)
284#define EXT4_INODE_SIZE(s) (EXT4_SB(s)->s_inode_size)
285#define EXT4_FIRST_INO(s) (EXT4_SB(s)->s_first_ino)
286#else
287#define EXT4_INODE_SIZE(s) (((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \
288 EXT4_GOOD_OLD_INODE_SIZE : \
289 (s)->s_inode_size)
290#define EXT4_FIRST_INO(s) (((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \
291 EXT4_GOOD_OLD_FIRST_INO : \
292 (s)->s_first_ino)
293#endif
294#define EXT4_BLOCK_ALIGN(size, blkbits) ALIGN((size), (1 << (blkbits)))
295#define EXT4_MAX_BLOCKS(size, offset, blkbits) \
296 ((EXT4_BLOCK_ALIGN(size + offset, blkbits) >> blkbits) - (offset >> \
297 blkbits))
298
299
300#define EXT4_B2C(sbi, blk) ((blk) >> (sbi)->s_cluster_bits)
301
302#define EXT4_C2B(sbi, cluster) ((cluster) << (sbi)->s_cluster_bits)
303
304#define EXT4_NUM_B2C(sbi, blks) (((blks) + (sbi)->s_cluster_ratio - 1) >> \
305 (sbi)->s_cluster_bits)
306
307#define EXT4_PBLK_CMASK(s, pblk) ((pblk) & \
308 ~((ext4_fsblk_t) (s)->s_cluster_ratio - 1))
309#define EXT4_LBLK_CMASK(s, lblk) ((lblk) & \
310 ~((ext4_lblk_t) (s)->s_cluster_ratio - 1))
311
312#define EXT4_LBLK_CFILL(sbi, lblk) ((lblk) | \
313 ((ext4_lblk_t) (sbi)->s_cluster_ratio - 1))
314
315#define EXT4_PBLK_COFF(s, pblk) ((pblk) & \
316 ((ext4_fsblk_t) (s)->s_cluster_ratio - 1))
317#define EXT4_LBLK_COFF(s, lblk) ((lblk) & \
318 ((ext4_lblk_t) (s)->s_cluster_ratio - 1))
319
320
321
322
323struct ext4_group_desc
324{
325 __le32 bg_block_bitmap_lo;
326 __le32 bg_inode_bitmap_lo;
327 __le32 bg_inode_table_lo;
328 __le16 bg_free_blocks_count_lo;
329 __le16 bg_free_inodes_count_lo;
330 __le16 bg_used_dirs_count_lo;
331 __le16 bg_flags;
332 __le32 bg_exclude_bitmap_lo;
333 __le16 bg_block_bitmap_csum_lo;
334 __le16 bg_inode_bitmap_csum_lo;
335 __le16 bg_itable_unused_lo;
336 __le16 bg_checksum;
337 __le32 bg_block_bitmap_hi;
338 __le32 bg_inode_bitmap_hi;
339 __le32 bg_inode_table_hi;
340 __le16 bg_free_blocks_count_hi;
341 __le16 bg_free_inodes_count_hi;
342 __le16 bg_used_dirs_count_hi;
343 __le16 bg_itable_unused_hi;
344 __le32 bg_exclude_bitmap_hi;
345 __le16 bg_block_bitmap_csum_hi;
346 __le16 bg_inode_bitmap_csum_hi;
347 __u32 bg_reserved;
348};
349
350#define EXT4_BG_INODE_BITMAP_CSUM_HI_END \
351 (offsetof(struct ext4_group_desc, bg_inode_bitmap_csum_hi) + \
352 sizeof(__le16))
353#define EXT4_BG_BLOCK_BITMAP_CSUM_HI_END \
354 (offsetof(struct ext4_group_desc, bg_block_bitmap_csum_hi) + \
355 sizeof(__le16))
356
357
358
359
360
361struct flex_groups {
362 atomic64_t free_clusters;
363 atomic_t free_inodes;
364 atomic_t used_dirs;
365};
366
367#define EXT4_BG_INODE_UNINIT 0x0001
368#define EXT4_BG_BLOCK_UNINIT 0x0002
369#define EXT4_BG_INODE_ZEROED 0x0004
370
371
372
373
374#define EXT4_MIN_DESC_SIZE 32
375#define EXT4_MIN_DESC_SIZE_64BIT 64
376#define EXT4_MAX_DESC_SIZE EXT4_MIN_BLOCK_SIZE
377#define EXT4_DESC_SIZE(s) (EXT4_SB(s)->s_desc_size)
378#ifdef __KERNEL__
379# define EXT4_BLOCKS_PER_GROUP(s) (EXT4_SB(s)->s_blocks_per_group)
380# define EXT4_CLUSTERS_PER_GROUP(s) (EXT4_SB(s)->s_clusters_per_group)
381# define EXT4_DESC_PER_BLOCK(s) (EXT4_SB(s)->s_desc_per_block)
382# define EXT4_INODES_PER_GROUP(s) (EXT4_SB(s)->s_inodes_per_group)
383# define EXT4_DESC_PER_BLOCK_BITS(s) (EXT4_SB(s)->s_desc_per_block_bits)
384#else
385# define EXT4_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
386# define EXT4_DESC_PER_BLOCK(s) (EXT4_BLOCK_SIZE(s) / EXT4_DESC_SIZE(s))
387# define EXT4_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
388#endif
389
390
391
392
393#define EXT4_NDIR_BLOCKS 12
394#define EXT4_IND_BLOCK EXT4_NDIR_BLOCKS
395#define EXT4_DIND_BLOCK (EXT4_IND_BLOCK + 1)
396#define EXT4_TIND_BLOCK (EXT4_DIND_BLOCK + 1)
397#define EXT4_N_BLOCKS (EXT4_TIND_BLOCK + 1)
398
399
400
401
402#define EXT4_SECRM_FL 0x00000001
403#define EXT4_UNRM_FL 0x00000002
404#define EXT4_COMPR_FL 0x00000004
405#define EXT4_SYNC_FL 0x00000008
406#define EXT4_IMMUTABLE_FL 0x00000010
407#define EXT4_APPEND_FL 0x00000020
408#define EXT4_NODUMP_FL 0x00000040
409#define EXT4_NOATIME_FL 0x00000080
410
411#define EXT4_DIRTY_FL 0x00000100
412#define EXT4_COMPRBLK_FL 0x00000200
413#define EXT4_NOCOMPR_FL 0x00000400
414
415#define EXT4_ENCRYPT_FL 0x00000800
416
417#define EXT4_INDEX_FL 0x00001000
418#define EXT4_IMAGIC_FL 0x00002000
419#define EXT4_JOURNAL_DATA_FL 0x00004000
420#define EXT4_NOTAIL_FL 0x00008000
421#define EXT4_DIRSYNC_FL 0x00010000
422#define EXT4_TOPDIR_FL 0x00020000
423#define EXT4_HUGE_FILE_FL 0x00040000
424#define EXT4_EXTENTS_FL 0x00080000
425#define EXT4_VERITY_FL 0x00100000
426#define EXT4_EA_INODE_FL 0x00200000
427
428
429#define EXT4_DAX_FL 0x02000000
430
431#define EXT4_INLINE_DATA_FL 0x10000000
432#define EXT4_PROJINHERIT_FL 0x20000000
433#define EXT4_CASEFOLD_FL 0x40000000
434#define EXT4_RESERVED_FL 0x80000000
435
436
437#define EXT4_FL_USER_MODIFIABLE (EXT4_SECRM_FL | \
438 EXT4_UNRM_FL | \
439 EXT4_COMPR_FL | \
440 EXT4_SYNC_FL | \
441 EXT4_IMMUTABLE_FL | \
442 EXT4_APPEND_FL | \
443 EXT4_NODUMP_FL | \
444 EXT4_NOATIME_FL | \
445 EXT4_JOURNAL_DATA_FL | \
446 EXT4_NOTAIL_FL | \
447 EXT4_DIRSYNC_FL | \
448 EXT4_TOPDIR_FL | \
449 EXT4_EXTENTS_FL | \
450 0x00400000 | \
451 EXT4_DAX_FL | \
452 EXT4_PROJINHERIT_FL | \
453 EXT4_CASEFOLD_FL)
454
455
456#define EXT4_FL_USER_VISIBLE (EXT4_FL_USER_MODIFIABLE | \
457 EXT4_DIRTY_FL | \
458 EXT4_COMPRBLK_FL | \
459 EXT4_NOCOMPR_FL | \
460 EXT4_ENCRYPT_FL | \
461 EXT4_INDEX_FL | \
462 EXT4_VERITY_FL | \
463 EXT4_INLINE_DATA_FL)
464
465
466#define EXT4_FL_XFLAG_VISIBLE (EXT4_SYNC_FL | \
467 EXT4_IMMUTABLE_FL | \
468 EXT4_APPEND_FL | \
469 EXT4_NODUMP_FL | \
470 EXT4_NOATIME_FL | \
471 EXT4_PROJINHERIT_FL | \
472 EXT4_DAX_FL)
473
474
475#define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
476 EXT4_SYNC_FL | EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
477 EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\
478 EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL |\
479 EXT4_PROJINHERIT_FL | EXT4_CASEFOLD_FL |\
480 EXT4_DAX_FL)
481
482
483#define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL | EXT4_CASEFOLD_FL |\
484 EXT4_PROJINHERIT_FL))
485
486
487#define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)
488
489
490#define EXT4_FL_SHOULD_SWAP (EXT4_HUGE_FILE_FL | EXT4_EXTENTS_FL)
491
492
493#define EXT4_DAX_MUT_EXCL (EXT4_VERITY_FL | EXT4_ENCRYPT_FL |\
494 EXT4_JOURNAL_DATA_FL | EXT4_INLINE_DATA_FL)
495
496
497static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)
498{
499 if (S_ISDIR(mode))
500 return flags;
501 else if (S_ISREG(mode))
502 return flags & EXT4_REG_FLMASK;
503 else
504 return flags & EXT4_OTHER_FLMASK;
505}
506
507
508
509
510enum {
511 EXT4_INODE_SECRM = 0,
512 EXT4_INODE_UNRM = 1,
513 EXT4_INODE_COMPR = 2,
514 EXT4_INODE_SYNC = 3,
515 EXT4_INODE_IMMUTABLE = 4,
516 EXT4_INODE_APPEND = 5,
517 EXT4_INODE_NODUMP = 6,
518 EXT4_INODE_NOATIME = 7,
519
520 EXT4_INODE_DIRTY = 8,
521 EXT4_INODE_COMPRBLK = 9,
522 EXT4_INODE_NOCOMPR = 10,
523 EXT4_INODE_ENCRYPT = 11,
524
525 EXT4_INODE_INDEX = 12,
526 EXT4_INODE_IMAGIC = 13,
527 EXT4_INODE_JOURNAL_DATA = 14,
528 EXT4_INODE_NOTAIL = 15,
529 EXT4_INODE_DIRSYNC = 16,
530 EXT4_INODE_TOPDIR = 17,
531 EXT4_INODE_HUGE_FILE = 18,
532 EXT4_INODE_EXTENTS = 19,
533 EXT4_INODE_VERITY = 20,
534 EXT4_INODE_EA_INODE = 21,
535
536 EXT4_INODE_DAX = 25,
537 EXT4_INODE_INLINE_DATA = 28,
538 EXT4_INODE_PROJINHERIT = 29,
539 EXT4_INODE_CASEFOLD = 30,
540 EXT4_INODE_RESERVED = 31,
541};
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556#define TEST_FLAG_VALUE(FLAG) (EXT4_##FLAG##_FL == (1 << EXT4_INODE_##FLAG))
557#define CHECK_FLAG_VALUE(FLAG) BUILD_BUG_ON(!TEST_FLAG_VALUE(FLAG))
558
559static inline void ext4_check_flag_values(void)
560{
561 CHECK_FLAG_VALUE(SECRM);
562 CHECK_FLAG_VALUE(UNRM);
563 CHECK_FLAG_VALUE(COMPR);
564 CHECK_FLAG_VALUE(SYNC);
565 CHECK_FLAG_VALUE(IMMUTABLE);
566 CHECK_FLAG_VALUE(APPEND);
567 CHECK_FLAG_VALUE(NODUMP);
568 CHECK_FLAG_VALUE(NOATIME);
569 CHECK_FLAG_VALUE(DIRTY);
570 CHECK_FLAG_VALUE(COMPRBLK);
571 CHECK_FLAG_VALUE(NOCOMPR);
572 CHECK_FLAG_VALUE(ENCRYPT);
573 CHECK_FLAG_VALUE(INDEX);
574 CHECK_FLAG_VALUE(IMAGIC);
575 CHECK_FLAG_VALUE(JOURNAL_DATA);
576 CHECK_FLAG_VALUE(NOTAIL);
577 CHECK_FLAG_VALUE(DIRSYNC);
578 CHECK_FLAG_VALUE(TOPDIR);
579 CHECK_FLAG_VALUE(HUGE_FILE);
580 CHECK_FLAG_VALUE(EXTENTS);
581 CHECK_FLAG_VALUE(VERITY);
582 CHECK_FLAG_VALUE(EA_INODE);
583 CHECK_FLAG_VALUE(INLINE_DATA);
584 CHECK_FLAG_VALUE(PROJINHERIT);
585 CHECK_FLAG_VALUE(CASEFOLD);
586 CHECK_FLAG_VALUE(RESERVED);
587}
588
589
590struct ext4_new_group_input {
591 __u32 group;
592 __u64 block_bitmap;
593 __u64 inode_bitmap;
594 __u64 inode_table;
595 __u32 blocks_count;
596 __u16 reserved_blocks;
597 __u16 unused;
598};
599
600#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
601struct compat_ext4_new_group_input {
602 u32 group;
603 compat_u64 block_bitmap;
604 compat_u64 inode_bitmap;
605 compat_u64 inode_table;
606 u32 blocks_count;
607 u16 reserved_blocks;
608 u16 unused;
609};
610#endif
611
612
613struct ext4_new_group_data {
614 __u32 group;
615 __u64 block_bitmap;
616 __u64 inode_bitmap;
617 __u64 inode_table;
618 __u32 blocks_count;
619 __u16 reserved_blocks;
620 __u16 mdata_blocks;
621 __u32 free_clusters_count;
622};
623
624
625enum {
626 BLOCK_BITMAP = 0,
627 INODE_BITMAP,
628 INODE_TABLE,
629 GROUP_TABLE_COUNT,
630};
631
632
633
634
635
636
637#define EXT4_GET_BLOCKS_CREATE 0x0001
638
639#define EXT4_GET_BLOCKS_UNWRIT_EXT 0x0002
640#define EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT (EXT4_GET_BLOCKS_UNWRIT_EXT|\
641 EXT4_GET_BLOCKS_CREATE)
642
643
644#define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004
645
646
647
648#define EXT4_GET_BLOCKS_PRE_IO 0x0008
649#define EXT4_GET_BLOCKS_CONVERT 0x0010
650#define EXT4_GET_BLOCKS_IO_CREATE_EXT (EXT4_GET_BLOCKS_PRE_IO|\
651 EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT)
652
653#define EXT4_GET_BLOCKS_IO_CONVERT_EXT (EXT4_GET_BLOCKS_CONVERT|\
654 EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT)
655
656
657#define EXT4_GET_BLOCKS_METADATA_NOFAIL 0x0020
658
659#define EXT4_GET_BLOCKS_NO_NORMALIZE 0x0040
660
661#define EXT4_GET_BLOCKS_CONVERT_UNWRITTEN 0x0100
662
663#define EXT4_GET_BLOCKS_ZERO 0x0200
664#define EXT4_GET_BLOCKS_CREATE_ZERO (EXT4_GET_BLOCKS_CREATE |\
665 EXT4_GET_BLOCKS_ZERO)
666
667
668#define EXT4_GET_BLOCKS_IO_SUBMIT 0x0400
669
670
671
672
673
674
675
676
677
678
679#define EXT4_EX_NOCACHE 0x40000000
680#define EXT4_EX_FORCE_CACHE 0x20000000
681#define EXT4_EX_NOFAIL 0x10000000
682
683
684
685
686#define EXT4_FREE_BLOCKS_METADATA 0x0001
687#define EXT4_FREE_BLOCKS_FORGET 0x0002
688#define EXT4_FREE_BLOCKS_VALIDATED 0x0004
689#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE 0x0008
690#define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER 0x0010
691#define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER 0x0020
692#define EXT4_FREE_BLOCKS_RERESERVE_CLUSTER 0x0040
693
694
695
696
697#define EXT4_IOC_GETVERSION _IOR('f', 3, long)
698#define EXT4_IOC_SETVERSION _IOW('f', 4, long)
699#define EXT4_IOC_GETVERSION_OLD FS_IOC_GETVERSION
700#define EXT4_IOC_SETVERSION_OLD FS_IOC_SETVERSION
701#define EXT4_IOC_GETRSVSZ _IOR('f', 5, long)
702#define EXT4_IOC_SETRSVSZ _IOW('f', 6, long)
703#define EXT4_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long)
704#define EXT4_IOC_GROUP_ADD _IOW('f', 8, struct ext4_new_group_input)
705#define EXT4_IOC_MIGRATE _IO('f', 9)
706
707
708#define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12)
709#define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent)
710#define EXT4_IOC_RESIZE_FS _IOW('f', 16, __u64)
711#define EXT4_IOC_SWAP_BOOT _IO('f', 17)
712#define EXT4_IOC_PRECACHE_EXTENTS _IO('f', 18)
713
714#define EXT4_IOC_CLEAR_ES_CACHE _IO('f', 40)
715#define EXT4_IOC_GETSTATE _IOW('f', 41, __u32)
716#define EXT4_IOC_GET_ES_CACHE _IOWR('f', 42, struct fiemap)
717
718#define EXT4_IOC_SHUTDOWN _IOR ('X', 125, __u32)
719
720
721
722
723#define EXT4_GOING_FLAGS_DEFAULT 0x0
724#define EXT4_GOING_FLAGS_LOGFLUSH 0x1
725#define EXT4_GOING_FLAGS_NOLOGFLUSH 0x2
726
727
728
729
730
731
732
733#define EXT4_STATE_FLAG_EXT_PRECACHED 0x00000001
734#define EXT4_STATE_FLAG_NEW 0x00000002
735#define EXT4_STATE_FLAG_NEWENTRY 0x00000004
736#define EXT4_STATE_FLAG_DA_ALLOC_CLOSE 0x00000008
737
738#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
739
740
741
742#define EXT4_IOC32_GETVERSION _IOR('f', 3, int)
743#define EXT4_IOC32_SETVERSION _IOW('f', 4, int)
744#define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int)
745#define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int)
746#define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int)
747#define EXT4_IOC32_GROUP_ADD _IOW('f', 8, struct compat_ext4_new_group_input)
748#define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION
749#define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION
750#endif
751
752
753
754
755
756#define EXT4_FIEMAP_EXTENT_HOLE 0x08000000
757
758
759#define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF
760
761
762#define EXT4_MAX_LOGICAL_BLOCK 0xFFFFFFFE
763
764
765
766
767struct ext4_inode {
768 __le16 i_mode;
769 __le16 i_uid;
770 __le32 i_size_lo;
771 __le32 i_atime;
772 __le32 i_ctime;
773 __le32 i_mtime;
774 __le32 i_dtime;
775 __le16 i_gid;
776 __le16 i_links_count;
777 __le32 i_blocks_lo;
778 __le32 i_flags;
779 union {
780 struct {
781 __le32 l_i_version;
782 } linux1;
783 struct {
784 __u32 h_i_translator;
785 } hurd1;
786 struct {
787 __u32 m_i_reserved1;
788 } masix1;
789 } osd1;
790 __le32 i_block[EXT4_N_BLOCKS];
791 __le32 i_generation;
792 __le32 i_file_acl_lo;
793 __le32 i_size_high;
794 __le32 i_obso_faddr;
795 union {
796 struct {
797 __le16 l_i_blocks_high;
798 __le16 l_i_file_acl_high;
799 __le16 l_i_uid_high;
800 __le16 l_i_gid_high;
801 __le16 l_i_checksum_lo;
802 __le16 l_i_reserved;
803 } linux2;
804 struct {
805 __le16 h_i_reserved1;
806 __u16 h_i_mode_high;
807 __u16 h_i_uid_high;
808 __u16 h_i_gid_high;
809 __u32 h_i_author;
810 } hurd2;
811 struct {
812 __le16 h_i_reserved1;
813 __le16 m_i_file_acl_high;
814 __u32 m_i_reserved2[2];
815 } masix2;
816 } osd2;
817 __le16 i_extra_isize;
818 __le16 i_checksum_hi;
819 __le32 i_ctime_extra;
820 __le32 i_mtime_extra;
821 __le32 i_atime_extra;
822 __le32 i_crtime;
823 __le32 i_crtime_extra;
824 __le32 i_version_hi;
825 __le32 i_projid;
826};
827
828struct move_extent {
829 __u32 reserved;
830 __u32 donor_fd;
831 __u64 orig_start;
832 __u64 donor_start;
833 __u64 len;
834 __u64 moved_len;
835};
836
837#define EXT4_EPOCH_BITS 2
838#define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1)
839#define EXT4_NSEC_MASK (~0UL << EXT4_EPOCH_BITS)
840
841
842
843
844
845
846
847
848
849
850
851#define EXT4_FITS_IN_INODE(ext4_inode, einode, field) \
852 ((offsetof(typeof(*ext4_inode), field) + \
853 sizeof((ext4_inode)->field)) \
854 <= (EXT4_GOOD_OLD_INODE_SIZE + \
855 (einode)->i_extra_isize)) \
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878static inline __le32 ext4_encode_extra_time(struct timespec64 *time)
879{
880 u32 extra =((time->tv_sec - (s32)time->tv_sec) >> 32) & EXT4_EPOCH_MASK;
881 return cpu_to_le32(extra | (time->tv_nsec << EXT4_EPOCH_BITS));
882}
883
884static inline void ext4_decode_extra_time(struct timespec64 *time,
885 __le32 extra)
886{
887 if (unlikely(extra & cpu_to_le32(EXT4_EPOCH_MASK)))
888 time->tv_sec += (u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32;
889 time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS;
890}
891
892#define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \
893do { \
894 if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) {\
895 (raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec); \
896 (raw_inode)->xtime ## _extra = \
897 ext4_encode_extra_time(&(inode)->xtime); \
898 } \
899 else \
900 (raw_inode)->xtime = cpu_to_le32(clamp_t(int32_t, (inode)->xtime.tv_sec, S32_MIN, S32_MAX)); \
901} while (0)
902
903#define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode) \
904do { \
905 if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
906 (raw_inode)->xtime = cpu_to_le32((einode)->xtime.tv_sec); \
907 if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \
908 (raw_inode)->xtime ## _extra = \
909 ext4_encode_extra_time(&(einode)->xtime); \
910} while (0)
911
912#define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode) \
913do { \
914 (inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime); \
915 if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) { \
916 ext4_decode_extra_time(&(inode)->xtime, \
917 raw_inode->xtime ## _extra); \
918 } \
919 else \
920 (inode)->xtime.tv_nsec = 0; \
921} while (0)
922
923
924#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \
925do { \
926 if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
927 (einode)->xtime.tv_sec = \
928 (signed)le32_to_cpu((raw_inode)->xtime); \
929 else \
930 (einode)->xtime.tv_sec = 0; \
931 if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \
932 ext4_decode_extra_time(&(einode)->xtime, \
933 raw_inode->xtime ## _extra); \
934 else \
935 (einode)->xtime.tv_nsec = 0; \
936} while (0)
937
938#define i_disk_version osd1.linux1.l_i_version
939
940#if defined(__KERNEL__) || defined(__linux__)
941#define i_reserved1 osd1.linux1.l_i_reserved1
942#define i_file_acl_high osd2.linux2.l_i_file_acl_high
943#define i_blocks_high osd2.linux2.l_i_blocks_high
944#define i_uid_low i_uid
945#define i_gid_low i_gid
946#define i_uid_high osd2.linux2.l_i_uid_high
947#define i_gid_high osd2.linux2.l_i_gid_high
948#define i_checksum_lo osd2.linux2.l_i_checksum_lo
949
950#elif defined(__GNU__)
951
952#define i_translator osd1.hurd1.h_i_translator
953#define i_uid_high osd2.hurd2.h_i_uid_high
954#define i_gid_high osd2.hurd2.h_i_gid_high
955#define i_author osd2.hurd2.h_i_author
956
957#elif defined(__masix__)
958
959#define i_reserved1 osd1.masix1.m_i_reserved1
960#define i_file_acl_high osd2.masix2.m_i_file_acl_high
961#define i_reserved2 osd2.masix2.m_i_reserved2
962
963#endif
964
965#include "extents_status.h"
966#include "fast_commit.h"
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984enum {
985 I_DATA_SEM_NORMAL = 0,
986 I_DATA_SEM_OTHER,
987 I_DATA_SEM_QUOTA,
988};
989
990
991
992
993
994struct ext4_inode_info {
995 __le32 i_data[15];
996 __u32 i_dtime;
997 ext4_fsblk_t i_file_acl;
998
999
1000
1001
1002
1003
1004
1005
1006 ext4_group_t i_block_group;
1007 ext4_lblk_t i_dir_start_lookup;
1008#if (BITS_PER_LONG < 64)
1009 unsigned long i_state_flags;
1010#endif
1011 unsigned long i_flags;
1012
1013
1014
1015
1016
1017
1018
1019
1020 struct rw_semaphore xattr_sem;
1021
1022 struct list_head i_orphan;
1023
1024
1025
1026 struct list_head i_fc_list;
1027
1028
1029
1030
1031
1032 ext4_lblk_t i_fc_lblk_start;
1033
1034
1035 ext4_lblk_t i_fc_lblk_len;
1036
1037
1038 atomic_t i_fc_updates;
1039
1040
1041 wait_queue_head_t i_fc_wait;
1042
1043
1044 struct mutex i_fc_lock;
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061 loff_t i_disksize;
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073 struct rw_semaphore i_data_sem;
1074
1075
1076
1077
1078
1079
1080
1081
1082 struct rw_semaphore i_mmap_sem;
1083 struct inode vfs_inode;
1084 struct jbd2_inode *jinode;
1085
1086 spinlock_t i_raw_lock;
1087
1088
1089
1090
1091
1092 struct timespec64 i_crtime;
1093
1094
1095 atomic_t i_prealloc_active;
1096 struct list_head i_prealloc_list;
1097 spinlock_t i_prealloc_lock;
1098
1099
1100 struct ext4_es_tree i_es_tree;
1101 rwlock_t i_es_lock;
1102 struct list_head i_es_list;
1103 unsigned int i_es_all_nr;
1104 unsigned int i_es_shk_nr;
1105 ext4_lblk_t i_es_shrink_lblk;
1106
1107
1108
1109
1110 ext4_group_t i_last_alloc_group;
1111
1112
1113
1114 unsigned int i_reserved_data_blocks;
1115
1116
1117 struct ext4_pending_tree i_pending_tree;
1118
1119
1120 __u16 i_extra_isize;
1121
1122
1123 u16 i_inline_off;
1124 u16 i_inline_size;
1125
1126#ifdef CONFIG_QUOTA
1127
1128 qsize_t i_reserved_quota;
1129#endif
1130
1131
1132 spinlock_t i_completed_io_lock;
1133
1134
1135
1136
1137 struct list_head i_rsv_conversion_list;
1138 struct work_struct i_rsv_conversion_work;
1139 atomic_t i_unwritten;
1140
1141 spinlock_t i_block_reservation_lock;
1142
1143
1144
1145
1146
1147 tid_t i_sync_tid;
1148 tid_t i_datasync_tid;
1149
1150#ifdef CONFIG_QUOTA
1151 struct dquot *i_dquot[MAXQUOTAS];
1152#endif
1153
1154
1155 __u32 i_csum_seed;
1156
1157 kprojid_t i_projid;
1158};
1159
1160
1161
1162
1163#define EXT4_VALID_FS 0x0001
1164#define EXT4_ERROR_FS 0x0002
1165#define EXT4_ORPHAN_FS 0x0004
1166#define EXT4_FC_REPLAY 0x0020
1167
1168
1169
1170
1171#define EXT2_FLAGS_SIGNED_HASH 0x0001
1172#define EXT2_FLAGS_UNSIGNED_HASH 0x0002
1173#define EXT2_FLAGS_TEST_FILESYS 0x0004
1174
1175
1176
1177
1178#define EXT4_MOUNT_NO_MBCACHE 0x00001
1179#define EXT4_MOUNT_GRPID 0x00004
1180#define EXT4_MOUNT_DEBUG 0x00008
1181#define EXT4_MOUNT_ERRORS_CONT 0x00010
1182#define EXT4_MOUNT_ERRORS_RO 0x00020
1183#define EXT4_MOUNT_ERRORS_PANIC 0x00040
1184#define EXT4_MOUNT_ERRORS_MASK 0x00070
1185#define EXT4_MOUNT_MINIX_DF 0x00080
1186#define EXT4_MOUNT_NOLOAD 0x00100
1187#ifdef CONFIG_FS_DAX
1188#define EXT4_MOUNT_DAX_ALWAYS 0x00200
1189#else
1190#define EXT4_MOUNT_DAX_ALWAYS 0
1191#endif
1192#define EXT4_MOUNT_DATA_FLAGS 0x00C00
1193#define EXT4_MOUNT_JOURNAL_DATA 0x00400
1194#define EXT4_MOUNT_ORDERED_DATA 0x00800
1195#define EXT4_MOUNT_WRITEBACK_DATA 0x00C00
1196#define EXT4_MOUNT_UPDATE_JOURNAL 0x01000
1197#define EXT4_MOUNT_NO_UID32 0x02000
1198#define EXT4_MOUNT_XATTR_USER 0x04000
1199#define EXT4_MOUNT_POSIX_ACL 0x08000
1200#define EXT4_MOUNT_NO_AUTO_DA_ALLOC 0x10000
1201#define EXT4_MOUNT_BARRIER 0x20000
1202#define EXT4_MOUNT_QUOTA 0x40000
1203#define EXT4_MOUNT_USRQUOTA 0x80000
1204
1205
1206#define EXT4_MOUNT_GRPQUOTA 0x100000
1207
1208
1209#define EXT4_MOUNT_PRJQUOTA 0x200000
1210
1211#define EXT4_MOUNT_DIOREAD_NOLOCK 0x400000
1212#define EXT4_MOUNT_JOURNAL_CHECKSUM 0x800000
1213#define EXT4_MOUNT_JOURNAL_ASYNC_COMMIT 0x1000000
1214#define EXT4_MOUNT_WARN_ON_ERROR 0x2000000
1215#define EXT4_MOUNT_PREFETCH_BLOCK_BITMAPS 0x4000000
1216#define EXT4_MOUNT_DELALLOC 0x8000000
1217#define EXT4_MOUNT_DATA_ERR_ABORT 0x10000000
1218#define EXT4_MOUNT_BLOCK_VALIDITY 0x20000000
1219#define EXT4_MOUNT_DISCARD 0x40000000
1220#define EXT4_MOUNT_INIT_INODE_TABLE 0x80000000
1221
1222
1223
1224
1225
1226
1227#define EXT4_MOUNT2_EXPLICIT_DELALLOC 0x00000001
1228
1229#define EXT4_MOUNT2_STD_GROUP_SIZE 0x00000002
1230
1231
1232#define EXT4_MOUNT2_HURD_COMPAT 0x00000004
1233
1234#define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM 0x00000008
1235
1236
1237#define EXT4_MOUNT2_JOURNAL_FAST_COMMIT 0x00000010
1238#define EXT4_MOUNT2_DAX_NEVER 0x00000020
1239#define EXT4_MOUNT2_DAX_INODE 0x00000040
1240
1241
1242#define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \
1243 ~EXT4_MOUNT_##opt
1244#define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \
1245 EXT4_MOUNT_##opt
1246#define test_opt(sb, opt) (EXT4_SB(sb)->s_mount_opt & \
1247 EXT4_MOUNT_##opt)
1248
1249#define clear_opt2(sb, opt) EXT4_SB(sb)->s_mount_opt2 &= \
1250 ~EXT4_MOUNT2_##opt
1251#define set_opt2(sb, opt) EXT4_SB(sb)->s_mount_opt2 |= \
1252 EXT4_MOUNT2_##opt
1253#define test_opt2(sb, opt) (EXT4_SB(sb)->s_mount_opt2 & \
1254 EXT4_MOUNT2_##opt)
1255
1256#define ext4_test_and_set_bit __test_and_set_bit_le
1257#define ext4_set_bit __set_bit_le
1258#define ext4_set_bit_atomic ext2_set_bit_atomic
1259#define ext4_test_and_clear_bit __test_and_clear_bit_le
1260#define ext4_clear_bit __clear_bit_le
1261#define ext4_clear_bit_atomic ext2_clear_bit_atomic
1262#define ext4_test_bit test_bit_le
1263#define ext4_find_next_zero_bit find_next_zero_bit_le
1264#define ext4_find_next_bit find_next_bit_le
1265
1266extern void ext4_set_bits(void *bm, int cur, int len);
1267
1268
1269
1270
1271#define EXT4_DFL_MAX_MNT_COUNT 20
1272#define EXT4_DFL_CHECKINTERVAL 0
1273
1274
1275
1276
1277#define EXT4_ERRORS_CONTINUE 1
1278#define EXT4_ERRORS_RO 2
1279#define EXT4_ERRORS_PANIC 3
1280#define EXT4_ERRORS_DEFAULT EXT4_ERRORS_CONTINUE
1281
1282
1283#define EXT4_CRC32C_CHKSUM 1
1284
1285
1286
1287
1288struct ext4_super_block {
1289 __le32 s_inodes_count;
1290 __le32 s_blocks_count_lo;
1291 __le32 s_r_blocks_count_lo;
1292 __le32 s_free_blocks_count_lo;
1293 __le32 s_free_inodes_count;
1294 __le32 s_first_data_block;
1295 __le32 s_log_block_size;
1296 __le32 s_log_cluster_size;
1297 __le32 s_blocks_per_group;
1298 __le32 s_clusters_per_group;
1299 __le32 s_inodes_per_group;
1300 __le32 s_mtime;
1301 __le32 s_wtime;
1302 __le16 s_mnt_count;
1303 __le16 s_max_mnt_count;
1304 __le16 s_magic;
1305 __le16 s_state;
1306 __le16 s_errors;
1307 __le16 s_minor_rev_level;
1308 __le32 s_lastcheck;
1309 __le32 s_checkinterval;
1310 __le32 s_creator_os;
1311 __le32 s_rev_level;
1312 __le16 s_def_resuid;
1313 __le16 s_def_resgid;
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327 __le32 s_first_ino;
1328 __le16 s_inode_size;
1329 __le16 s_block_group_nr;
1330 __le32 s_feature_compat;
1331 __le32 s_feature_incompat;
1332 __le32 s_feature_ro_compat;
1333 __u8 s_uuid[16];
1334 char s_volume_name[16];
1335 char s_last_mounted[64] __nonstring;
1336 __le32 s_algorithm_usage_bitmap;
1337
1338
1339
1340
1341 __u8 s_prealloc_blocks;
1342 __u8 s_prealloc_dir_blocks;
1343 __le16 s_reserved_gdt_blocks;
1344
1345
1346
1347 __u8 s_journal_uuid[16];
1348 __le32 s_journal_inum;
1349 __le32 s_journal_dev;
1350 __le32 s_last_orphan;
1351 __le32 s_hash_seed[4];
1352 __u8 s_def_hash_version;
1353 __u8 s_jnl_backup_type;
1354 __le16 s_desc_size;
1355 __le32 s_default_mount_opts;
1356 __le32 s_first_meta_bg;
1357 __le32 s_mkfs_time;
1358 __le32 s_jnl_blocks[17];
1359
1360 __le32 s_blocks_count_hi;
1361 __le32 s_r_blocks_count_hi;
1362 __le32 s_free_blocks_count_hi;
1363 __le16 s_min_extra_isize;
1364 __le16 s_want_extra_isize;
1365 __le32 s_flags;
1366 __le16 s_raid_stride;
1367 __le16 s_mmp_update_interval;
1368 __le64 s_mmp_block;
1369 __le32 s_raid_stripe_width;
1370 __u8 s_log_groups_per_flex;
1371 __u8 s_checksum_type;
1372 __u8 s_encryption_level;
1373 __u8 s_reserved_pad;
1374 __le64 s_kbytes_written;
1375 __le32 s_snapshot_inum;
1376 __le32 s_snapshot_id;
1377 __le64 s_snapshot_r_blocks_count;
1378
1379 __le32 s_snapshot_list;
1380
1381#define EXT4_S_ERR_START offsetof(struct ext4_super_block, s_error_count)
1382 __le32 s_error_count;
1383 __le32 s_first_error_time;
1384 __le32 s_first_error_ino;
1385 __le64 s_first_error_block;
1386 __u8 s_first_error_func[32] __nonstring;
1387 __le32 s_first_error_line;
1388 __le32 s_last_error_time;
1389 __le32 s_last_error_ino;
1390 __le32 s_last_error_line;
1391 __le64 s_last_error_block;
1392 __u8 s_last_error_func[32] __nonstring;
1393#define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts)
1394 __u8 s_mount_opts[64];
1395 __le32 s_usr_quota_inum;
1396 __le32 s_grp_quota_inum;
1397 __le32 s_overhead_clusters;
1398 __le32 s_backup_bgs[2];
1399 __u8 s_encrypt_algos[4];
1400 __u8 s_encrypt_pw_salt[16];
1401 __le32 s_lpf_ino;
1402 __le32 s_prj_quota_inum;
1403 __le32 s_checksum_seed;
1404 __u8 s_wtime_hi;
1405 __u8 s_mtime_hi;
1406 __u8 s_mkfs_time_hi;
1407 __u8 s_lastcheck_hi;
1408 __u8 s_first_error_time_hi;
1409 __u8 s_last_error_time_hi;
1410 __u8 s_first_error_errcode;
1411 __u8 s_last_error_errcode;
1412 __le16 s_encoding;
1413 __le16 s_encoding_flags;
1414 __le32 s_reserved[95];
1415 __le32 s_checksum;
1416};
1417
1418#define EXT4_S_ERR_LEN (EXT4_S_ERR_END - EXT4_S_ERR_START)
1419
1420#ifdef __KERNEL__
1421
1422#ifdef CONFIG_FS_ENCRYPTION
1423#define DUMMY_ENCRYPTION_ENABLED(sbi) ((sbi)->s_dummy_enc_policy.policy != NULL)
1424#else
1425#define DUMMY_ENCRYPTION_ENABLED(sbi) (0)
1426#endif
1427
1428
1429#define EXT4_MAXQUOTAS 3
1430
1431#define EXT4_ENC_UTF8_12_1 1
1432
1433
1434
1435
1436struct ext4_sb_info {
1437 unsigned long s_desc_size;
1438 unsigned long s_inodes_per_block;
1439 unsigned long s_blocks_per_group;
1440 unsigned long s_clusters_per_group;
1441 unsigned long s_inodes_per_group;
1442 unsigned long s_itb_per_group;
1443 unsigned long s_gdb_count;
1444 unsigned long s_desc_per_block;
1445 ext4_group_t s_groups_count;
1446 ext4_group_t s_blockfile_groups;
1447 unsigned long s_overhead;
1448 unsigned int s_cluster_ratio;
1449 unsigned int s_cluster_bits;
1450 loff_t s_bitmap_maxbytes;
1451 struct buffer_head * s_sbh;
1452 struct ext4_super_block *s_es;
1453 struct buffer_head * __rcu *s_group_desc;
1454 unsigned int s_mount_opt;
1455 unsigned int s_mount_opt2;
1456 unsigned long s_mount_flags;
1457 unsigned int s_def_mount_opt;
1458 ext4_fsblk_t s_sb_block;
1459 atomic64_t s_resv_clusters;
1460 kuid_t s_resuid;
1461 kgid_t s_resgid;
1462 unsigned short s_mount_state;
1463 unsigned short s_pad;
1464 int s_addr_per_block_bits;
1465 int s_desc_per_block_bits;
1466 int s_inode_size;
1467 int s_first_ino;
1468 unsigned int s_inode_readahead_blks;
1469 unsigned int s_inode_goal;
1470 u32 s_hash_seed[4];
1471 int s_def_hash_version;
1472 int s_hash_unsigned;
1473 struct percpu_counter s_freeclusters_counter;
1474 struct percpu_counter s_freeinodes_counter;
1475 struct percpu_counter s_dirs_counter;
1476 struct percpu_counter s_dirtyclusters_counter;
1477 struct blockgroup_lock *s_blockgroup_lock;
1478 struct proc_dir_entry *s_proc;
1479 struct kobject s_kobj;
1480 struct completion s_kobj_unregister;
1481 struct super_block *s_sb;
1482
1483
1484 struct journal_s *s_journal;
1485 struct list_head s_orphan;
1486 struct mutex s_orphan_lock;
1487 unsigned long s_ext4_flags;
1488 unsigned long s_commit_interval;
1489 u32 s_max_batch_time;
1490 u32 s_min_batch_time;
1491 struct block_device *s_journal_bdev;
1492#ifdef CONFIG_QUOTA
1493
1494 char __rcu *s_qf_names[EXT4_MAXQUOTAS];
1495 int s_jquota_fmt;
1496#endif
1497 unsigned int s_want_extra_isize;
1498 struct ext4_system_blocks __rcu *s_system_blks;
1499
1500#ifdef EXTENTS_STATS
1501
1502 unsigned long s_ext_min;
1503 unsigned long s_ext_max;
1504 unsigned long s_depth_max;
1505 spinlock_t s_ext_stats_lock;
1506 unsigned long s_ext_blocks;
1507 unsigned long s_ext_extents;
1508#endif
1509
1510
1511 struct ext4_group_info ** __rcu *s_group_info;
1512 struct inode *s_buddy_cache;
1513 spinlock_t s_md_lock;
1514 unsigned short *s_mb_offsets;
1515 unsigned int *s_mb_maxs;
1516 unsigned int s_group_info_size;
1517 unsigned int s_mb_free_pending;
1518 struct list_head s_freed_data_list;
1519
1520
1521
1522 unsigned long s_stripe;
1523 unsigned int s_mb_stream_request;
1524 unsigned int s_mb_max_to_scan;
1525 unsigned int s_mb_min_to_scan;
1526 unsigned int s_mb_stats;
1527 unsigned int s_mb_order2_reqs;
1528 unsigned int s_mb_group_prealloc;
1529 unsigned int s_mb_max_inode_prealloc;
1530 unsigned int s_max_dir_size_kb;
1531
1532 unsigned long s_mb_last_group;
1533 unsigned long s_mb_last_start;
1534 unsigned int s_mb_prefetch;
1535 unsigned int s_mb_prefetch_limit;
1536
1537
1538 atomic_t s_bal_reqs;
1539 atomic_t s_bal_success;
1540 atomic_t s_bal_allocated;
1541 atomic_t s_bal_ex_scanned;
1542 atomic_t s_bal_goals;
1543 atomic_t s_bal_breaks;
1544 atomic_t s_bal_2orders;
1545 spinlock_t s_bal_lock;
1546 unsigned long s_mb_buddies_generated;
1547 unsigned long long s_mb_generation_time;
1548 atomic_t s_mb_lost_chunks;
1549 atomic_t s_mb_preallocated;
1550 atomic_t s_mb_discarded;
1551 atomic_t s_lock_busy;
1552
1553
1554 struct ext4_locality_group __percpu *s_locality_groups;
1555
1556
1557 unsigned long s_sectors_written_start;
1558 u64 s_kbytes_written;
1559
1560
1561 unsigned int s_extent_max_zeroout_kb;
1562
1563 unsigned int s_log_groups_per_flex;
1564 struct flex_groups * __rcu *s_flex_groups;
1565 ext4_group_t s_flex_groups_allocated;
1566
1567
1568 struct workqueue_struct *rsv_conversion_wq;
1569
1570
1571 struct timer_list s_err_report;
1572
1573
1574 struct ext4_li_request *s_li_request;
1575
1576 unsigned int s_li_wait_mult;
1577
1578
1579 struct task_struct *s_mmp_tsk;
1580
1581
1582 atomic_t s_last_trim_minblks;
1583
1584
1585 struct crypto_shash *s_chksum_driver;
1586
1587
1588 __u32 s_csum_seed;
1589
1590
1591 struct shrinker s_es_shrinker;
1592 struct list_head s_es_list;
1593 long s_es_nr_inode;
1594 struct ext4_es_stats s_es_stats;
1595 struct mb_cache *s_ea_block_cache;
1596 struct mb_cache *s_ea_inode_cache;
1597 spinlock_t s_es_lock ____cacheline_aligned_in_smp;
1598
1599
1600 struct ratelimit_state s_err_ratelimit_state;
1601 struct ratelimit_state s_warning_ratelimit_state;
1602 struct ratelimit_state s_msg_ratelimit_state;
1603 atomic_t s_warning_count;
1604 atomic_t s_msg_count;
1605
1606
1607 struct fscrypt_dummy_policy s_dummy_enc_policy;
1608
1609
1610
1611
1612
1613 struct percpu_rw_semaphore s_writepages_rwsem;
1614 struct dax_device *s_daxdev;
1615#ifdef CONFIG_EXT4_DEBUG
1616 unsigned long s_simulate_fail;
1617#endif
1618
1619 errseq_t s_bdev_wb_err;
1620 spinlock_t s_bdev_wb_lock;
1621
1622
1623 atomic_t s_fc_subtid;
1624 atomic_t s_fc_ineligible_updates;
1625
1626
1627
1628
1629#define FC_Q_MAIN 0
1630#define FC_Q_STAGING 1
1631 struct list_head s_fc_q[2];
1632
1633
1634 struct list_head s_fc_dentry_q[2];
1635 unsigned int s_fc_bytes;
1636
1637
1638
1639
1640
1641 spinlock_t s_fc_lock;
1642 struct buffer_head *s_fc_bh;
1643 struct ext4_fc_stats s_fc_stats;
1644 u64 s_fc_avg_commit_time;
1645#ifdef CONFIG_EXT4_DEBUG
1646 int s_fc_debug_max_replay;
1647#endif
1648 struct ext4_fc_replay_state s_fc_replay_state;
1649};
1650
1651static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb)
1652{
1653 return sb->s_fs_info;
1654}
1655static inline struct ext4_inode_info *EXT4_I(struct inode *inode)
1656{
1657 return container_of(inode, struct ext4_inode_info, vfs_inode);
1658}
1659
1660static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
1661{
1662 return ino == EXT4_ROOT_INO ||
1663 (ino >= EXT4_FIRST_INO(sb) &&
1664 ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count));
1665}
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675#define sbi_array_rcu_deref(sbi, field, index) \
1676({ \
1677 typeof(*((sbi)->field)) _v; \
1678 rcu_read_lock(); \
1679 _v = ((typeof(_v)*)rcu_dereference((sbi)->field))[index]; \
1680 rcu_read_unlock(); \
1681 _v; \
1682})
1683
1684
1685
1686
1687enum {
1688 EXT4_MF_MNTDIR_SAMPLED,
1689 EXT4_MF_FS_ABORTED,
1690 EXT4_MF_FC_INELIGIBLE,
1691 EXT4_MF_FC_COMMITTING
1692
1693
1694};
1695
1696static inline void ext4_set_mount_flag(struct super_block *sb, int bit)
1697{
1698 set_bit(bit, &EXT4_SB(sb)->s_mount_flags);
1699}
1700
1701static inline void ext4_clear_mount_flag(struct super_block *sb, int bit)
1702{
1703 clear_bit(bit, &EXT4_SB(sb)->s_mount_flags);
1704}
1705
1706static inline int ext4_test_mount_flag(struct super_block *sb, int bit)
1707{
1708 return test_bit(bit, &EXT4_SB(sb)->s_mount_flags);
1709}
1710
1711
1712
1713
1714
1715#define EXT4_SIM_BBITMAP_EIO 1
1716#define EXT4_SIM_BBITMAP_CRC 2
1717#define EXT4_SIM_IBITMAP_EIO 3
1718#define EXT4_SIM_IBITMAP_CRC 4
1719#define EXT4_SIM_INODE_EIO 5
1720#define EXT4_SIM_INODE_CRC 6
1721#define EXT4_SIM_DIRBLOCK_EIO 7
1722#define EXT4_SIM_DIRBLOCK_CRC 8
1723
1724static inline bool ext4_simulate_fail(struct super_block *sb,
1725 unsigned long code)
1726{
1727#ifdef CONFIG_EXT4_DEBUG
1728 struct ext4_sb_info *sbi = EXT4_SB(sb);
1729
1730 if (unlikely(sbi->s_simulate_fail == code)) {
1731 sbi->s_simulate_fail = 0;
1732 return true;
1733 }
1734#endif
1735 return false;
1736}
1737
1738static inline void ext4_simulate_fail_bh(struct super_block *sb,
1739 struct buffer_head *bh,
1740 unsigned long code)
1741{
1742 if (!IS_ERR(bh) && ext4_simulate_fail(sb, code))
1743 clear_buffer_uptodate(bh);
1744}
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754#define EXT4_ERR_UNKNOWN 1
1755#define EXT4_ERR_EIO 2
1756#define EXT4_ERR_ENOMEM 3
1757#define EXT4_ERR_EFSBADCRC 4
1758#define EXT4_ERR_EFSCORRUPTED 5
1759#define EXT4_ERR_ENOSPC 6
1760#define EXT4_ERR_ENOKEY 7
1761#define EXT4_ERR_EROFS 8
1762#define EXT4_ERR_EFBIG 9
1763#define EXT4_ERR_EEXIST 10
1764#define EXT4_ERR_ERANGE 11
1765#define EXT4_ERR_EOVERFLOW 12
1766#define EXT4_ERR_EBUSY 13
1767#define EXT4_ERR_ENOTDIR 14
1768#define EXT4_ERR_ENOTEMPTY 15
1769#define EXT4_ERR_ESHUTDOWN 16
1770#define EXT4_ERR_EFAULT 17
1771
1772
1773
1774
1775enum {
1776 EXT4_STATE_JDATA,
1777 EXT4_STATE_NEW,
1778 EXT4_STATE_XATTR,
1779 EXT4_STATE_NO_EXPAND,
1780 EXT4_STATE_DA_ALLOC_CLOSE,
1781 EXT4_STATE_EXT_MIGRATE,
1782 EXT4_STATE_NEWENTRY,
1783 EXT4_STATE_MAY_INLINE_DATA,
1784 EXT4_STATE_EXT_PRECACHED,
1785 EXT4_STATE_LUSTRE_EA_INODE,
1786 EXT4_STATE_VERITY_IN_PROGRESS,
1787 EXT4_STATE_FC_COMMITTING,
1788};
1789
1790#define EXT4_INODE_BIT_FNS(name, field, offset) \
1791static inline int ext4_test_inode_##name(struct inode *inode, int bit) \
1792{ \
1793 return test_bit(bit + (offset), &EXT4_I(inode)->i_##field); \
1794} \
1795static inline void ext4_set_inode_##name(struct inode *inode, int bit) \
1796{ \
1797 set_bit(bit + (offset), &EXT4_I(inode)->i_##field); \
1798} \
1799static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \
1800{ \
1801 clear_bit(bit + (offset), &EXT4_I(inode)->i_##field); \
1802}
1803
1804
1805
1806static inline int ext4_test_inode_flag(struct inode *inode, int bit);
1807static inline void ext4_set_inode_flag(struct inode *inode, int bit);
1808static inline void ext4_clear_inode_flag(struct inode *inode, int bit);
1809EXT4_INODE_BIT_FNS(flag, flags, 0)
1810
1811
1812
1813static inline int ext4_test_inode_state(struct inode *inode, int bit);
1814static inline void ext4_set_inode_state(struct inode *inode, int bit);
1815static inline void ext4_clear_inode_state(struct inode *inode, int bit);
1816#if (BITS_PER_LONG < 64)
1817EXT4_INODE_BIT_FNS(state, state_flags, 0)
1818
1819static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
1820{
1821 (ei)->i_state_flags = 0;
1822}
1823#else
1824EXT4_INODE_BIT_FNS(state, flags, 32)
1825
1826static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
1827{
1828
1829}
1830#endif
1831#else
1832
1833
1834
1835#define EXT4_SB(sb) (sb)
1836#endif
1837
1838static inline bool ext4_verity_in_progress(struct inode *inode)
1839{
1840 return IS_ENABLED(CONFIG_FS_VERITY) &&
1841 ext4_test_inode_state(inode, EXT4_STATE_VERITY_IN_PROGRESS);
1842}
1843
1844#define NEXT_ORPHAN(inode) EXT4_I(inode)->i_dtime
1845
1846
1847
1848
1849#define EXT4_OS_LINUX 0
1850#define EXT4_OS_HURD 1
1851#define EXT4_OS_MASIX 2
1852#define EXT4_OS_FREEBSD 3
1853#define EXT4_OS_LITES 4
1854
1855
1856
1857
1858#define EXT4_GOOD_OLD_REV 0
1859#define EXT4_DYNAMIC_REV 1
1860
1861#define EXT4_CURRENT_REV EXT4_GOOD_OLD_REV
1862#define EXT4_MAX_SUPP_REV EXT4_DYNAMIC_REV
1863
1864#define EXT4_GOOD_OLD_INODE_SIZE 128
1865
1866#define EXT4_EXTRA_TIMESTAMP_MAX (((s64)1 << 34) - 1 + S32_MIN)
1867#define EXT4_NON_EXTRA_TIMESTAMP_MAX S32_MAX
1868#define EXT4_TIMESTAMP_MIN S32_MIN
1869
1870
1871
1872
1873
1874#define EXT4_FEATURE_COMPAT_DIR_PREALLOC 0x0001
1875#define EXT4_FEATURE_COMPAT_IMAGIC_INODES 0x0002
1876#define EXT4_FEATURE_COMPAT_HAS_JOURNAL 0x0004
1877#define EXT4_FEATURE_COMPAT_EXT_ATTR 0x0008
1878#define EXT4_FEATURE_COMPAT_RESIZE_INODE 0x0010
1879#define EXT4_FEATURE_COMPAT_DIR_INDEX 0x0020
1880#define EXT4_FEATURE_COMPAT_SPARSE_SUPER2 0x0200
1881
1882
1883
1884
1885
1886
1887
1888#define EXT4_FEATURE_COMPAT_FAST_COMMIT 0x0400
1889#define EXT4_FEATURE_COMPAT_STABLE_INODES 0x0800
1890
1891#define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
1892#define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
1893#define EXT4_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
1894#define EXT4_FEATURE_RO_COMPAT_HUGE_FILE 0x0008
1895#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM 0x0010
1896#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK 0x0020
1897#define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE 0x0040
1898#define EXT4_FEATURE_RO_COMPAT_QUOTA 0x0100
1899#define EXT4_FEATURE_RO_COMPAT_BIGALLOC 0x0200
1900
1901
1902
1903
1904
1905
1906#define EXT4_FEATURE_RO_COMPAT_METADATA_CSUM 0x0400
1907#define EXT4_FEATURE_RO_COMPAT_READONLY 0x1000
1908#define EXT4_FEATURE_RO_COMPAT_PROJECT 0x2000
1909#define EXT4_FEATURE_RO_COMPAT_VERITY 0x8000
1910
1911#define EXT4_FEATURE_INCOMPAT_COMPRESSION 0x0001
1912#define EXT4_FEATURE_INCOMPAT_FILETYPE 0x0002
1913#define EXT4_FEATURE_INCOMPAT_RECOVER 0x0004
1914#define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
1915#define EXT4_FEATURE_INCOMPAT_META_BG 0x0010
1916#define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040
1917#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
1918#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
1919#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200
1920#define EXT4_FEATURE_INCOMPAT_EA_INODE 0x0400
1921#define EXT4_FEATURE_INCOMPAT_DIRDATA 0x1000
1922#define EXT4_FEATURE_INCOMPAT_CSUM_SEED 0x2000
1923#define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000
1924#define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000
1925#define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000
1926#define EXT4_FEATURE_INCOMPAT_CASEFOLD 0x20000
1927
1928extern void ext4_update_dynamic_rev(struct super_block *sb);
1929
1930#define EXT4_FEATURE_COMPAT_FUNCS(name, flagname) \
1931static inline bool ext4_has_feature_##name(struct super_block *sb) \
1932{ \
1933 return ((EXT4_SB(sb)->s_es->s_feature_compat & \
1934 cpu_to_le32(EXT4_FEATURE_COMPAT_##flagname)) != 0); \
1935} \
1936static inline void ext4_set_feature_##name(struct super_block *sb) \
1937{ \
1938 ext4_update_dynamic_rev(sb); \
1939 EXT4_SB(sb)->s_es->s_feature_compat |= \
1940 cpu_to_le32(EXT4_FEATURE_COMPAT_##flagname); \
1941} \
1942static inline void ext4_clear_feature_##name(struct super_block *sb) \
1943{ \
1944 EXT4_SB(sb)->s_es->s_feature_compat &= \
1945 ~cpu_to_le32(EXT4_FEATURE_COMPAT_##flagname); \
1946}
1947
1948#define EXT4_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
1949static inline bool ext4_has_feature_##name(struct super_block *sb) \
1950{ \
1951 return ((EXT4_SB(sb)->s_es->s_feature_ro_compat & \
1952 cpu_to_le32(EXT4_FEATURE_RO_COMPAT_##flagname)) != 0); \
1953} \
1954static inline void ext4_set_feature_##name(struct super_block *sb) \
1955{ \
1956 ext4_update_dynamic_rev(sb); \
1957 EXT4_SB(sb)->s_es->s_feature_ro_compat |= \
1958 cpu_to_le32(EXT4_FEATURE_RO_COMPAT_##flagname); \
1959} \
1960static inline void ext4_clear_feature_##name(struct super_block *sb) \
1961{ \
1962 EXT4_SB(sb)->s_es->s_feature_ro_compat &= \
1963 ~cpu_to_le32(EXT4_FEATURE_RO_COMPAT_##flagname); \
1964}
1965
1966#define EXT4_FEATURE_INCOMPAT_FUNCS(name, flagname) \
1967static inline bool ext4_has_feature_##name(struct super_block *sb) \
1968{ \
1969 return ((EXT4_SB(sb)->s_es->s_feature_incompat & \
1970 cpu_to_le32(EXT4_FEATURE_INCOMPAT_##flagname)) != 0); \
1971} \
1972static inline void ext4_set_feature_##name(struct super_block *sb) \
1973{ \
1974 ext4_update_dynamic_rev(sb); \
1975 EXT4_SB(sb)->s_es->s_feature_incompat |= \
1976 cpu_to_le32(EXT4_FEATURE_INCOMPAT_##flagname); \
1977} \
1978static inline void ext4_clear_feature_##name(struct super_block *sb) \
1979{ \
1980 EXT4_SB(sb)->s_es->s_feature_incompat &= \
1981 ~cpu_to_le32(EXT4_FEATURE_INCOMPAT_##flagname); \
1982}
1983
1984EXT4_FEATURE_COMPAT_FUNCS(dir_prealloc, DIR_PREALLOC)
1985EXT4_FEATURE_COMPAT_FUNCS(imagic_inodes, IMAGIC_INODES)
1986EXT4_FEATURE_COMPAT_FUNCS(journal, HAS_JOURNAL)
1987EXT4_FEATURE_COMPAT_FUNCS(xattr, EXT_ATTR)
1988EXT4_FEATURE_COMPAT_FUNCS(resize_inode, RESIZE_INODE)
1989EXT4_FEATURE_COMPAT_FUNCS(dir_index, DIR_INDEX)
1990EXT4_FEATURE_COMPAT_FUNCS(sparse_super2, SPARSE_SUPER2)
1991EXT4_FEATURE_COMPAT_FUNCS(fast_commit, FAST_COMMIT)
1992EXT4_FEATURE_COMPAT_FUNCS(stable_inodes, STABLE_INODES)
1993
1994EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super, SPARSE_SUPER)
1995EXT4_FEATURE_RO_COMPAT_FUNCS(large_file, LARGE_FILE)
1996EXT4_FEATURE_RO_COMPAT_FUNCS(btree_dir, BTREE_DIR)
1997EXT4_FEATURE_RO_COMPAT_FUNCS(huge_file, HUGE_FILE)
1998EXT4_FEATURE_RO_COMPAT_FUNCS(gdt_csum, GDT_CSUM)
1999EXT4_FEATURE_RO_COMPAT_FUNCS(dir_nlink, DIR_NLINK)
2000EXT4_FEATURE_RO_COMPAT_FUNCS(extra_isize, EXTRA_ISIZE)
2001EXT4_FEATURE_RO_COMPAT_FUNCS(quota, QUOTA)
2002EXT4_FEATURE_RO_COMPAT_FUNCS(bigalloc, BIGALLOC)
2003EXT4_FEATURE_RO_COMPAT_FUNCS(metadata_csum, METADATA_CSUM)
2004EXT4_FEATURE_RO_COMPAT_FUNCS(readonly, READONLY)
2005EXT4_FEATURE_RO_COMPAT_FUNCS(project, PROJECT)
2006EXT4_FEATURE_RO_COMPAT_FUNCS(verity, VERITY)
2007
2008EXT4_FEATURE_INCOMPAT_FUNCS(compression, COMPRESSION)
2009EXT4_FEATURE_INCOMPAT_FUNCS(filetype, FILETYPE)
2010EXT4_FEATURE_INCOMPAT_FUNCS(journal_needs_recovery, RECOVER)
2011EXT4_FEATURE_INCOMPAT_FUNCS(journal_dev, JOURNAL_DEV)
2012EXT4_FEATURE_INCOMPAT_FUNCS(meta_bg, META_BG)
2013EXT4_FEATURE_INCOMPAT_FUNCS(extents, EXTENTS)
2014EXT4_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT)
2015EXT4_FEATURE_INCOMPAT_FUNCS(mmp, MMP)
2016EXT4_FEATURE_INCOMPAT_FUNCS(flex_bg, FLEX_BG)
2017EXT4_FEATURE_INCOMPAT_FUNCS(ea_inode, EA_INODE)
2018EXT4_FEATURE_INCOMPAT_FUNCS(dirdata, DIRDATA)
2019EXT4_FEATURE_INCOMPAT_FUNCS(csum_seed, CSUM_SEED)
2020EXT4_FEATURE_INCOMPAT_FUNCS(largedir, LARGEDIR)
2021EXT4_FEATURE_INCOMPAT_FUNCS(inline_data, INLINE_DATA)
2022EXT4_FEATURE_INCOMPAT_FUNCS(encrypt, ENCRYPT)
2023EXT4_FEATURE_INCOMPAT_FUNCS(casefold, CASEFOLD)
2024
2025#define EXT2_FEATURE_COMPAT_SUPP EXT4_FEATURE_COMPAT_EXT_ATTR
2026#define EXT2_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE| \
2027 EXT4_FEATURE_INCOMPAT_META_BG)
2028#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
2029 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
2030 EXT4_FEATURE_RO_COMPAT_BTREE_DIR)
2031
2032#define EXT3_FEATURE_COMPAT_SUPP EXT4_FEATURE_COMPAT_EXT_ATTR
2033#define EXT3_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE| \
2034 EXT4_FEATURE_INCOMPAT_RECOVER| \
2035 EXT4_FEATURE_INCOMPAT_META_BG)
2036#define EXT3_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
2037 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
2038 EXT4_FEATURE_RO_COMPAT_BTREE_DIR)
2039
2040#define EXT4_FEATURE_COMPAT_SUPP EXT4_FEATURE_COMPAT_EXT_ATTR
2041#define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE| \
2042 EXT4_FEATURE_INCOMPAT_RECOVER| \
2043 EXT4_FEATURE_INCOMPAT_META_BG| \
2044 EXT4_FEATURE_INCOMPAT_EXTENTS| \
2045 EXT4_FEATURE_INCOMPAT_64BIT| \
2046 EXT4_FEATURE_INCOMPAT_FLEX_BG| \
2047 EXT4_FEATURE_INCOMPAT_EA_INODE| \
2048 EXT4_FEATURE_INCOMPAT_MMP | \
2049 EXT4_FEATURE_INCOMPAT_INLINE_DATA | \
2050 EXT4_FEATURE_INCOMPAT_ENCRYPT | \
2051 EXT4_FEATURE_INCOMPAT_CASEFOLD | \
2052 EXT4_FEATURE_INCOMPAT_CSUM_SEED | \
2053 EXT4_FEATURE_INCOMPAT_LARGEDIR)
2054#define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
2055 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
2056 EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \
2057 EXT4_FEATURE_RO_COMPAT_DIR_NLINK | \
2058 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE | \
2059 EXT4_FEATURE_RO_COMPAT_BTREE_DIR |\
2060 EXT4_FEATURE_RO_COMPAT_HUGE_FILE |\
2061 EXT4_FEATURE_RO_COMPAT_BIGALLOC |\
2062 EXT4_FEATURE_RO_COMPAT_METADATA_CSUM|\
2063 EXT4_FEATURE_RO_COMPAT_QUOTA |\
2064 EXT4_FEATURE_RO_COMPAT_PROJECT |\
2065 EXT4_FEATURE_RO_COMPAT_VERITY)
2066
2067#define EXTN_FEATURE_FUNCS(ver) \
2068static inline bool ext4_has_unknown_ext##ver##_compat_features(struct super_block *sb) \
2069{ \
2070 return ((EXT4_SB(sb)->s_es->s_feature_compat & \
2071 cpu_to_le32(~EXT##ver##_FEATURE_COMPAT_SUPP)) != 0); \
2072} \
2073static inline bool ext4_has_unknown_ext##ver##_ro_compat_features(struct super_block *sb) \
2074{ \
2075 return ((EXT4_SB(sb)->s_es->s_feature_ro_compat & \
2076 cpu_to_le32(~EXT##ver##_FEATURE_RO_COMPAT_SUPP)) != 0); \
2077} \
2078static inline bool ext4_has_unknown_ext##ver##_incompat_features(struct super_block *sb) \
2079{ \
2080 return ((EXT4_SB(sb)->s_es->s_feature_incompat & \
2081 cpu_to_le32(~EXT##ver##_FEATURE_INCOMPAT_SUPP)) != 0); \
2082}
2083
2084EXTN_FEATURE_FUNCS(2)
2085EXTN_FEATURE_FUNCS(3)
2086EXTN_FEATURE_FUNCS(4)
2087
2088static inline bool ext4_has_compat_features(struct super_block *sb)
2089{
2090 return (EXT4_SB(sb)->s_es->s_feature_compat != 0);
2091}
2092static inline bool ext4_has_ro_compat_features(struct super_block *sb)
2093{
2094 return (EXT4_SB(sb)->s_es->s_feature_ro_compat != 0);
2095}
2096static inline bool ext4_has_incompat_features(struct super_block *sb)
2097{
2098 return (EXT4_SB(sb)->s_es->s_feature_incompat != 0);
2099}
2100
2101
2102
2103
2104#define EXT4_FLAGS_RESIZING 0
2105#define EXT4_FLAGS_SHUTDOWN 1
2106#define EXT4_FLAGS_BDEV_IS_DAX 2
2107
2108static inline int ext4_forced_shutdown(struct ext4_sb_info *sbi)
2109{
2110 return test_bit(EXT4_FLAGS_SHUTDOWN, &sbi->s_ext4_flags);
2111}
2112
2113
2114
2115
2116
2117#define EXT4_DEF_RESUID 0
2118#define EXT4_DEF_RESGID 0
2119
2120
2121
2122
2123#define EXT4_DEF_PROJID 0
2124
2125#define EXT4_DEF_INODE_READAHEAD_BLKS 32
2126
2127
2128
2129
2130#define EXT4_DEFM_DEBUG 0x0001
2131#define EXT4_DEFM_BSDGROUPS 0x0002
2132#define EXT4_DEFM_XATTR_USER 0x0004
2133#define EXT4_DEFM_ACL 0x0008
2134#define EXT4_DEFM_UID16 0x0010
2135#define EXT4_DEFM_JMODE 0x0060
2136#define EXT4_DEFM_JMODE_DATA 0x0020
2137#define EXT4_DEFM_JMODE_ORDERED 0x0040
2138#define EXT4_DEFM_JMODE_WBACK 0x0060
2139#define EXT4_DEFM_NOBARRIER 0x0100
2140#define EXT4_DEFM_BLOCK_VALIDITY 0x0200
2141#define EXT4_DEFM_DISCARD 0x0400
2142#define EXT4_DEFM_NODELALLOC 0x0800
2143
2144
2145
2146
2147#define EXT4_DEF_MIN_BATCH_TIME 0
2148#define EXT4_DEF_MAX_BATCH_TIME 15000
2149
2150
2151
2152
2153
2154#define EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME 4
2155
2156
2157
2158
2159#define EXT4_NAME_LEN 255
2160
2161struct ext4_dir_entry {
2162 __le32 inode;
2163 __le16 rec_len;
2164 __le16 name_len;
2165 char name[EXT4_NAME_LEN];
2166};
2167
2168
2169
2170
2171
2172
2173
2174struct ext4_dir_entry_2 {
2175 __le32 inode;
2176 __le16 rec_len;
2177 __u8 name_len;
2178 __u8 file_type;
2179 char name[EXT4_NAME_LEN];
2180};
2181
2182
2183
2184
2185
2186struct ext4_dir_entry_tail {
2187 __le32 det_reserved_zero1;
2188 __le16 det_rec_len;
2189 __u8 det_reserved_zero2;
2190 __u8 det_reserved_ft;
2191 __le32 det_checksum;
2192};
2193
2194#define EXT4_DIRENT_TAIL(block, blocksize) \
2195 ((struct ext4_dir_entry_tail *)(((void *)(block)) + \
2196 ((blocksize) - \
2197 sizeof(struct ext4_dir_entry_tail))))
2198
2199
2200
2201
2202
2203#define EXT4_FT_UNKNOWN 0
2204#define EXT4_FT_REG_FILE 1
2205#define EXT4_FT_DIR 2
2206#define EXT4_FT_CHRDEV 3
2207#define EXT4_FT_BLKDEV 4
2208#define EXT4_FT_FIFO 5
2209#define EXT4_FT_SOCK 6
2210#define EXT4_FT_SYMLINK 7
2211
2212#define EXT4_FT_MAX 8
2213
2214#define EXT4_FT_DIR_CSUM 0xDE
2215
2216
2217
2218
2219
2220
2221#define EXT4_DIR_PAD 4
2222#define EXT4_DIR_ROUND (EXT4_DIR_PAD - 1)
2223#define EXT4_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT4_DIR_ROUND) & \
2224 ~EXT4_DIR_ROUND)
2225#define EXT4_MAX_REC_LEN ((1<<16)-1)
2226
2227
2228
2229
2230
2231static inline unsigned int
2232ext4_rec_len_from_disk(__le16 dlen, unsigned blocksize)
2233{
2234 unsigned len = le16_to_cpu(dlen);
2235
2236#if (PAGE_SIZE >= 65536)
2237 if (len == EXT4_MAX_REC_LEN || len == 0)
2238 return blocksize;
2239 return (len & 65532) | ((len & 3) << 16);
2240#else
2241 return len;
2242#endif
2243}
2244
2245static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)
2246{
2247 if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3))
2248 BUG();
2249#if (PAGE_SIZE >= 65536)
2250 if (len < 65536)
2251 return cpu_to_le16(len);
2252 if (len == blocksize) {
2253 if (blocksize == 65536)
2254 return cpu_to_le16(EXT4_MAX_REC_LEN);
2255 else
2256 return cpu_to_le16(0);
2257 }
2258 return cpu_to_le16((len & 65532) | ((len >> 16) & 3));
2259#else
2260 return cpu_to_le16(len);
2261#endif
2262}
2263
2264
2265
2266
2267
2268
2269#define is_dx(dir) (ext4_has_feature_dir_index((dir)->i_sb) && \
2270 ext4_test_inode_flag((dir), EXT4_INODE_INDEX))
2271#define EXT4_DIR_LINK_MAX(dir) unlikely((dir)->i_nlink >= EXT4_LINK_MAX && \
2272 !(ext4_has_feature_dir_nlink((dir)->i_sb) && is_dx(dir)))
2273#define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1)
2274
2275
2276
2277#define DX_HASH_LEGACY 0
2278#define DX_HASH_HALF_MD4 1
2279#define DX_HASH_TEA 2
2280#define DX_HASH_LEGACY_UNSIGNED 3
2281#define DX_HASH_HALF_MD4_UNSIGNED 4
2282#define DX_HASH_TEA_UNSIGNED 5
2283
2284static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc,
2285 const void *address, unsigned int length)
2286{
2287 struct {
2288 struct shash_desc shash;
2289 char ctx[4];
2290 } desc;
2291
2292 BUG_ON(crypto_shash_descsize(sbi->s_chksum_driver)!=sizeof(desc.ctx));
2293
2294 desc.shash.tfm = sbi->s_chksum_driver;
2295 *(u32 *)desc.ctx = crc;
2296
2297 BUG_ON(crypto_shash_update(&desc.shash, address, length));
2298
2299 return *(u32 *)desc.ctx;
2300}
2301
2302#ifdef __KERNEL__
2303
2304
2305struct dx_hash_info
2306{
2307 u32 hash;
2308 u32 minor_hash;
2309 int hash_version;
2310 u32 *seed;
2311};
2312
2313
2314
2315#define EXT4_HTREE_EOF_32BIT ((1UL << (32 - 1)) - 1)
2316#define EXT4_HTREE_EOF_64BIT ((1ULL << (64 - 1)) - 1)
2317
2318
2319
2320
2321
2322#define HASH_NB_ALWAYS 1
2323
2324struct ext4_filename {
2325 const struct qstr *usr_fname;
2326 struct fscrypt_str disk_name;
2327 struct dx_hash_info hinfo;
2328#ifdef CONFIG_FS_ENCRYPTION
2329 struct fscrypt_str crypto_buf;
2330#endif
2331#ifdef CONFIG_UNICODE
2332 struct fscrypt_str cf_name;
2333#endif
2334};
2335
2336#define fname_name(p) ((p)->disk_name.name)
2337#define fname_len(p) ((p)->disk_name.len)
2338
2339
2340
2341
2342struct ext4_iloc
2343{
2344 struct buffer_head *bh;
2345 unsigned long offset;
2346 ext4_group_t block_group;
2347};
2348
2349static inline struct ext4_inode *ext4_raw_inode(struct ext4_iloc *iloc)
2350{
2351 return (struct ext4_inode *) (iloc->bh->b_data + iloc->offset);
2352}
2353
2354static inline bool ext4_is_quota_file(struct inode *inode)
2355{
2356 return IS_NOQUOTA(inode) &&
2357 !(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL);
2358}
2359
2360
2361
2362
2363
2364
2365struct dir_private_info {
2366 struct rb_root root;
2367 struct rb_node *curr_node;
2368 struct fname *extra_fname;
2369 loff_t last_pos;
2370 __u32 curr_hash;
2371 __u32 curr_minor_hash;
2372 __u32 next_hash;
2373};
2374
2375
2376static inline ext4_fsblk_t
2377ext4_group_first_block_no(struct super_block *sb, ext4_group_t group_no)
2378{
2379 return group_no * (ext4_fsblk_t)EXT4_BLOCKS_PER_GROUP(sb) +
2380 le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block);
2381}
2382
2383
2384
2385
2386#define ERR_BAD_DX_DIR (-(MAX_ERRNO - 1))
2387
2388
2389#define EXT4_HTREE_LEVEL_COMPAT 2
2390#define EXT4_HTREE_LEVEL 3
2391
2392static inline int ext4_dir_htree_level(struct super_block *sb)
2393{
2394 return ext4_has_feature_largedir(sb) ?
2395 EXT4_HTREE_LEVEL : EXT4_HTREE_LEVEL_COMPAT;
2396}
2397
2398
2399
2400
2401#define EXT4_DEF_LI_WAIT_MULT 10
2402#define EXT4_DEF_LI_MAX_START_DELAY 5
2403#define EXT4_LAZYINIT_QUIT 0x0001
2404#define EXT4_LAZYINIT_RUNNING 0x0002
2405
2406
2407
2408
2409struct ext4_lazy_init {
2410 unsigned long li_state;
2411 struct list_head li_request_list;
2412 struct mutex li_list_mtx;
2413};
2414
2415enum ext4_li_mode {
2416 EXT4_LI_MODE_PREFETCH_BBITMAP,
2417 EXT4_LI_MODE_ITABLE,
2418};
2419
2420struct ext4_li_request {
2421 struct super_block *lr_super;
2422 enum ext4_li_mode lr_mode;
2423 ext4_group_t lr_first_not_zeroed;
2424 ext4_group_t lr_next_group;
2425 struct list_head lr_request;
2426 unsigned long lr_next_sched;
2427 unsigned long lr_timeout;
2428};
2429
2430struct ext4_features {
2431 struct kobject f_kobj;
2432 struct completion f_kobj_unregister;
2433};
2434
2435
2436
2437
2438
2439
2440
2441
2442#define EXT4_MMP_MAGIC 0x004D4D50U
2443#define EXT4_MMP_SEQ_CLEAN 0xFF4D4D50U
2444#define EXT4_MMP_SEQ_FSCK 0xE24D4D50U
2445#define EXT4_MMP_SEQ_MAX 0xE24D4D4FU
2446
2447struct mmp_struct {
2448 __le32 mmp_magic;
2449 __le32 mmp_seq;
2450
2451
2452
2453
2454
2455 __le64 mmp_time;
2456 char mmp_nodename[64];
2457 char mmp_bdevname[32];
2458
2459
2460
2461
2462
2463
2464 __le16 mmp_check_interval;
2465
2466 __le16 mmp_pad1;
2467 __le32 mmp_pad2[226];
2468 __le32 mmp_checksum;
2469};
2470
2471
2472struct mmpd_data {
2473 struct buffer_head *bh;
2474 struct super_block *sb;
2475};
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485#define EXT4_MMP_CHECK_MULT 2UL
2486
2487
2488
2489
2490#define EXT4_MMP_MIN_CHECK_INTERVAL 5UL
2491
2492
2493
2494
2495#define EXT4_MMP_MAX_CHECK_INTERVAL 300UL
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505# define NORET_TYPE
2506# define ATTRIB_NORET __attribute__((noreturn))
2507# define NORET_AND noreturn,
2508
2509
2510extern unsigned int ext4_count_free(char *bitmap, unsigned numchars);
2511void ext4_inode_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
2512 struct ext4_group_desc *gdp,
2513 struct buffer_head *bh, int sz);
2514int ext4_inode_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
2515 struct ext4_group_desc *gdp,
2516 struct buffer_head *bh, int sz);
2517void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
2518 struct ext4_group_desc *gdp,
2519 struct buffer_head *bh);
2520int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
2521 struct ext4_group_desc *gdp,
2522 struct buffer_head *bh);
2523
2524
2525extern void ext4_get_group_no_and_offset(struct super_block *sb,
2526 ext4_fsblk_t blocknr,
2527 ext4_group_t *blockgrpp,
2528 ext4_grpblk_t *offsetp);
2529extern ext4_group_t ext4_get_group_number(struct super_block *sb,
2530 ext4_fsblk_t block);
2531
2532extern unsigned int ext4_block_group(struct super_block *sb,
2533 ext4_fsblk_t blocknr);
2534extern ext4_grpblk_t ext4_block_group_offset(struct super_block *sb,
2535 ext4_fsblk_t blocknr);
2536extern int ext4_bg_has_super(struct super_block *sb, ext4_group_t group);
2537extern unsigned long ext4_bg_num_gdb(struct super_block *sb,
2538 ext4_group_t group);
2539extern ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
2540 ext4_fsblk_t goal,
2541 unsigned int flags,
2542 unsigned long *count,
2543 int *errp);
2544extern int ext4_claim_free_clusters(struct ext4_sb_info *sbi,
2545 s64 nclusters, unsigned int flags);
2546extern ext4_fsblk_t ext4_count_free_clusters(struct super_block *);
2547extern void ext4_check_blocks_bitmap(struct super_block *);
2548extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
2549 ext4_group_t block_group,
2550 struct buffer_head ** bh);
2551extern int ext4_should_retry_alloc(struct super_block *sb, int *retries);
2552
2553extern struct buffer_head *ext4_read_block_bitmap_nowait(struct super_block *sb,
2554 ext4_group_t block_group,
2555 bool ignore_locked);
2556extern int ext4_wait_block_bitmap(struct super_block *sb,
2557 ext4_group_t block_group,
2558 struct buffer_head *bh);
2559extern struct buffer_head *ext4_read_block_bitmap(struct super_block *sb,
2560 ext4_group_t block_group);
2561extern unsigned ext4_free_clusters_after_init(struct super_block *sb,
2562 ext4_group_t block_group,
2563 struct ext4_group_desc *gdp);
2564ext4_fsblk_t ext4_inode_to_goal_block(struct inode *);
2565
2566#ifdef CONFIG_UNICODE
2567extern void ext4_fname_setup_ci_filename(struct inode *dir,
2568 const struct qstr *iname,
2569 struct fscrypt_str *fname);
2570#endif
2571
2572#ifdef CONFIG_FS_ENCRYPTION
2573static inline void ext4_fname_from_fscrypt_name(struct ext4_filename *dst,
2574 const struct fscrypt_name *src)
2575{
2576 memset(dst, 0, sizeof(*dst));
2577
2578 dst->usr_fname = src->usr_fname;
2579 dst->disk_name = src->disk_name;
2580 dst->hinfo.hash = src->hash;
2581 dst->hinfo.minor_hash = src->minor_hash;
2582 dst->crypto_buf = src->crypto_buf;
2583}
2584
2585static inline int ext4_fname_setup_filename(struct inode *dir,
2586 const struct qstr *iname,
2587 int lookup,
2588 struct ext4_filename *fname)
2589{
2590 struct fscrypt_name name;
2591 int err;
2592
2593 err = fscrypt_setup_filename(dir, iname, lookup, &name);
2594 if (err)
2595 return err;
2596
2597 ext4_fname_from_fscrypt_name(fname, &name);
2598
2599#ifdef CONFIG_UNICODE
2600 ext4_fname_setup_ci_filename(dir, iname, &fname->cf_name);
2601#endif
2602 return 0;
2603}
2604
2605static inline int ext4_fname_prepare_lookup(struct inode *dir,
2606 struct dentry *dentry,
2607 struct ext4_filename *fname)
2608{
2609 struct fscrypt_name name;
2610 int err;
2611
2612 err = fscrypt_prepare_lookup(dir, dentry, &name);
2613 if (err)
2614 return err;
2615
2616 ext4_fname_from_fscrypt_name(fname, &name);
2617
2618#ifdef CONFIG_UNICODE
2619 ext4_fname_setup_ci_filename(dir, &dentry->d_name, &fname->cf_name);
2620#endif
2621 return 0;
2622}
2623
2624static inline void ext4_fname_free_filename(struct ext4_filename *fname)
2625{
2626 struct fscrypt_name name;
2627
2628 name.crypto_buf = fname->crypto_buf;
2629 fscrypt_free_filename(&name);
2630
2631 fname->crypto_buf.name = NULL;
2632 fname->usr_fname = NULL;
2633 fname->disk_name.name = NULL;
2634
2635#ifdef CONFIG_UNICODE
2636 kfree(fname->cf_name.name);
2637 fname->cf_name.name = NULL;
2638#endif
2639}
2640#else
2641static inline int ext4_fname_setup_filename(struct inode *dir,
2642 const struct qstr *iname,
2643 int lookup,
2644 struct ext4_filename *fname)
2645{
2646 fname->usr_fname = iname;
2647 fname->disk_name.name = (unsigned char *) iname->name;
2648 fname->disk_name.len = iname->len;
2649
2650#ifdef CONFIG_UNICODE
2651 ext4_fname_setup_ci_filename(dir, iname, &fname->cf_name);
2652#endif
2653
2654 return 0;
2655}
2656
2657static inline int ext4_fname_prepare_lookup(struct inode *dir,
2658 struct dentry *dentry,
2659 struct ext4_filename *fname)
2660{
2661 return ext4_fname_setup_filename(dir, &dentry->d_name, 1, fname);
2662}
2663
2664static inline void ext4_fname_free_filename(struct ext4_filename *fname)
2665{
2666#ifdef CONFIG_UNICODE
2667 kfree(fname->cf_name.name);
2668 fname->cf_name.name = NULL;
2669#endif
2670}
2671#endif
2672
2673
2674extern int __ext4_check_dir_entry(const char *, unsigned int, struct inode *,
2675 struct file *,
2676 struct ext4_dir_entry_2 *,
2677 struct buffer_head *, char *, int,
2678 unsigned int);
2679#define ext4_check_dir_entry(dir, filp, de, bh, buf, size, offset) \
2680 unlikely(__ext4_check_dir_entry(__func__, __LINE__, (dir), (filp), \
2681 (de), (bh), (buf), (size), (offset)))
2682extern int ext4_htree_store_dirent(struct file *dir_file, __u32 hash,
2683 __u32 minor_hash,
2684 struct ext4_dir_entry_2 *dirent,
2685 struct fscrypt_str *ent_name);
2686extern void ext4_htree_free_dir_info(struct dir_private_info *p);
2687extern int ext4_find_dest_de(struct inode *dir, struct inode *inode,
2688 struct buffer_head *bh,
2689 void *buf, int buf_size,
2690 struct ext4_filename *fname,
2691 struct ext4_dir_entry_2 **dest_de);
2692void ext4_insert_dentry(struct inode *inode,
2693 struct ext4_dir_entry_2 *de,
2694 int buf_size,
2695 struct ext4_filename *fname);
2696static inline void ext4_update_dx_flag(struct inode *inode)
2697{
2698 if (!ext4_has_feature_dir_index(inode->i_sb) &&
2699 ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) {
2700
2701 WARN_ON_ONCE(ext4_has_feature_metadata_csum(inode->i_sb));
2702 ext4_clear_inode_flag(inode, EXT4_INODE_INDEX);
2703 }
2704}
2705static const unsigned char ext4_filetype_table[] = {
2706 DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK
2707};
2708
2709static inline unsigned char get_dtype(struct super_block *sb, int filetype)
2710{
2711 if (!ext4_has_feature_filetype(sb) || filetype >= EXT4_FT_MAX)
2712 return DT_UNKNOWN;
2713
2714 return ext4_filetype_table[filetype];
2715}
2716extern int ext4_check_all_de(struct inode *dir, struct buffer_head *bh,
2717 void *buf, int buf_size);
2718
2719
2720extern int ext4_sync_file(struct file *, loff_t, loff_t, int);
2721
2722
2723extern int ext4fs_dirhash(const struct inode *dir, const char *name, int len,
2724 struct dx_hash_info *hinfo);
2725
2726
2727extern int ext4_mark_inode_used(struct super_block *sb, int ino);
2728extern struct inode *__ext4_new_inode(handle_t *, struct inode *, umode_t,
2729 const struct qstr *qstr, __u32 goal,
2730 uid_t *owner, __u32 i_flags,
2731 int handle_type, unsigned int line_no,
2732 int nblocks);
2733
2734#define ext4_new_inode(handle, dir, mode, qstr, goal, owner, i_flags) \
2735 __ext4_new_inode((handle), (dir), (mode), (qstr), (goal), (owner), \
2736 i_flags, 0, 0, 0)
2737#define ext4_new_inode_start_handle(dir, mode, qstr, goal, owner, \
2738 type, nblocks) \
2739 __ext4_new_inode(NULL, (dir), (mode), (qstr), (goal), (owner), \
2740 0, (type), __LINE__, (nblocks))
2741
2742
2743extern void ext4_free_inode(handle_t *, struct inode *);
2744extern struct inode * ext4_orphan_get(struct super_block *, unsigned long);
2745extern unsigned long ext4_count_free_inodes(struct super_block *);
2746extern unsigned long ext4_count_dirs(struct super_block *);
2747extern void ext4_check_inodes_bitmap(struct super_block *);
2748extern void ext4_mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
2749extern int ext4_init_inode_table(struct super_block *sb,
2750 ext4_group_t group, int barrier);
2751extern void ext4_end_bitmap_read(struct buffer_head *bh, int uptodate);
2752
2753
2754int ext4_fc_info_show(struct seq_file *seq, void *v);
2755void ext4_fc_init(struct super_block *sb, journal_t *journal);
2756void ext4_fc_init_inode(struct inode *inode);
2757void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t start,
2758 ext4_lblk_t end);
2759void __ext4_fc_track_unlink(handle_t *handle, struct inode *inode,
2760 struct dentry *dentry);
2761void __ext4_fc_track_link(handle_t *handle, struct inode *inode,
2762 struct dentry *dentry);
2763void ext4_fc_track_unlink(handle_t *handle, struct dentry *dentry);
2764void ext4_fc_track_link(handle_t *handle, struct dentry *dentry);
2765void ext4_fc_track_create(handle_t *handle, struct dentry *dentry);
2766void ext4_fc_track_inode(handle_t *handle, struct inode *inode);
2767void ext4_fc_mark_ineligible(struct super_block *sb, int reason);
2768void ext4_fc_start_ineligible(struct super_block *sb, int reason);
2769void ext4_fc_stop_ineligible(struct super_block *sb);
2770void ext4_fc_start_update(struct inode *inode);
2771void ext4_fc_stop_update(struct inode *inode);
2772void ext4_fc_del(struct inode *inode);
2773bool ext4_fc_replay_check_excluded(struct super_block *sb, ext4_fsblk_t block);
2774void ext4_fc_replay_cleanup(struct super_block *sb);
2775int ext4_fc_commit(journal_t *journal, tid_t commit_tid);
2776int __init ext4_fc_init_dentry_cache(void);
2777
2778
2779extern const struct seq_operations ext4_mb_seq_groups_ops;
2780extern long ext4_mb_stats;
2781extern long ext4_mb_max_to_scan;
2782extern int ext4_mb_init(struct super_block *);
2783extern int ext4_mb_release(struct super_block *);
2784extern ext4_fsblk_t ext4_mb_new_blocks(handle_t *,
2785 struct ext4_allocation_request *, int *);
2786extern int ext4_mb_reserve_blocks(struct super_block *, int);
2787extern void ext4_discard_preallocations(struct inode *, unsigned int);
2788extern int __init ext4_init_mballoc(void);
2789extern void ext4_exit_mballoc(void);
2790extern ext4_group_t ext4_mb_prefetch(struct super_block *sb,
2791 ext4_group_t group,
2792 unsigned int nr, int *cnt);
2793extern void ext4_mb_prefetch_fini(struct super_block *sb, ext4_group_t group,
2794 unsigned int nr);
2795
2796extern void ext4_free_blocks(handle_t *handle, struct inode *inode,
2797 struct buffer_head *bh, ext4_fsblk_t block,
2798 unsigned long count, int flags);
2799extern int ext4_mb_alloc_groupinfo(struct super_block *sb,
2800 ext4_group_t ngroups);
2801extern int ext4_mb_add_groupinfo(struct super_block *sb,
2802 ext4_group_t i, struct ext4_group_desc *desc);
2803extern int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
2804 ext4_fsblk_t block, unsigned long count);
2805extern int ext4_trim_fs(struct super_block *, struct fstrim_range *);
2806extern void ext4_process_freed_data(struct super_block *sb, tid_t commit_tid);
2807extern void ext4_mb_mark_bb(struct super_block *sb, ext4_fsblk_t block,
2808 int len, int state);
2809
2810
2811void ext4_inode_csum_set(struct inode *inode, struct ext4_inode *raw,
2812 struct ext4_inode_info *ei);
2813int ext4_inode_is_fast_symlink(struct inode *inode);
2814struct buffer_head *ext4_getblk(handle_t *, struct inode *, ext4_lblk_t, int);
2815struct buffer_head *ext4_bread(handle_t *, struct inode *, ext4_lblk_t, int);
2816int ext4_bread_batch(struct inode *inode, ext4_lblk_t block, int bh_count,
2817 bool wait, struct buffer_head **bhs);
2818int ext4_get_block_unwritten(struct inode *inode, sector_t iblock,
2819 struct buffer_head *bh_result, int create);
2820int ext4_get_block(struct inode *inode, sector_t iblock,
2821 struct buffer_head *bh_result, int create);
2822int ext4_da_get_block_prep(struct inode *inode, sector_t iblock,
2823 struct buffer_head *bh, int create);
2824int ext4_walk_page_buffers(handle_t *handle,
2825 struct buffer_head *head,
2826 unsigned from,
2827 unsigned to,
2828 int *partial,
2829 int (*fn)(handle_t *handle,
2830 struct buffer_head *bh));
2831int do_journal_get_write_access(handle_t *handle,
2832 struct buffer_head *bh);
2833#define FALL_BACK_TO_NONDELALLOC 1
2834#define CONVERT_INLINE_DATA 2
2835
2836typedef enum {
2837 EXT4_IGET_NORMAL = 0,
2838 EXT4_IGET_SPECIAL = 0x0001,
2839 EXT4_IGET_HANDLE = 0x0002
2840} ext4_iget_flags;
2841
2842extern struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
2843 ext4_iget_flags flags, const char *function,
2844 unsigned int line);
2845
2846#define ext4_iget(sb, ino, flags) \
2847 __ext4_iget((sb), (ino), (flags), __func__, __LINE__)
2848
2849extern int ext4_write_inode(struct inode *, struct writeback_control *);
2850extern int ext4_setattr(struct dentry *, struct iattr *);
2851extern int ext4_getattr(const struct path *, struct kstat *, u32, unsigned int);
2852extern void ext4_evict_inode(struct inode *);
2853extern void ext4_clear_inode(struct inode *);
2854extern int ext4_file_getattr(const struct path *, struct kstat *, u32, unsigned int);
2855extern int ext4_sync_inode(handle_t *, struct inode *);
2856extern void ext4_dirty_inode(struct inode *, int);
2857extern int ext4_change_inode_journal_flag(struct inode *, int);
2858extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *);
2859extern int ext4_get_fc_inode_loc(struct super_block *sb, unsigned long ino,
2860 struct ext4_iloc *iloc);
2861extern int ext4_inode_attach_jinode(struct inode *inode);
2862extern int ext4_can_truncate(struct inode *inode);
2863extern int ext4_truncate(struct inode *);
2864extern int ext4_break_layouts(struct inode *);
2865extern int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length);
2866extern void ext4_set_inode_flags(struct inode *, bool init);
2867extern int ext4_alloc_da_blocks(struct inode *inode);
2868extern void ext4_set_aops(struct inode *inode);
2869extern int ext4_writepage_trans_blocks(struct inode *);
2870extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks);
2871extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
2872 loff_t lstart, loff_t lend);
2873extern vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf);
2874extern vm_fault_t ext4_filemap_fault(struct vm_fault *vmf);
2875extern qsize_t *ext4_get_reserved_space(struct inode *inode);
2876extern int ext4_get_projid(struct inode *inode, kprojid_t *projid);
2877extern void ext4_da_release_space(struct inode *inode, int to_free);
2878extern void ext4_da_update_reserve_space(struct inode *inode,
2879 int used, int quota_claim);
2880extern int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk,
2881 ext4_fsblk_t pblk, ext4_lblk_t len);
2882
2883
2884extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
2885 struct ext4_map_blocks *map, int flags);
2886extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks);
2887extern void ext4_ind_truncate(handle_t *, struct inode *inode);
2888extern int ext4_ind_remove_space(handle_t *handle, struct inode *inode,
2889 ext4_lblk_t start, ext4_lblk_t end);
2890
2891
2892extern long ext4_ioctl(struct file *, unsigned int, unsigned long);
2893extern long ext4_compat_ioctl(struct file *, unsigned int, unsigned long);
2894extern void ext4_reset_inode_seed(struct inode *inode);
2895
2896
2897extern int ext4_ext_migrate(struct inode *);
2898extern int ext4_ind_migrate(struct inode *inode);
2899
2900
2901extern int ext4_init_new_dir(handle_t *handle, struct inode *dir,
2902 struct inode *inode);
2903extern int ext4_dirblock_csum_verify(struct inode *inode,
2904 struct buffer_head *bh);
2905extern int ext4_orphan_add(handle_t *, struct inode *);
2906extern int ext4_orphan_del(handle_t *, struct inode *);
2907extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
2908 __u32 start_minor_hash, __u32 *next_hash);
2909extern int ext4_search_dir(struct buffer_head *bh,
2910 char *search_buf,
2911 int buf_size,
2912 struct inode *dir,
2913 struct ext4_filename *fname,
2914 unsigned int offset,
2915 struct ext4_dir_entry_2 **res_dir);
2916extern int ext4_generic_delete_entry(struct inode *dir,
2917 struct ext4_dir_entry_2 *de_del,
2918 struct buffer_head *bh,
2919 void *entry_buf,
2920 int buf_size,
2921 int csum_size);
2922extern bool ext4_empty_dir(struct inode *inode);
2923
2924
2925extern void ext4_kvfree_array_rcu(void *to_free);
2926extern int ext4_group_add(struct super_block *sb,
2927 struct ext4_new_group_data *input);
2928extern int ext4_group_extend(struct super_block *sb,
2929 struct ext4_super_block *es,
2930 ext4_fsblk_t n_blocks_count);
2931extern int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count);
2932
2933
2934extern struct buffer_head *ext4_sb_bread(struct super_block *sb,
2935 sector_t block, int op_flags);
2936extern struct buffer_head *ext4_sb_bread_unmovable(struct super_block *sb,
2937 sector_t block);
2938extern void ext4_read_bh_nowait(struct buffer_head *bh, int op_flags,
2939 bh_end_io_t *end_io);
2940extern int ext4_read_bh(struct buffer_head *bh, int op_flags,
2941 bh_end_io_t *end_io);
2942extern int ext4_read_bh_lock(struct buffer_head *bh, int op_flags, bool wait);
2943extern void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block);
2944extern int ext4_seq_options_show(struct seq_file *seq, void *offset);
2945extern int ext4_calculate_overhead(struct super_block *sb);
2946extern void ext4_superblock_csum_set(struct super_block *sb);
2947extern int ext4_alloc_flex_bg_array(struct super_block *sb,
2948 ext4_group_t ngroup);
2949extern const char *ext4_decode_error(struct super_block *sb, int errno,
2950 char nbuf[16]);
2951extern void ext4_mark_group_bitmap_corrupted(struct super_block *sb,
2952 ext4_group_t block_group,
2953 unsigned int flags);
2954
2955extern __printf(6, 7)
2956void __ext4_error(struct super_block *, const char *, unsigned int, int, __u64,
2957 const char *, ...);
2958extern __printf(6, 7)
2959void __ext4_error_inode(struct inode *, const char *, unsigned int,
2960 ext4_fsblk_t, int, const char *, ...);
2961extern __printf(5, 6)
2962void __ext4_error_file(struct file *, const char *, unsigned int, ext4_fsblk_t,
2963 const char *, ...);
2964extern void __ext4_std_error(struct super_block *, const char *,
2965 unsigned int, int);
2966extern __printf(5, 6)
2967void __ext4_abort(struct super_block *, const char *, unsigned int, int,
2968 const char *, ...);
2969extern __printf(4, 5)
2970void __ext4_warning(struct super_block *, const char *, unsigned int,
2971 const char *, ...);
2972extern __printf(4, 5)
2973void __ext4_warning_inode(const struct inode *inode, const char *function,
2974 unsigned int line, const char *fmt, ...);
2975extern __printf(3, 4)
2976void __ext4_msg(struct super_block *, const char *, const char *, ...);
2977extern void __dump_mmp_msg(struct super_block *, struct mmp_struct *mmp,
2978 const char *, unsigned int, const char *);
2979extern __printf(7, 8)
2980void __ext4_grp_locked_error(const char *, unsigned int,
2981 struct super_block *, ext4_group_t,
2982 unsigned long, ext4_fsblk_t,
2983 const char *, ...);
2984
2985#define EXT4_ERROR_INODE(inode, fmt, a...) \
2986 ext4_error_inode((inode), __func__, __LINE__, 0, (fmt), ## a)
2987
2988#define EXT4_ERROR_INODE_ERR(inode, err, fmt, a...) \
2989 __ext4_error_inode((inode), __func__, __LINE__, 0, (err), (fmt), ## a)
2990
2991#define ext4_error_inode_block(inode, block, err, fmt, a...) \
2992 __ext4_error_inode((inode), __func__, __LINE__, (block), (err), \
2993 (fmt), ## a)
2994
2995#define EXT4_ERROR_FILE(file, block, fmt, a...) \
2996 ext4_error_file((file), __func__, __LINE__, (block), (fmt), ## a)
2997
2998#ifdef CONFIG_PRINTK
2999
3000#define ext4_error_inode(inode, func, line, block, fmt, ...) \
3001 __ext4_error_inode(inode, func, line, block, 0, fmt, ##__VA_ARGS__)
3002#define ext4_error_inode_err(inode, func, line, block, err, fmt, ...) \
3003 __ext4_error_inode((inode), (func), (line), (block), \
3004 (err), (fmt), ##__VA_ARGS__)
3005#define ext4_error_file(file, func, line, block, fmt, ...) \
3006 __ext4_error_file(file, func, line, block, fmt, ##__VA_ARGS__)
3007#define ext4_error(sb, fmt, ...) \
3008 __ext4_error((sb), __func__, __LINE__, 0, 0, (fmt), ##__VA_ARGS__)
3009#define ext4_error_err(sb, err, fmt, ...) \
3010 __ext4_error((sb), __func__, __LINE__, (err), 0, (fmt), ##__VA_ARGS__)
3011#define ext4_abort(sb, err, fmt, ...) \
3012 __ext4_abort((sb), __func__, __LINE__, (err), (fmt), ##__VA_ARGS__)
3013#define ext4_warning(sb, fmt, ...) \
3014 __ext4_warning(sb, __func__, __LINE__, fmt, ##__VA_ARGS__)
3015#define ext4_warning_inode(inode, fmt, ...) \
3016 __ext4_warning_inode(inode, __func__, __LINE__, fmt, ##__VA_ARGS__)
3017#define ext4_msg(sb, level, fmt, ...) \
3018 __ext4_msg(sb, level, fmt, ##__VA_ARGS__)
3019#define dump_mmp_msg(sb, mmp, msg) \
3020 __dump_mmp_msg(sb, mmp, __func__, __LINE__, msg)
3021#define ext4_grp_locked_error(sb, grp, ino, block, fmt, ...) \
3022 __ext4_grp_locked_error(__func__, __LINE__, sb, grp, ino, block, \
3023 fmt, ##__VA_ARGS__)
3024
3025#else
3026
3027#define ext4_error_inode(inode, func, line, block, fmt, ...) \
3028do { \
3029 no_printk(fmt, ##__VA_ARGS__); \
3030 __ext4_error_inode(inode, "", 0, block, 0, " "); \
3031} while (0)
3032#define ext4_error_inode_err(inode, func, line, block, err, fmt, ...) \
3033do { \
3034 no_printk(fmt, ##__VA_ARGS__); \
3035 __ext4_error_inode(inode, "", 0, block, err, " "); \
3036} while (0)
3037#define ext4_error_file(file, func, line, block, fmt, ...) \
3038do { \
3039 no_printk(fmt, ##__VA_ARGS__); \
3040 __ext4_error_file(file, "", 0, block, " "); \
3041} while (0)
3042#define ext4_error(sb, fmt, ...) \
3043do { \
3044 no_printk(fmt, ##__VA_ARGS__); \
3045 __ext4_error(sb, "", 0, 0, 0, " "); \
3046} while (0)
3047#define ext4_error_err(sb, err, fmt, ...) \
3048do { \
3049 no_printk(fmt, ##__VA_ARGS__); \
3050 __ext4_error(sb, "", 0, err, 0, " "); \
3051} while (0)
3052#define ext4_abort(sb, err, fmt, ...) \
3053do { \
3054 no_printk(fmt, ##__VA_ARGS__); \
3055 __ext4_abort(sb, "", 0, err, " "); \
3056} while (0)
3057#define ext4_warning(sb, fmt, ...) \
3058do { \
3059 no_printk(fmt, ##__VA_ARGS__); \
3060 __ext4_warning(sb, "", 0, " "); \
3061} while (0)
3062#define ext4_warning_inode(inode, fmt, ...) \
3063do { \
3064 no_printk(fmt, ##__VA_ARGS__); \
3065 __ext4_warning_inode(inode, "", 0, " "); \
3066} while (0)
3067#define ext4_msg(sb, level, fmt, ...) \
3068do { \
3069 no_printk(fmt, ##__VA_ARGS__); \
3070 __ext4_msg(sb, "", " "); \
3071} while (0)
3072#define dump_mmp_msg(sb, mmp, msg) \
3073 __dump_mmp_msg(sb, mmp, "", 0, "")
3074#define ext4_grp_locked_error(sb, grp, ino, block, fmt, ...) \
3075do { \
3076 no_printk(fmt, ##__VA_ARGS__); \
3077 __ext4_grp_locked_error("", 0, sb, grp, ino, block, " "); \
3078} while (0)
3079
3080#endif
3081
3082extern ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
3083 struct ext4_group_desc *bg);
3084extern ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb,
3085 struct ext4_group_desc *bg);
3086extern ext4_fsblk_t ext4_inode_table(struct super_block *sb,
3087 struct ext4_group_desc *bg);
3088extern __u32 ext4_free_group_clusters(struct super_block *sb,
3089 struct ext4_group_desc *bg);
3090extern __u32 ext4_free_inodes_count(struct super_block *sb,
3091 struct ext4_group_desc *bg);
3092extern __u32 ext4_used_dirs_count(struct super_block *sb,
3093 struct ext4_group_desc *bg);
3094extern __u32 ext4_itable_unused_count(struct super_block *sb,
3095 struct ext4_group_desc *bg);
3096extern void ext4_block_bitmap_set(struct super_block *sb,
3097 struct ext4_group_desc *bg, ext4_fsblk_t blk);
3098extern void ext4_inode_bitmap_set(struct super_block *sb,
3099 struct ext4_group_desc *bg, ext4_fsblk_t blk);
3100extern void ext4_inode_table_set(struct super_block *sb,
3101 struct ext4_group_desc *bg, ext4_fsblk_t blk);
3102extern void ext4_free_group_clusters_set(struct super_block *sb,
3103 struct ext4_group_desc *bg,
3104 __u32 count);
3105extern void ext4_free_inodes_set(struct super_block *sb,
3106 struct ext4_group_desc *bg, __u32 count);
3107extern void ext4_used_dirs_set(struct super_block *sb,
3108 struct ext4_group_desc *bg, __u32 count);
3109extern void ext4_itable_unused_set(struct super_block *sb,
3110 struct ext4_group_desc *bg, __u32 count);
3111extern int ext4_group_desc_csum_verify(struct super_block *sb, __u32 group,
3112 struct ext4_group_desc *gdp);
3113extern void ext4_group_desc_csum_set(struct super_block *sb, __u32 group,
3114 struct ext4_group_desc *gdp);
3115extern int ext4_register_li_request(struct super_block *sb,
3116 ext4_group_t first_not_zeroed);
3117
3118static inline int ext4_has_metadata_csum(struct super_block *sb)
3119{
3120 WARN_ON_ONCE(ext4_has_feature_metadata_csum(sb) &&
3121 !EXT4_SB(sb)->s_chksum_driver);
3122
3123 return ext4_has_feature_metadata_csum(sb) &&
3124 (EXT4_SB(sb)->s_chksum_driver != NULL);
3125}
3126
3127static inline int ext4_has_group_desc_csum(struct super_block *sb)
3128{
3129 return ext4_has_feature_gdt_csum(sb) || ext4_has_metadata_csum(sb);
3130}
3131
3132#define ext4_read_incompat_64bit_val(es, name) \
3133 (((es)->s_feature_incompat & cpu_to_le32(EXT4_FEATURE_INCOMPAT_64BIT) \
3134 ? (ext4_fsblk_t)le32_to_cpu(es->name##_hi) << 32 : 0) | \
3135 le32_to_cpu(es->name##_lo))
3136
3137static inline ext4_fsblk_t ext4_blocks_count(struct ext4_super_block *es)
3138{
3139 return ext4_read_incompat_64bit_val(es, s_blocks_count);
3140}
3141
3142static inline ext4_fsblk_t ext4_r_blocks_count(struct ext4_super_block *es)
3143{
3144 return ext4_read_incompat_64bit_val(es, s_r_blocks_count);
3145}
3146
3147static inline ext4_fsblk_t ext4_free_blocks_count(struct ext4_super_block *es)
3148{
3149 return ext4_read_incompat_64bit_val(es, s_free_blocks_count);
3150}
3151
3152static inline void ext4_blocks_count_set(struct ext4_super_block *es,
3153 ext4_fsblk_t blk)
3154{
3155 es->s_blocks_count_lo = cpu_to_le32((u32)blk);
3156 es->s_blocks_count_hi = cpu_to_le32(blk >> 32);
3157}
3158
3159static inline void ext4_free_blocks_count_set(struct ext4_super_block *es,
3160 ext4_fsblk_t blk)
3161{
3162 es->s_free_blocks_count_lo = cpu_to_le32((u32)blk);
3163 es->s_free_blocks_count_hi = cpu_to_le32(blk >> 32);
3164}
3165
3166static inline void ext4_r_blocks_count_set(struct ext4_super_block *es,
3167 ext4_fsblk_t blk)
3168{
3169 es->s_r_blocks_count_lo = cpu_to_le32((u32)blk);
3170 es->s_r_blocks_count_hi = cpu_to_le32(blk >> 32);
3171}
3172
3173static inline loff_t ext4_isize(struct super_block *sb,
3174 struct ext4_inode *raw_inode)
3175{
3176 if (ext4_has_feature_largedir(sb) ||
3177 S_ISREG(le16_to_cpu(raw_inode->i_mode)))
3178 return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
3179 le32_to_cpu(raw_inode->i_size_lo);
3180
3181 return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
3182}
3183
3184static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
3185{
3186 raw_inode->i_size_lo = cpu_to_le32(i_size);
3187 raw_inode->i_size_high = cpu_to_le32(i_size >> 32);
3188}
3189
3190static inline
3191struct ext4_group_info *ext4_get_group_info(struct super_block *sb,
3192 ext4_group_t group)
3193{
3194 struct ext4_group_info **grp_info;
3195 long indexv, indexh;
3196 BUG_ON(group >= EXT4_SB(sb)->s_groups_count);
3197 indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb));
3198 indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1);
3199 grp_info = sbi_array_rcu_deref(EXT4_SB(sb), s_group_info, indexv);
3200 return grp_info[indexh];
3201}
3202
3203
3204
3205
3206
3207
3208static inline ext4_group_t ext4_get_groups_count(struct super_block *sb)
3209{
3210 ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
3211
3212 smp_rmb();
3213 return ngroups;
3214}
3215
3216static inline ext4_group_t ext4_flex_group(struct ext4_sb_info *sbi,
3217 ext4_group_t block_group)
3218{
3219 return block_group >> sbi->s_log_groups_per_flex;
3220}
3221
3222static inline unsigned int ext4_flex_bg_size(struct ext4_sb_info *sbi)
3223{
3224 return 1 << sbi->s_log_groups_per_flex;
3225}
3226
3227#define ext4_std_error(sb, errno) \
3228do { \
3229 if ((errno)) \
3230 __ext4_std_error((sb), __func__, __LINE__, (errno)); \
3231} while (0)
3232
3233#ifdef CONFIG_SMP
3234
3235
3236
3237
3238#define EXT4_FREECLUSTERS_WATERMARK (4 * (percpu_counter_batch * nr_cpu_ids))
3239#else
3240#define EXT4_FREECLUSTERS_WATERMARK 0
3241#endif
3242
3243
3244static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize)
3245{
3246 WARN_ON_ONCE(S_ISREG(inode->i_mode) &&
3247 !inode_is_locked(inode));
3248 down_write(&EXT4_I(inode)->i_data_sem);
3249 if (newsize > EXT4_I(inode)->i_disksize)
3250 WRITE_ONCE(EXT4_I(inode)->i_disksize, newsize);
3251 up_write(&EXT4_I(inode)->i_data_sem);
3252}
3253
3254
3255static inline int ext4_update_inode_size(struct inode *inode, loff_t newsize)
3256{
3257 int changed = 0;
3258
3259 if (newsize > inode->i_size) {
3260 i_size_write(inode, newsize);
3261 changed = 1;
3262 }
3263 if (newsize > EXT4_I(inode)->i_disksize) {
3264 ext4_update_i_disksize(inode, newsize);
3265 changed |= 2;
3266 }
3267 return changed;
3268}
3269
3270int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset,
3271 loff_t len);
3272
3273struct ext4_group_info {
3274 unsigned long bb_state;
3275#ifdef AGGRESSIVE_CHECK
3276 unsigned long bb_check_counter;
3277#endif
3278 struct rb_root bb_free_root;
3279 ext4_grpblk_t bb_first_free;
3280 ext4_grpblk_t bb_free;
3281 ext4_grpblk_t bb_fragments;
3282 ext4_grpblk_t bb_largest_free_order;
3283 struct list_head bb_prealloc_list;
3284#ifdef DOUBLE_CHECK
3285 void *bb_bitmap;
3286#endif
3287 struct rw_semaphore alloc_sem;
3288 ext4_grpblk_t bb_counters[];
3289
3290
3291
3292};
3293
3294#define EXT4_GROUP_INFO_NEED_INIT_BIT 0
3295#define EXT4_GROUP_INFO_WAS_TRIMMED_BIT 1
3296#define EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT 2
3297#define EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT 3
3298#define EXT4_GROUP_INFO_BBITMAP_CORRUPT \
3299 (1 << EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT)
3300#define EXT4_GROUP_INFO_IBITMAP_CORRUPT \
3301 (1 << EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT)
3302#define EXT4_GROUP_INFO_BBITMAP_READ_BIT 4
3303
3304#define EXT4_MB_GRP_NEED_INIT(grp) \
3305 (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state)))
3306#define EXT4_MB_GRP_BBITMAP_CORRUPT(grp) \
3307 (test_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &((grp)->bb_state)))
3308#define EXT4_MB_GRP_IBITMAP_CORRUPT(grp) \
3309 (test_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &((grp)->bb_state)))
3310
3311#define EXT4_MB_GRP_WAS_TRIMMED(grp) \
3312 (test_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state)))
3313#define EXT4_MB_GRP_SET_TRIMMED(grp) \
3314 (set_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state)))
3315#define EXT4_MB_GRP_CLEAR_TRIMMED(grp) \
3316 (clear_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state)))
3317#define EXT4_MB_GRP_TEST_AND_SET_READ(grp) \
3318 (test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state)))
3319
3320#define EXT4_MAX_CONTENTION 8
3321#define EXT4_CONTENTION_THRESHOLD 2
3322
3323static inline spinlock_t *ext4_group_lock_ptr(struct super_block *sb,
3324 ext4_group_t group)
3325{
3326 return bgl_lock_ptr(EXT4_SB(sb)->s_blockgroup_lock, group);
3327}
3328
3329
3330
3331
3332
3333static inline int ext4_fs_is_busy(struct ext4_sb_info *sbi)
3334{
3335 return (atomic_read(&sbi->s_lock_busy) > EXT4_CONTENTION_THRESHOLD);
3336}
3337
3338static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group)
3339{
3340 spinlock_t *lock = ext4_group_lock_ptr(sb, group);
3341 if (spin_trylock(lock))
3342
3343
3344
3345
3346 atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0);
3347 else {
3348
3349
3350
3351
3352 atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, 1,
3353 EXT4_MAX_CONTENTION);
3354 spin_lock(lock);
3355 }
3356}
3357
3358static inline void ext4_unlock_group(struct super_block *sb,
3359 ext4_group_t group)
3360{
3361 spin_unlock(ext4_group_lock_ptr(sb, group));
3362}
3363
3364
3365
3366
3367#define ext4_check_indirect_blockref(inode, bh) \
3368 ext4_check_blockref(__func__, __LINE__, inode, \
3369 (__le32 *)(bh)->b_data, \
3370 EXT4_ADDR_PER_BLOCK((inode)->i_sb))
3371
3372#define ext4_ind_check_inode(inode) \
3373 ext4_check_blockref(__func__, __LINE__, inode, \
3374 EXT4_I(inode)->i_data, \
3375 EXT4_NDIR_BLOCKS)
3376
3377
3378
3379
3380
3381
3382extern const struct file_operations ext4_dir_operations;
3383
3384#ifdef CONFIG_UNICODE
3385extern const struct dentry_operations ext4_dentry_ops;
3386#endif
3387
3388
3389extern const struct inode_operations ext4_file_inode_operations;
3390extern const struct file_operations ext4_file_operations;
3391extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin);
3392
3393
3394extern int ext4_get_max_inline_size(struct inode *inode);
3395extern int ext4_find_inline_data_nolock(struct inode *inode);
3396extern int ext4_init_inline_data(handle_t *handle, struct inode *inode,
3397 unsigned int len);
3398extern int ext4_destroy_inline_data(handle_t *handle, struct inode *inode);
3399
3400extern int ext4_readpage_inline(struct inode *inode, struct page *page);
3401extern int ext4_try_to_write_inline_data(struct address_space *mapping,
3402 struct inode *inode,
3403 loff_t pos, unsigned len,
3404 unsigned flags,
3405 struct page **pagep);
3406extern int ext4_write_inline_data_end(struct inode *inode,
3407 loff_t pos, unsigned len,
3408 unsigned copied,
3409 struct page *page);
3410extern struct buffer_head *
3411ext4_journalled_write_inline_data(struct inode *inode,
3412 unsigned len,
3413 struct page *page);
3414extern int ext4_da_write_inline_data_begin(struct address_space *mapping,
3415 struct inode *inode,
3416 loff_t pos, unsigned len,
3417 unsigned flags,
3418 struct page **pagep,
3419 void **fsdata);
3420extern int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
3421 unsigned len, unsigned copied,
3422 struct page *page);
3423extern int ext4_try_add_inline_entry(handle_t *handle,
3424 struct ext4_filename *fname,
3425 struct inode *dir, struct inode *inode);
3426extern int ext4_try_create_inline_dir(handle_t *handle,
3427 struct inode *parent,
3428 struct inode *inode);
3429extern int ext4_read_inline_dir(struct file *filp,
3430 struct dir_context *ctx,
3431 int *has_inline_data);
3432extern int ext4_inlinedir_to_tree(struct file *dir_file,
3433 struct inode *dir, ext4_lblk_t block,
3434 struct dx_hash_info *hinfo,
3435 __u32 start_hash, __u32 start_minor_hash,
3436 int *has_inline_data);
3437extern struct buffer_head *ext4_find_inline_entry(struct inode *dir,
3438 struct ext4_filename *fname,
3439 struct ext4_dir_entry_2 **res_dir,
3440 int *has_inline_data);
3441extern int ext4_delete_inline_entry(handle_t *handle,
3442 struct inode *dir,
3443 struct ext4_dir_entry_2 *de_del,
3444 struct buffer_head *bh,
3445 int *has_inline_data);
3446extern bool empty_inline_dir(struct inode *dir, int *has_inline_data);
3447extern struct buffer_head *ext4_get_first_inline_block(struct inode *inode,
3448 struct ext4_dir_entry_2 **parent_de,
3449 int *retval);
3450extern int ext4_inline_data_fiemap(struct inode *inode,
3451 struct fiemap_extent_info *fieinfo,
3452 int *has_inline, __u64 start, __u64 len);
3453
3454struct iomap;
3455extern int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap);
3456
3457extern int ext4_inline_data_truncate(struct inode *inode, int *has_inline);
3458
3459extern int ext4_convert_inline_data(struct inode *inode);
3460
3461static inline int ext4_has_inline_data(struct inode *inode)
3462{
3463 return ext4_test_inode_flag(inode, EXT4_INODE_INLINE_DATA) &&
3464 EXT4_I(inode)->i_inline_off;
3465}
3466
3467
3468extern const struct inode_operations ext4_dir_inode_operations;
3469extern const struct inode_operations ext4_special_inode_operations;
3470extern struct dentry *ext4_get_parent(struct dentry *child);
3471extern struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
3472 struct ext4_dir_entry_2 *de,
3473 int blocksize, int csum_size,
3474 unsigned int parent_ino, int dotdot_real_len);
3475extern void ext4_initialize_dirent_tail(struct buffer_head *bh,
3476 unsigned int blocksize);
3477extern int ext4_handle_dirty_dirblock(handle_t *handle, struct inode *inode,
3478 struct buffer_head *bh);
3479extern int ext4_ci_compare(const struct inode *parent,
3480 const struct qstr *fname,
3481 const struct qstr *entry, bool quick);
3482extern int __ext4_unlink(handle_t *handle, struct inode *dir, const struct qstr *d_name,
3483 struct inode *inode);
3484extern int __ext4_link(struct inode *dir, struct inode *inode,
3485 struct dentry *dentry);
3486
3487#define S_SHIFT 12
3488static const unsigned char ext4_type_by_mode[(S_IFMT >> S_SHIFT) + 1] = {
3489 [S_IFREG >> S_SHIFT] = EXT4_FT_REG_FILE,
3490 [S_IFDIR >> S_SHIFT] = EXT4_FT_DIR,
3491 [S_IFCHR >> S_SHIFT] = EXT4_FT_CHRDEV,
3492 [S_IFBLK >> S_SHIFT] = EXT4_FT_BLKDEV,
3493 [S_IFIFO >> S_SHIFT] = EXT4_FT_FIFO,
3494 [S_IFSOCK >> S_SHIFT] = EXT4_FT_SOCK,
3495 [S_IFLNK >> S_SHIFT] = EXT4_FT_SYMLINK,
3496};
3497
3498static inline void ext4_set_de_type(struct super_block *sb,
3499 struct ext4_dir_entry_2 *de,
3500 umode_t mode) {
3501 if (ext4_has_feature_filetype(sb))
3502 de->file_type = ext4_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
3503}
3504
3505
3506extern int ext4_mpage_readpages(struct inode *inode,
3507 struct readahead_control *rac, struct page *page);
3508extern int __init ext4_init_post_read_processing(void);
3509extern void ext4_exit_post_read_processing(void);
3510
3511
3512extern const struct inode_operations ext4_encrypted_symlink_inode_operations;
3513extern const struct inode_operations ext4_symlink_inode_operations;
3514extern const struct inode_operations ext4_fast_symlink_inode_operations;
3515
3516
3517extern int ext4_register_sysfs(struct super_block *sb);
3518extern void ext4_unregister_sysfs(struct super_block *sb);
3519extern int __init ext4_init_sysfs(void);
3520extern void ext4_exit_sysfs(void);
3521
3522
3523extern void ext4_release_system_zone(struct super_block *sb);
3524extern int ext4_setup_system_zone(struct super_block *sb);
3525extern int __init ext4_init_system_zone(void);
3526extern void ext4_exit_system_zone(void);
3527extern int ext4_inode_block_valid(struct inode *inode,
3528 ext4_fsblk_t start_blk,
3529 unsigned int count);
3530extern int ext4_check_blockref(const char *, unsigned int,
3531 struct inode *, __le32 *, unsigned int);
3532
3533
3534struct ext4_ext_path;
3535struct ext4_extent;
3536
3537
3538
3539
3540
3541#define EXT_MAX_BLOCKS 0xffffffff
3542
3543extern void ext4_ext_tree_init(handle_t *handle, struct inode *inode);
3544extern int ext4_ext_index_trans_blocks(struct inode *inode, int extents);
3545extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
3546 struct ext4_map_blocks *map, int flags);
3547extern int ext4_ext_truncate(handle_t *, struct inode *);
3548extern int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
3549 ext4_lblk_t end);
3550extern void ext4_ext_init(struct super_block *);
3551extern void ext4_ext_release(struct super_block *);
3552extern long ext4_fallocate(struct file *file, int mode, loff_t offset,
3553 loff_t len);
3554extern int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode,
3555 loff_t offset, ssize_t len);
3556extern int ext4_convert_unwritten_io_end_vec(handle_t *handle,
3557 ext4_io_end_t *io_end);
3558extern int ext4_map_blocks(handle_t *handle, struct inode *inode,
3559 struct ext4_map_blocks *map, int flags);
3560extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode,
3561 int num,
3562 struct ext4_ext_path *path);
3563extern int ext4_ext_insert_extent(handle_t *, struct inode *,
3564 struct ext4_ext_path **,
3565 struct ext4_extent *, int);
3566extern struct ext4_ext_path *ext4_find_extent(struct inode *, ext4_lblk_t,
3567 struct ext4_ext_path **,
3568 int flags);
3569extern void ext4_ext_drop_refs(struct ext4_ext_path *);
3570extern int ext4_ext_check_inode(struct inode *inode);
3571extern ext4_lblk_t ext4_ext_next_allocated_block(struct ext4_ext_path *path);
3572extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
3573 __u64 start, __u64 len);
3574extern int ext4_get_es_cache(struct inode *inode,
3575 struct fiemap_extent_info *fieinfo,
3576 __u64 start, __u64 len);
3577extern int ext4_ext_precache(struct inode *inode);
3578extern int ext4_swap_extents(handle_t *handle, struct inode *inode1,
3579 struct inode *inode2, ext4_lblk_t lblk1,
3580 ext4_lblk_t lblk2, ext4_lblk_t count,
3581 int mark_unwritten,int *err);
3582extern int ext4_clu_mapped(struct inode *inode, ext4_lblk_t lclu);
3583extern int ext4_datasem_ensure_credits(handle_t *handle, struct inode *inode,
3584 int check_cred, int restart_cred,
3585 int revoke_cred);
3586extern void ext4_ext_replay_shrink_inode(struct inode *inode, ext4_lblk_t end);
3587extern int ext4_ext_replay_set_iblocks(struct inode *inode);
3588extern int ext4_ext_replay_update_ex(struct inode *inode, ext4_lblk_t start,
3589 int len, int unwritten, ext4_fsblk_t pblk);
3590extern int ext4_ext_clear_bb(struct inode *inode);
3591
3592
3593
3594extern void ext4_double_down_write_data_sem(struct inode *first,
3595 struct inode *second);
3596extern void ext4_double_up_write_data_sem(struct inode *orig_inode,
3597 struct inode *donor_inode);
3598extern int ext4_move_extents(struct file *o_filp, struct file *d_filp,
3599 __u64 start_orig, __u64 start_donor,
3600 __u64 len, __u64 *moved_len);
3601
3602
3603extern int __init ext4_init_pageio(void);
3604extern void ext4_exit_pageio(void);
3605extern ext4_io_end_t *ext4_init_io_end(struct inode *inode, gfp_t flags);
3606extern ext4_io_end_t *ext4_get_io_end(ext4_io_end_t *io_end);
3607extern int ext4_put_io_end(ext4_io_end_t *io_end);
3608extern void ext4_put_io_end_defer(ext4_io_end_t *io_end);
3609extern void ext4_io_submit_init(struct ext4_io_submit *io,
3610 struct writeback_control *wbc);
3611extern void ext4_end_io_rsv_work(struct work_struct *work);
3612extern void ext4_io_submit(struct ext4_io_submit *io);
3613extern int ext4_bio_write_page(struct ext4_io_submit *io,
3614 struct page *page,
3615 int len,
3616 struct writeback_control *wbc,
3617 bool keep_towrite);
3618extern struct ext4_io_end_vec *ext4_alloc_io_end_vec(ext4_io_end_t *io_end);
3619extern struct ext4_io_end_vec *ext4_last_io_end_vec(ext4_io_end_t *io_end);
3620
3621
3622extern int ext4_multi_mount_protect(struct super_block *, ext4_fsblk_t);
3623
3624
3625extern const struct fsverity_operations ext4_verityops;
3626
3627
3628
3629
3630
3631
3632#define BH_BITMAP_UPTODATE BH_JBDPrivateStart
3633
3634static inline int bitmap_uptodate(struct buffer_head *bh)
3635{
3636 return (buffer_uptodate(bh) &&
3637 test_bit(BH_BITMAP_UPTODATE, &(bh)->b_state));
3638}
3639static inline void set_bitmap_uptodate(struct buffer_head *bh)
3640{
3641 set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
3642}
3643
3644#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
3645
3646
3647#define EXT4_WQ_HASH_SZ 37
3648#define ext4_ioend_wq(v) (&ext4__ioend_wq[((unsigned long)(v)) %\
3649 EXT4_WQ_HASH_SZ])
3650extern wait_queue_head_t ext4__ioend_wq[EXT4_WQ_HASH_SZ];
3651
3652extern int ext4_resize_begin(struct super_block *sb);
3653extern void ext4_resize_end(struct super_block *sb);
3654
3655static inline void ext4_set_io_unwritten_flag(struct inode *inode,
3656 struct ext4_io_end *io_end)
3657{
3658 if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) {
3659 io_end->flag |= EXT4_IO_END_UNWRITTEN;
3660 atomic_inc(&EXT4_I(inode)->i_unwritten);
3661 }
3662}
3663
3664static inline void ext4_clear_io_unwritten_flag(ext4_io_end_t *io_end)
3665{
3666 struct inode *inode = io_end->inode;
3667
3668 if (io_end->flag & EXT4_IO_END_UNWRITTEN) {
3669 io_end->flag &= ~EXT4_IO_END_UNWRITTEN;
3670
3671 if (atomic_dec_and_test(&EXT4_I(inode)->i_unwritten))
3672 wake_up_all(ext4_ioend_wq(inode));
3673 }
3674}
3675
3676extern const struct iomap_ops ext4_iomap_ops;
3677extern const struct iomap_ops ext4_iomap_overwrite_ops;
3678extern const struct iomap_ops ext4_iomap_report_ops;
3679
3680static inline int ext4_buffer_uptodate(struct buffer_head *bh)
3681{
3682
3683
3684
3685
3686
3687
3688 if (!buffer_uptodate(bh) && buffer_write_io_error(bh))
3689 set_buffer_uptodate(bh);
3690 return buffer_uptodate(bh);
3691}
3692
3693#endif
3694
3695#define EFSBADCRC EBADMSG
3696#define EFSCORRUPTED EUCLEAN
3697
3698#endif
3699