1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * linux/fs/ext4/super.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 1992, 1993, 1994, 1995
6*4882a593Smuzhiyun * Remy Card (card@masi.ibp.fr)
7*4882a593Smuzhiyun * Laboratoire MASI - Institut Blaise Pascal
8*4882a593Smuzhiyun * Universite Pierre et Marie Curie (Paris VI)
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * from
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * linux/fs/minix/inode.c
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * Copyright (C) 1991, 1992 Linus Torvalds
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun * Big-endian to little-endian byte-swapping/bitmaps by
17*4882a593Smuzhiyun * David S. Miller (davem@caip.rutgers.edu), 1995
18*4882a593Smuzhiyun */
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include <linux/module.h>
21*4882a593Smuzhiyun #include <linux/string.h>
22*4882a593Smuzhiyun #include <linux/fs.h>
23*4882a593Smuzhiyun #include <linux/time.h>
24*4882a593Smuzhiyun #include <linux/vmalloc.h>
25*4882a593Smuzhiyun #include <linux/slab.h>
26*4882a593Smuzhiyun #include <linux/init.h>
27*4882a593Smuzhiyun #include <linux/blkdev.h>
28*4882a593Smuzhiyun #include <linux/backing-dev.h>
29*4882a593Smuzhiyun #include <linux/parser.h>
30*4882a593Smuzhiyun #include <linux/buffer_head.h>
31*4882a593Smuzhiyun #include <linux/exportfs.h>
32*4882a593Smuzhiyun #include <linux/vfs.h>
33*4882a593Smuzhiyun #include <linux/random.h>
34*4882a593Smuzhiyun #include <linux/mount.h>
35*4882a593Smuzhiyun #include <linux/namei.h>
36*4882a593Smuzhiyun #include <linux/quotaops.h>
37*4882a593Smuzhiyun #include <linux/seq_file.h>
38*4882a593Smuzhiyun #include <linux/ctype.h>
39*4882a593Smuzhiyun #include <linux/log2.h>
40*4882a593Smuzhiyun #include <linux/crc16.h>
41*4882a593Smuzhiyun #include <linux/dax.h>
42*4882a593Smuzhiyun #include <linux/cleancache.h>
43*4882a593Smuzhiyun #include <linux/uaccess.h>
44*4882a593Smuzhiyun #include <linux/iversion.h>
45*4882a593Smuzhiyun #include <linux/unicode.h>
46*4882a593Smuzhiyun #include <linux/part_stat.h>
47*4882a593Smuzhiyun #include <linux/kthread.h>
48*4882a593Smuzhiyun #include <linux/freezer.h>
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #include "ext4.h"
51*4882a593Smuzhiyun #include "ext4_extents.h" /* Needed for trace points definition */
52*4882a593Smuzhiyun #include "ext4_jbd2.h"
53*4882a593Smuzhiyun #include "xattr.h"
54*4882a593Smuzhiyun #include "acl.h"
55*4882a593Smuzhiyun #include "mballoc.h"
56*4882a593Smuzhiyun #include "fsmap.h"
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun #define CREATE_TRACE_POINTS
59*4882a593Smuzhiyun #include <trace/events/ext4.h>
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun static struct ext4_lazy_init *ext4_li_info;
62*4882a593Smuzhiyun static struct mutex ext4_li_mtx;
63*4882a593Smuzhiyun static struct ratelimit_state ext4_mount_msg_ratelimit;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
66*4882a593Smuzhiyun unsigned long journal_devnum);
67*4882a593Smuzhiyun static int ext4_show_options(struct seq_file *seq, struct dentry *root);
68*4882a593Smuzhiyun static int ext4_commit_super(struct super_block *sb, int sync);
69*4882a593Smuzhiyun static int ext4_mark_recovery_complete(struct super_block *sb,
70*4882a593Smuzhiyun struct ext4_super_block *es);
71*4882a593Smuzhiyun static int ext4_clear_journal_err(struct super_block *sb,
72*4882a593Smuzhiyun struct ext4_super_block *es);
73*4882a593Smuzhiyun static int ext4_sync_fs(struct super_block *sb, int wait);
74*4882a593Smuzhiyun static int ext4_remount(struct super_block *sb, int *flags, char *data);
75*4882a593Smuzhiyun static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf);
76*4882a593Smuzhiyun static int ext4_unfreeze(struct super_block *sb);
77*4882a593Smuzhiyun static int ext4_freeze(struct super_block *sb);
78*4882a593Smuzhiyun static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
79*4882a593Smuzhiyun const char *dev_name, void *data);
80*4882a593Smuzhiyun static inline int ext2_feature_set_ok(struct super_block *sb);
81*4882a593Smuzhiyun static inline int ext3_feature_set_ok(struct super_block *sb);
82*4882a593Smuzhiyun static int ext4_feature_set_ok(struct super_block *sb, int readonly);
83*4882a593Smuzhiyun static void ext4_destroy_lazyinit_thread(void);
84*4882a593Smuzhiyun static void ext4_unregister_li_request(struct super_block *sb);
85*4882a593Smuzhiyun static void ext4_clear_request_list(void);
86*4882a593Smuzhiyun static struct inode *ext4_get_journal_inode(struct super_block *sb,
87*4882a593Smuzhiyun unsigned int journal_inum);
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /*
90*4882a593Smuzhiyun * Lock ordering
91*4882a593Smuzhiyun *
92*4882a593Smuzhiyun * Note the difference between i_mmap_sem (EXT4_I(inode)->i_mmap_sem) and
93*4882a593Smuzhiyun * i_mmap_rwsem (inode->i_mmap_rwsem)!
94*4882a593Smuzhiyun *
95*4882a593Smuzhiyun * page fault path:
96*4882a593Smuzhiyun * mmap_lock -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start ->
97*4882a593Smuzhiyun * page lock -> i_data_sem (rw)
98*4882a593Smuzhiyun *
99*4882a593Smuzhiyun * buffered write path:
100*4882a593Smuzhiyun * sb_start_write -> i_mutex -> mmap_lock
101*4882a593Smuzhiyun * sb_start_write -> i_mutex -> transaction start -> page lock ->
102*4882a593Smuzhiyun * i_data_sem (rw)
103*4882a593Smuzhiyun *
104*4882a593Smuzhiyun * truncate:
105*4882a593Smuzhiyun * sb_start_write -> i_mutex -> i_mmap_sem (w) -> i_mmap_rwsem (w) -> page lock
106*4882a593Smuzhiyun * sb_start_write -> i_mutex -> i_mmap_sem (w) -> transaction start ->
107*4882a593Smuzhiyun * i_data_sem (rw)
108*4882a593Smuzhiyun *
109*4882a593Smuzhiyun * direct IO:
110*4882a593Smuzhiyun * sb_start_write -> i_mutex -> mmap_lock
111*4882a593Smuzhiyun * sb_start_write -> i_mutex -> transaction start -> i_data_sem (rw)
112*4882a593Smuzhiyun *
113*4882a593Smuzhiyun * writepages:
114*4882a593Smuzhiyun * transaction start -> page lock(s) -> i_data_sem (rw)
115*4882a593Smuzhiyun */
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun #if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT2)
118*4882a593Smuzhiyun static struct file_system_type ext2_fs_type = {
119*4882a593Smuzhiyun .owner = THIS_MODULE,
120*4882a593Smuzhiyun .name = "ext2",
121*4882a593Smuzhiyun .mount = ext4_mount,
122*4882a593Smuzhiyun .kill_sb = kill_block_super,
123*4882a593Smuzhiyun .fs_flags = FS_REQUIRES_DEV,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun MODULE_ALIAS_FS("ext2");
126*4882a593Smuzhiyun MODULE_ALIAS("ext2");
127*4882a593Smuzhiyun #define IS_EXT2_SB(sb) ((sb)->s_bdev->bd_holder == &ext2_fs_type)
128*4882a593Smuzhiyun #else
129*4882a593Smuzhiyun #define IS_EXT2_SB(sb) (0)
130*4882a593Smuzhiyun #endif
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun static struct file_system_type ext3_fs_type = {
134*4882a593Smuzhiyun .owner = THIS_MODULE,
135*4882a593Smuzhiyun .name = "ext3",
136*4882a593Smuzhiyun .mount = ext4_mount,
137*4882a593Smuzhiyun .kill_sb = kill_block_super,
138*4882a593Smuzhiyun .fs_flags = FS_REQUIRES_DEV,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun MODULE_ALIAS_FS("ext3");
141*4882a593Smuzhiyun MODULE_ALIAS("ext3");
142*4882a593Smuzhiyun #define IS_EXT3_SB(sb) ((sb)->s_bdev->bd_holder == &ext3_fs_type)
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun
__ext4_read_bh(struct buffer_head * bh,int op_flags,bh_end_io_t * end_io)145*4882a593Smuzhiyun static inline void __ext4_read_bh(struct buffer_head *bh, int op_flags,
146*4882a593Smuzhiyun bh_end_io_t *end_io)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun /*
149*4882a593Smuzhiyun * buffer's verified bit is no longer valid after reading from
150*4882a593Smuzhiyun * disk again due to write out error, clear it to make sure we
151*4882a593Smuzhiyun * recheck the buffer contents.
152*4882a593Smuzhiyun */
153*4882a593Smuzhiyun clear_buffer_verified(bh);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun bh->b_end_io = end_io ? end_io : end_buffer_read_sync;
156*4882a593Smuzhiyun get_bh(bh);
157*4882a593Smuzhiyun submit_bh(REQ_OP_READ, op_flags, bh);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
ext4_read_bh_nowait(struct buffer_head * bh,int op_flags,bh_end_io_t * end_io)160*4882a593Smuzhiyun void ext4_read_bh_nowait(struct buffer_head *bh, int op_flags,
161*4882a593Smuzhiyun bh_end_io_t *end_io)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun BUG_ON(!buffer_locked(bh));
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun if (ext4_buffer_uptodate(bh)) {
166*4882a593Smuzhiyun unlock_buffer(bh);
167*4882a593Smuzhiyun return;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun __ext4_read_bh(bh, op_flags, end_io);
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
ext4_read_bh(struct buffer_head * bh,int op_flags,bh_end_io_t * end_io)172*4882a593Smuzhiyun int ext4_read_bh(struct buffer_head *bh, int op_flags, bh_end_io_t *end_io)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun BUG_ON(!buffer_locked(bh));
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun if (ext4_buffer_uptodate(bh)) {
177*4882a593Smuzhiyun unlock_buffer(bh);
178*4882a593Smuzhiyun return 0;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun __ext4_read_bh(bh, op_flags, end_io);
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun wait_on_buffer(bh);
184*4882a593Smuzhiyun if (buffer_uptodate(bh))
185*4882a593Smuzhiyun return 0;
186*4882a593Smuzhiyun return -EIO;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun
ext4_read_bh_lock(struct buffer_head * bh,int op_flags,bool wait)189*4882a593Smuzhiyun int ext4_read_bh_lock(struct buffer_head *bh, int op_flags, bool wait)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun lock_buffer(bh);
192*4882a593Smuzhiyun if (!wait) {
193*4882a593Smuzhiyun ext4_read_bh_nowait(bh, op_flags, NULL);
194*4882a593Smuzhiyun return 0;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun return ext4_read_bh(bh, op_flags, NULL);
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /*
200*4882a593Smuzhiyun * This works like __bread_gfp() except it uses ERR_PTR for error
201*4882a593Smuzhiyun * returns. Currently with sb_bread it's impossible to distinguish
202*4882a593Smuzhiyun * between ENOMEM and EIO situations (since both result in a NULL
203*4882a593Smuzhiyun * return.
204*4882a593Smuzhiyun */
__ext4_sb_bread_gfp(struct super_block * sb,sector_t block,int op_flags,gfp_t gfp)205*4882a593Smuzhiyun static struct buffer_head *__ext4_sb_bread_gfp(struct super_block *sb,
206*4882a593Smuzhiyun sector_t block, int op_flags,
207*4882a593Smuzhiyun gfp_t gfp)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun struct buffer_head *bh;
210*4882a593Smuzhiyun int ret;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun bh = sb_getblk_gfp(sb, block, gfp);
213*4882a593Smuzhiyun if (bh == NULL)
214*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
215*4882a593Smuzhiyun if (ext4_buffer_uptodate(bh))
216*4882a593Smuzhiyun return bh;
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun ret = ext4_read_bh_lock(bh, REQ_META | op_flags, true);
219*4882a593Smuzhiyun if (ret) {
220*4882a593Smuzhiyun put_bh(bh);
221*4882a593Smuzhiyun return ERR_PTR(ret);
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun return bh;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
ext4_sb_bread(struct super_block * sb,sector_t block,int op_flags)226*4882a593Smuzhiyun struct buffer_head *ext4_sb_bread(struct super_block *sb, sector_t block,
227*4882a593Smuzhiyun int op_flags)
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun return __ext4_sb_bread_gfp(sb, block, op_flags, __GFP_MOVABLE);
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun
ext4_sb_bread_unmovable(struct super_block * sb,sector_t block)232*4882a593Smuzhiyun struct buffer_head *ext4_sb_bread_unmovable(struct super_block *sb,
233*4882a593Smuzhiyun sector_t block)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun return __ext4_sb_bread_gfp(sb, block, 0, 0);
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
ext4_sb_breadahead_unmovable(struct super_block * sb,sector_t block)238*4882a593Smuzhiyun void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun struct buffer_head *bh = sb_getblk_gfp(sb, block, 0);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun if (likely(bh)) {
243*4882a593Smuzhiyun if (trylock_buffer(bh))
244*4882a593Smuzhiyun ext4_read_bh_nowait(bh, REQ_RAHEAD, NULL);
245*4882a593Smuzhiyun brelse(bh);
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun
ext4_verify_csum_type(struct super_block * sb,struct ext4_super_block * es)249*4882a593Smuzhiyun static int ext4_verify_csum_type(struct super_block *sb,
250*4882a593Smuzhiyun struct ext4_super_block *es)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun if (!ext4_has_feature_metadata_csum(sb))
253*4882a593Smuzhiyun return 1;
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun return es->s_checksum_type == EXT4_CRC32C_CHKSUM;
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun
ext4_superblock_csum(struct super_block * sb,struct ext4_super_block * es)258*4882a593Smuzhiyun static __le32 ext4_superblock_csum(struct super_block *sb,
259*4882a593Smuzhiyun struct ext4_super_block *es)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
262*4882a593Smuzhiyun int offset = offsetof(struct ext4_super_block, s_checksum);
263*4882a593Smuzhiyun __u32 csum;
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun csum = ext4_chksum(sbi, ~0, (char *)es, offset);
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun return cpu_to_le32(csum);
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
ext4_superblock_csum_verify(struct super_block * sb,struct ext4_super_block * es)270*4882a593Smuzhiyun static int ext4_superblock_csum_verify(struct super_block *sb,
271*4882a593Smuzhiyun struct ext4_super_block *es)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun if (!ext4_has_metadata_csum(sb))
274*4882a593Smuzhiyun return 1;
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun return es->s_checksum == ext4_superblock_csum(sb, es);
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
ext4_superblock_csum_set(struct super_block * sb)279*4882a593Smuzhiyun void ext4_superblock_csum_set(struct super_block *sb)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun struct ext4_super_block *es = EXT4_SB(sb)->s_es;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun if (!ext4_has_metadata_csum(sb))
284*4882a593Smuzhiyun return;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun es->s_checksum = ext4_superblock_csum(sb, es);
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
ext4_block_bitmap(struct super_block * sb,struct ext4_group_desc * bg)289*4882a593Smuzhiyun ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
290*4882a593Smuzhiyun struct ext4_group_desc *bg)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun return le32_to_cpu(bg->bg_block_bitmap_lo) |
293*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
294*4882a593Smuzhiyun (ext4_fsblk_t)le32_to_cpu(bg->bg_block_bitmap_hi) << 32 : 0);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
ext4_inode_bitmap(struct super_block * sb,struct ext4_group_desc * bg)297*4882a593Smuzhiyun ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb,
298*4882a593Smuzhiyun struct ext4_group_desc *bg)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun return le32_to_cpu(bg->bg_inode_bitmap_lo) |
301*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
302*4882a593Smuzhiyun (ext4_fsblk_t)le32_to_cpu(bg->bg_inode_bitmap_hi) << 32 : 0);
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun
ext4_inode_table(struct super_block * sb,struct ext4_group_desc * bg)305*4882a593Smuzhiyun ext4_fsblk_t ext4_inode_table(struct super_block *sb,
306*4882a593Smuzhiyun struct ext4_group_desc *bg)
307*4882a593Smuzhiyun {
308*4882a593Smuzhiyun return le32_to_cpu(bg->bg_inode_table_lo) |
309*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
310*4882a593Smuzhiyun (ext4_fsblk_t)le32_to_cpu(bg->bg_inode_table_hi) << 32 : 0);
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun
ext4_free_group_clusters(struct super_block * sb,struct ext4_group_desc * bg)313*4882a593Smuzhiyun __u32 ext4_free_group_clusters(struct super_block *sb,
314*4882a593Smuzhiyun struct ext4_group_desc *bg)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun return le16_to_cpu(bg->bg_free_blocks_count_lo) |
317*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
318*4882a593Smuzhiyun (__u32)le16_to_cpu(bg->bg_free_blocks_count_hi) << 16 : 0);
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
ext4_free_inodes_count(struct super_block * sb,struct ext4_group_desc * bg)321*4882a593Smuzhiyun __u32 ext4_free_inodes_count(struct super_block *sb,
322*4882a593Smuzhiyun struct ext4_group_desc *bg)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun return le16_to_cpu(bg->bg_free_inodes_count_lo) |
325*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
326*4882a593Smuzhiyun (__u32)le16_to_cpu(bg->bg_free_inodes_count_hi) << 16 : 0);
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
ext4_used_dirs_count(struct super_block * sb,struct ext4_group_desc * bg)329*4882a593Smuzhiyun __u32 ext4_used_dirs_count(struct super_block *sb,
330*4882a593Smuzhiyun struct ext4_group_desc *bg)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun return le16_to_cpu(bg->bg_used_dirs_count_lo) |
333*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
334*4882a593Smuzhiyun (__u32)le16_to_cpu(bg->bg_used_dirs_count_hi) << 16 : 0);
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun
ext4_itable_unused_count(struct super_block * sb,struct ext4_group_desc * bg)337*4882a593Smuzhiyun __u32 ext4_itable_unused_count(struct super_block *sb,
338*4882a593Smuzhiyun struct ext4_group_desc *bg)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun return le16_to_cpu(bg->bg_itable_unused_lo) |
341*4882a593Smuzhiyun (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
342*4882a593Smuzhiyun (__u32)le16_to_cpu(bg->bg_itable_unused_hi) << 16 : 0);
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun
ext4_block_bitmap_set(struct super_block * sb,struct ext4_group_desc * bg,ext4_fsblk_t blk)345*4882a593Smuzhiyun void ext4_block_bitmap_set(struct super_block *sb,
346*4882a593Smuzhiyun struct ext4_group_desc *bg, ext4_fsblk_t blk)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun bg->bg_block_bitmap_lo = cpu_to_le32((u32)blk);
349*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
350*4882a593Smuzhiyun bg->bg_block_bitmap_hi = cpu_to_le32(blk >> 32);
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun
ext4_inode_bitmap_set(struct super_block * sb,struct ext4_group_desc * bg,ext4_fsblk_t blk)353*4882a593Smuzhiyun void ext4_inode_bitmap_set(struct super_block *sb,
354*4882a593Smuzhiyun struct ext4_group_desc *bg, ext4_fsblk_t blk)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun bg->bg_inode_bitmap_lo = cpu_to_le32((u32)blk);
357*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
358*4882a593Smuzhiyun bg->bg_inode_bitmap_hi = cpu_to_le32(blk >> 32);
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
ext4_inode_table_set(struct super_block * sb,struct ext4_group_desc * bg,ext4_fsblk_t blk)361*4882a593Smuzhiyun void ext4_inode_table_set(struct super_block *sb,
362*4882a593Smuzhiyun struct ext4_group_desc *bg, ext4_fsblk_t blk)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun bg->bg_inode_table_lo = cpu_to_le32((u32)blk);
365*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
366*4882a593Smuzhiyun bg->bg_inode_table_hi = cpu_to_le32(blk >> 32);
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun
ext4_free_group_clusters_set(struct super_block * sb,struct ext4_group_desc * bg,__u32 count)369*4882a593Smuzhiyun void ext4_free_group_clusters_set(struct super_block *sb,
370*4882a593Smuzhiyun struct ext4_group_desc *bg, __u32 count)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun bg->bg_free_blocks_count_lo = cpu_to_le16((__u16)count);
373*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
374*4882a593Smuzhiyun bg->bg_free_blocks_count_hi = cpu_to_le16(count >> 16);
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
ext4_free_inodes_set(struct super_block * sb,struct ext4_group_desc * bg,__u32 count)377*4882a593Smuzhiyun void ext4_free_inodes_set(struct super_block *sb,
378*4882a593Smuzhiyun struct ext4_group_desc *bg, __u32 count)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun bg->bg_free_inodes_count_lo = cpu_to_le16((__u16)count);
381*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
382*4882a593Smuzhiyun bg->bg_free_inodes_count_hi = cpu_to_le16(count >> 16);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun
ext4_used_dirs_set(struct super_block * sb,struct ext4_group_desc * bg,__u32 count)385*4882a593Smuzhiyun void ext4_used_dirs_set(struct super_block *sb,
386*4882a593Smuzhiyun struct ext4_group_desc *bg, __u32 count)
387*4882a593Smuzhiyun {
388*4882a593Smuzhiyun bg->bg_used_dirs_count_lo = cpu_to_le16((__u16)count);
389*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
390*4882a593Smuzhiyun bg->bg_used_dirs_count_hi = cpu_to_le16(count >> 16);
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
ext4_itable_unused_set(struct super_block * sb,struct ext4_group_desc * bg,__u32 count)393*4882a593Smuzhiyun void ext4_itable_unused_set(struct super_block *sb,
394*4882a593Smuzhiyun struct ext4_group_desc *bg, __u32 count)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun bg->bg_itable_unused_lo = cpu_to_le16((__u16)count);
397*4882a593Smuzhiyun if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
398*4882a593Smuzhiyun bg->bg_itable_unused_hi = cpu_to_le16(count >> 16);
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun
__ext4_update_tstamp(__le32 * lo,__u8 * hi)401*4882a593Smuzhiyun static void __ext4_update_tstamp(__le32 *lo, __u8 *hi)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun time64_t now = ktime_get_real_seconds();
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun now = clamp_val(now, 0, (1ull << 40) - 1);
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun *lo = cpu_to_le32(lower_32_bits(now));
408*4882a593Smuzhiyun *hi = upper_32_bits(now);
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun
__ext4_get_tstamp(__le32 * lo,__u8 * hi)411*4882a593Smuzhiyun static time64_t __ext4_get_tstamp(__le32 *lo, __u8 *hi)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun return ((time64_t)(*hi) << 32) + le32_to_cpu(*lo);
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun #define ext4_update_tstamp(es, tstamp) \
416*4882a593Smuzhiyun __ext4_update_tstamp(&(es)->tstamp, &(es)->tstamp ## _hi)
417*4882a593Smuzhiyun #define ext4_get_tstamp(es, tstamp) \
418*4882a593Smuzhiyun __ext4_get_tstamp(&(es)->tstamp, &(es)->tstamp ## _hi)
419*4882a593Smuzhiyun
__save_error_info(struct super_block * sb,int error,__u32 ino,__u64 block,const char * func,unsigned int line)420*4882a593Smuzhiyun static void __save_error_info(struct super_block *sb, int error,
421*4882a593Smuzhiyun __u32 ino, __u64 block,
422*4882a593Smuzhiyun const char *func, unsigned int line)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun struct ext4_super_block *es = EXT4_SB(sb)->s_es;
425*4882a593Smuzhiyun int err;
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
428*4882a593Smuzhiyun if (bdev_read_only(sb->s_bdev))
429*4882a593Smuzhiyun return;
430*4882a593Smuzhiyun es->s_state |= cpu_to_le16(EXT4_ERROR_FS);
431*4882a593Smuzhiyun ext4_update_tstamp(es, s_last_error_time);
432*4882a593Smuzhiyun strncpy(es->s_last_error_func, func, sizeof(es->s_last_error_func));
433*4882a593Smuzhiyun es->s_last_error_line = cpu_to_le32(line);
434*4882a593Smuzhiyun es->s_last_error_ino = cpu_to_le32(ino);
435*4882a593Smuzhiyun es->s_last_error_block = cpu_to_le64(block);
436*4882a593Smuzhiyun switch (error) {
437*4882a593Smuzhiyun case EIO:
438*4882a593Smuzhiyun err = EXT4_ERR_EIO;
439*4882a593Smuzhiyun break;
440*4882a593Smuzhiyun case ENOMEM:
441*4882a593Smuzhiyun err = EXT4_ERR_ENOMEM;
442*4882a593Smuzhiyun break;
443*4882a593Smuzhiyun case EFSBADCRC:
444*4882a593Smuzhiyun err = EXT4_ERR_EFSBADCRC;
445*4882a593Smuzhiyun break;
446*4882a593Smuzhiyun case 0:
447*4882a593Smuzhiyun case EFSCORRUPTED:
448*4882a593Smuzhiyun err = EXT4_ERR_EFSCORRUPTED;
449*4882a593Smuzhiyun break;
450*4882a593Smuzhiyun case ENOSPC:
451*4882a593Smuzhiyun err = EXT4_ERR_ENOSPC;
452*4882a593Smuzhiyun break;
453*4882a593Smuzhiyun case ENOKEY:
454*4882a593Smuzhiyun err = EXT4_ERR_ENOKEY;
455*4882a593Smuzhiyun break;
456*4882a593Smuzhiyun case EROFS:
457*4882a593Smuzhiyun err = EXT4_ERR_EROFS;
458*4882a593Smuzhiyun break;
459*4882a593Smuzhiyun case EFBIG:
460*4882a593Smuzhiyun err = EXT4_ERR_EFBIG;
461*4882a593Smuzhiyun break;
462*4882a593Smuzhiyun case EEXIST:
463*4882a593Smuzhiyun err = EXT4_ERR_EEXIST;
464*4882a593Smuzhiyun break;
465*4882a593Smuzhiyun case ERANGE:
466*4882a593Smuzhiyun err = EXT4_ERR_ERANGE;
467*4882a593Smuzhiyun break;
468*4882a593Smuzhiyun case EOVERFLOW:
469*4882a593Smuzhiyun err = EXT4_ERR_EOVERFLOW;
470*4882a593Smuzhiyun break;
471*4882a593Smuzhiyun case EBUSY:
472*4882a593Smuzhiyun err = EXT4_ERR_EBUSY;
473*4882a593Smuzhiyun break;
474*4882a593Smuzhiyun case ENOTDIR:
475*4882a593Smuzhiyun err = EXT4_ERR_ENOTDIR;
476*4882a593Smuzhiyun break;
477*4882a593Smuzhiyun case ENOTEMPTY:
478*4882a593Smuzhiyun err = EXT4_ERR_ENOTEMPTY;
479*4882a593Smuzhiyun break;
480*4882a593Smuzhiyun case ESHUTDOWN:
481*4882a593Smuzhiyun err = EXT4_ERR_ESHUTDOWN;
482*4882a593Smuzhiyun break;
483*4882a593Smuzhiyun case EFAULT:
484*4882a593Smuzhiyun err = EXT4_ERR_EFAULT;
485*4882a593Smuzhiyun break;
486*4882a593Smuzhiyun default:
487*4882a593Smuzhiyun err = EXT4_ERR_UNKNOWN;
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun es->s_last_error_errcode = err;
490*4882a593Smuzhiyun if (!es->s_first_error_time) {
491*4882a593Smuzhiyun es->s_first_error_time = es->s_last_error_time;
492*4882a593Smuzhiyun es->s_first_error_time_hi = es->s_last_error_time_hi;
493*4882a593Smuzhiyun strncpy(es->s_first_error_func, func,
494*4882a593Smuzhiyun sizeof(es->s_first_error_func));
495*4882a593Smuzhiyun es->s_first_error_line = cpu_to_le32(line);
496*4882a593Smuzhiyun es->s_first_error_ino = es->s_last_error_ino;
497*4882a593Smuzhiyun es->s_first_error_block = es->s_last_error_block;
498*4882a593Smuzhiyun es->s_first_error_errcode = es->s_last_error_errcode;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun /*
501*4882a593Smuzhiyun * Start the daily error reporting function if it hasn't been
502*4882a593Smuzhiyun * started already
503*4882a593Smuzhiyun */
504*4882a593Smuzhiyun if (!es->s_error_count)
505*4882a593Smuzhiyun mod_timer(&EXT4_SB(sb)->s_err_report, jiffies + 24*60*60*HZ);
506*4882a593Smuzhiyun le32_add_cpu(&es->s_error_count, 1);
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun
save_error_info(struct super_block * sb,int error,__u32 ino,__u64 block,const char * func,unsigned int line)509*4882a593Smuzhiyun static void save_error_info(struct super_block *sb, int error,
510*4882a593Smuzhiyun __u32 ino, __u64 block,
511*4882a593Smuzhiyun const char *func, unsigned int line)
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun __save_error_info(sb, error, ino, block, func, line);
514*4882a593Smuzhiyun if (!bdev_read_only(sb->s_bdev))
515*4882a593Smuzhiyun ext4_commit_super(sb, 1);
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun /*
519*4882a593Smuzhiyun * The del_gendisk() function uninitializes the disk-specific data
520*4882a593Smuzhiyun * structures, including the bdi structure, without telling anyone
521*4882a593Smuzhiyun * else. Once this happens, any attempt to call mark_buffer_dirty()
522*4882a593Smuzhiyun * (for example, by ext4_commit_super), will cause a kernel OOPS.
523*4882a593Smuzhiyun * This is a kludge to prevent these oops until we can put in a proper
524*4882a593Smuzhiyun * hook in del_gendisk() to inform the VFS and file system layers.
525*4882a593Smuzhiyun */
block_device_ejected(struct super_block * sb)526*4882a593Smuzhiyun static int block_device_ejected(struct super_block *sb)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun struct inode *bd_inode = sb->s_bdev->bd_inode;
529*4882a593Smuzhiyun struct backing_dev_info *bdi = inode_to_bdi(bd_inode);
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun return bdi->dev == NULL;
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun
ext4_journal_commit_callback(journal_t * journal,transaction_t * txn)534*4882a593Smuzhiyun static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn)
535*4882a593Smuzhiyun {
536*4882a593Smuzhiyun struct super_block *sb = journal->j_private;
537*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
538*4882a593Smuzhiyun int error = is_journal_aborted(journal);
539*4882a593Smuzhiyun struct ext4_journal_cb_entry *jce;
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun BUG_ON(txn->t_state == T_FINISHED);
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun ext4_process_freed_data(sb, txn->t_tid);
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun spin_lock(&sbi->s_md_lock);
546*4882a593Smuzhiyun while (!list_empty(&txn->t_private_list)) {
547*4882a593Smuzhiyun jce = list_entry(txn->t_private_list.next,
548*4882a593Smuzhiyun struct ext4_journal_cb_entry, jce_list);
549*4882a593Smuzhiyun list_del_init(&jce->jce_list);
550*4882a593Smuzhiyun spin_unlock(&sbi->s_md_lock);
551*4882a593Smuzhiyun jce->jce_func(sb, jce, error);
552*4882a593Smuzhiyun spin_lock(&sbi->s_md_lock);
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun spin_unlock(&sbi->s_md_lock);
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun /*
558*4882a593Smuzhiyun * This writepage callback for write_cache_pages()
559*4882a593Smuzhiyun * takes care of a few cases after page cleaning.
560*4882a593Smuzhiyun *
561*4882a593Smuzhiyun * write_cache_pages() already checks for dirty pages
562*4882a593Smuzhiyun * and calls clear_page_dirty_for_io(), which we want,
563*4882a593Smuzhiyun * to write protect the pages.
564*4882a593Smuzhiyun *
565*4882a593Smuzhiyun * However, we may have to redirty a page (see below.)
566*4882a593Smuzhiyun */
ext4_journalled_writepage_callback(struct page * page,struct writeback_control * wbc,void * data)567*4882a593Smuzhiyun static int ext4_journalled_writepage_callback(struct page *page,
568*4882a593Smuzhiyun struct writeback_control *wbc,
569*4882a593Smuzhiyun void *data)
570*4882a593Smuzhiyun {
571*4882a593Smuzhiyun transaction_t *transaction = (transaction_t *) data;
572*4882a593Smuzhiyun struct buffer_head *bh, *head;
573*4882a593Smuzhiyun struct journal_head *jh;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun bh = head = page_buffers(page);
576*4882a593Smuzhiyun do {
577*4882a593Smuzhiyun /*
578*4882a593Smuzhiyun * We have to redirty a page in these cases:
579*4882a593Smuzhiyun * 1) If buffer is dirty, it means the page was dirty because it
580*4882a593Smuzhiyun * contains a buffer that needs checkpointing. So the dirty bit
581*4882a593Smuzhiyun * needs to be preserved so that checkpointing writes the buffer
582*4882a593Smuzhiyun * properly.
583*4882a593Smuzhiyun * 2) If buffer is not part of the committing transaction
584*4882a593Smuzhiyun * (we may have just accidentally come across this buffer because
585*4882a593Smuzhiyun * inode range tracking is not exact) or if the currently running
586*4882a593Smuzhiyun * transaction already contains this buffer as well, dirty bit
587*4882a593Smuzhiyun * needs to be preserved so that the buffer gets writeprotected
588*4882a593Smuzhiyun * properly on running transaction's commit.
589*4882a593Smuzhiyun */
590*4882a593Smuzhiyun jh = bh2jh(bh);
591*4882a593Smuzhiyun if (buffer_dirty(bh) ||
592*4882a593Smuzhiyun (jh && (jh->b_transaction != transaction ||
593*4882a593Smuzhiyun jh->b_next_transaction))) {
594*4882a593Smuzhiyun redirty_page_for_writepage(wbc, page);
595*4882a593Smuzhiyun goto out;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun } while ((bh = bh->b_this_page) != head);
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun out:
600*4882a593Smuzhiyun return AOP_WRITEPAGE_ACTIVATE;
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun
ext4_journalled_submit_inode_data_buffers(struct jbd2_inode * jinode)603*4882a593Smuzhiyun static int ext4_journalled_submit_inode_data_buffers(struct jbd2_inode *jinode)
604*4882a593Smuzhiyun {
605*4882a593Smuzhiyun struct address_space *mapping = jinode->i_vfs_inode->i_mapping;
606*4882a593Smuzhiyun struct writeback_control wbc = {
607*4882a593Smuzhiyun .sync_mode = WB_SYNC_ALL,
608*4882a593Smuzhiyun .nr_to_write = LONG_MAX,
609*4882a593Smuzhiyun .range_start = jinode->i_dirty_start,
610*4882a593Smuzhiyun .range_end = jinode->i_dirty_end,
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun return write_cache_pages(mapping, &wbc,
614*4882a593Smuzhiyun ext4_journalled_writepage_callback,
615*4882a593Smuzhiyun jinode->i_transaction);
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun
ext4_journal_submit_inode_data_buffers(struct jbd2_inode * jinode)618*4882a593Smuzhiyun static int ext4_journal_submit_inode_data_buffers(struct jbd2_inode *jinode)
619*4882a593Smuzhiyun {
620*4882a593Smuzhiyun int ret;
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun if (ext4_should_journal_data(jinode->i_vfs_inode))
623*4882a593Smuzhiyun ret = ext4_journalled_submit_inode_data_buffers(jinode);
624*4882a593Smuzhiyun else
625*4882a593Smuzhiyun ret = jbd2_journal_submit_inode_data_buffers(jinode);
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun return ret;
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun
ext4_journal_finish_inode_data_buffers(struct jbd2_inode * jinode)630*4882a593Smuzhiyun static int ext4_journal_finish_inode_data_buffers(struct jbd2_inode *jinode)
631*4882a593Smuzhiyun {
632*4882a593Smuzhiyun int ret = 0;
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun if (!ext4_should_journal_data(jinode->i_vfs_inode))
635*4882a593Smuzhiyun ret = jbd2_journal_finish_inode_data_buffers(jinode);
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun return ret;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun
system_going_down(void)640*4882a593Smuzhiyun static bool system_going_down(void)
641*4882a593Smuzhiyun {
642*4882a593Smuzhiyun return system_state == SYSTEM_HALT || system_state == SYSTEM_POWER_OFF
643*4882a593Smuzhiyun || system_state == SYSTEM_RESTART;
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun /* Deal with the reporting of failure conditions on a filesystem such as
647*4882a593Smuzhiyun * inconsistencies detected or read IO failures.
648*4882a593Smuzhiyun *
649*4882a593Smuzhiyun * On ext2, we can store the error state of the filesystem in the
650*4882a593Smuzhiyun * superblock. That is not possible on ext4, because we may have other
651*4882a593Smuzhiyun * write ordering constraints on the superblock which prevent us from
652*4882a593Smuzhiyun * writing it out straight away; and given that the journal is about to
653*4882a593Smuzhiyun * be aborted, we can't rely on the current, or future, transactions to
654*4882a593Smuzhiyun * write out the superblock safely.
655*4882a593Smuzhiyun *
656*4882a593Smuzhiyun * We'll just use the jbd2_journal_abort() error code to record an error in
657*4882a593Smuzhiyun * the journal instead. On recovery, the journal will complain about
658*4882a593Smuzhiyun * that error until we've noted it down and cleared it.
659*4882a593Smuzhiyun */
660*4882a593Smuzhiyun
ext4_handle_error(struct super_block * sb)661*4882a593Smuzhiyun static void ext4_handle_error(struct super_block *sb)
662*4882a593Smuzhiyun {
663*4882a593Smuzhiyun journal_t *journal = EXT4_SB(sb)->s_journal;
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun if (test_opt(sb, WARN_ON_ERROR))
666*4882a593Smuzhiyun WARN_ON_ONCE(1);
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun if (sb_rdonly(sb) || test_opt(sb, ERRORS_CONT))
669*4882a593Smuzhiyun return;
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
672*4882a593Smuzhiyun if (journal)
673*4882a593Smuzhiyun jbd2_journal_abort(journal, -EIO);
674*4882a593Smuzhiyun /*
675*4882a593Smuzhiyun * We force ERRORS_RO behavior when system is rebooting. Otherwise we
676*4882a593Smuzhiyun * could panic during 'reboot -f' as the underlying device got already
677*4882a593Smuzhiyun * disabled.
678*4882a593Smuzhiyun */
679*4882a593Smuzhiyun if (test_opt(sb, ERRORS_RO) || system_going_down()) {
680*4882a593Smuzhiyun ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");
681*4882a593Smuzhiyun /*
682*4882a593Smuzhiyun * Make sure updated value of ->s_mount_flags will be visible
683*4882a593Smuzhiyun * before ->s_flags update
684*4882a593Smuzhiyun */
685*4882a593Smuzhiyun smp_wmb();
686*4882a593Smuzhiyun sb->s_flags |= SB_RDONLY;
687*4882a593Smuzhiyun } else if (test_opt(sb, ERRORS_PANIC)) {
688*4882a593Smuzhiyun panic("EXT4-fs (device %s): panic forced after error\n",
689*4882a593Smuzhiyun sb->s_id);
690*4882a593Smuzhiyun }
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun #define ext4_error_ratelimit(sb) \
694*4882a593Smuzhiyun ___ratelimit(&(EXT4_SB(sb)->s_err_ratelimit_state), \
695*4882a593Smuzhiyun "EXT4-fs error")
696*4882a593Smuzhiyun
__ext4_error(struct super_block * sb,const char * function,unsigned int line,int error,__u64 block,const char * fmt,...)697*4882a593Smuzhiyun void __ext4_error(struct super_block *sb, const char *function,
698*4882a593Smuzhiyun unsigned int line, int error, __u64 block,
699*4882a593Smuzhiyun const char *fmt, ...)
700*4882a593Smuzhiyun {
701*4882a593Smuzhiyun struct va_format vaf;
702*4882a593Smuzhiyun va_list args;
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
705*4882a593Smuzhiyun return;
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun trace_ext4_error(sb, function, line);
708*4882a593Smuzhiyun if (ext4_error_ratelimit(sb)) {
709*4882a593Smuzhiyun va_start(args, fmt);
710*4882a593Smuzhiyun vaf.fmt = fmt;
711*4882a593Smuzhiyun vaf.va = &args;
712*4882a593Smuzhiyun printk(KERN_CRIT
713*4882a593Smuzhiyun "EXT4-fs error (device %s): %s:%d: comm %s: %pV\n",
714*4882a593Smuzhiyun sb->s_id, function, line, current->comm, &vaf);
715*4882a593Smuzhiyun va_end(args);
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun save_error_info(sb, error, 0, block, function, line);
718*4882a593Smuzhiyun ext4_handle_error(sb);
719*4882a593Smuzhiyun }
720*4882a593Smuzhiyun
__ext4_error_inode(struct inode * inode,const char * function,unsigned int line,ext4_fsblk_t block,int error,const char * fmt,...)721*4882a593Smuzhiyun void __ext4_error_inode(struct inode *inode, const char *function,
722*4882a593Smuzhiyun unsigned int line, ext4_fsblk_t block, int error,
723*4882a593Smuzhiyun const char *fmt, ...)
724*4882a593Smuzhiyun {
725*4882a593Smuzhiyun va_list args;
726*4882a593Smuzhiyun struct va_format vaf;
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
729*4882a593Smuzhiyun return;
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun trace_ext4_error(inode->i_sb, function, line);
732*4882a593Smuzhiyun if (ext4_error_ratelimit(inode->i_sb)) {
733*4882a593Smuzhiyun va_start(args, fmt);
734*4882a593Smuzhiyun vaf.fmt = fmt;
735*4882a593Smuzhiyun vaf.va = &args;
736*4882a593Smuzhiyun if (block)
737*4882a593Smuzhiyun printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: "
738*4882a593Smuzhiyun "inode #%lu: block %llu: comm %s: %pV\n",
739*4882a593Smuzhiyun inode->i_sb->s_id, function, line, inode->i_ino,
740*4882a593Smuzhiyun block, current->comm, &vaf);
741*4882a593Smuzhiyun else
742*4882a593Smuzhiyun printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: "
743*4882a593Smuzhiyun "inode #%lu: comm %s: %pV\n",
744*4882a593Smuzhiyun inode->i_sb->s_id, function, line, inode->i_ino,
745*4882a593Smuzhiyun current->comm, &vaf);
746*4882a593Smuzhiyun va_end(args);
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun save_error_info(inode->i_sb, error, inode->i_ino, block,
749*4882a593Smuzhiyun function, line);
750*4882a593Smuzhiyun ext4_handle_error(inode->i_sb);
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun
__ext4_error_file(struct file * file,const char * function,unsigned int line,ext4_fsblk_t block,const char * fmt,...)753*4882a593Smuzhiyun void __ext4_error_file(struct file *file, const char *function,
754*4882a593Smuzhiyun unsigned int line, ext4_fsblk_t block,
755*4882a593Smuzhiyun const char *fmt, ...)
756*4882a593Smuzhiyun {
757*4882a593Smuzhiyun va_list args;
758*4882a593Smuzhiyun struct va_format vaf;
759*4882a593Smuzhiyun struct inode *inode = file_inode(file);
760*4882a593Smuzhiyun char pathname[80], *path;
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
763*4882a593Smuzhiyun return;
764*4882a593Smuzhiyun
765*4882a593Smuzhiyun trace_ext4_error(inode->i_sb, function, line);
766*4882a593Smuzhiyun if (ext4_error_ratelimit(inode->i_sb)) {
767*4882a593Smuzhiyun path = file_path(file, pathname, sizeof(pathname));
768*4882a593Smuzhiyun if (IS_ERR(path))
769*4882a593Smuzhiyun path = "(unknown)";
770*4882a593Smuzhiyun va_start(args, fmt);
771*4882a593Smuzhiyun vaf.fmt = fmt;
772*4882a593Smuzhiyun vaf.va = &args;
773*4882a593Smuzhiyun if (block)
774*4882a593Smuzhiyun printk(KERN_CRIT
775*4882a593Smuzhiyun "EXT4-fs error (device %s): %s:%d: inode #%lu: "
776*4882a593Smuzhiyun "block %llu: comm %s: path %s: %pV\n",
777*4882a593Smuzhiyun inode->i_sb->s_id, function, line, inode->i_ino,
778*4882a593Smuzhiyun block, current->comm, path, &vaf);
779*4882a593Smuzhiyun else
780*4882a593Smuzhiyun printk(KERN_CRIT
781*4882a593Smuzhiyun "EXT4-fs error (device %s): %s:%d: inode #%lu: "
782*4882a593Smuzhiyun "comm %s: path %s: %pV\n",
783*4882a593Smuzhiyun inode->i_sb->s_id, function, line, inode->i_ino,
784*4882a593Smuzhiyun current->comm, path, &vaf);
785*4882a593Smuzhiyun va_end(args);
786*4882a593Smuzhiyun }
787*4882a593Smuzhiyun save_error_info(inode->i_sb, EFSCORRUPTED, inode->i_ino, block,
788*4882a593Smuzhiyun function, line);
789*4882a593Smuzhiyun ext4_handle_error(inode->i_sb);
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun
ext4_decode_error(struct super_block * sb,int errno,char nbuf[16])792*4882a593Smuzhiyun const char *ext4_decode_error(struct super_block *sb, int errno,
793*4882a593Smuzhiyun char nbuf[16])
794*4882a593Smuzhiyun {
795*4882a593Smuzhiyun char *errstr = NULL;
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun switch (errno) {
798*4882a593Smuzhiyun case -EFSCORRUPTED:
799*4882a593Smuzhiyun errstr = "Corrupt filesystem";
800*4882a593Smuzhiyun break;
801*4882a593Smuzhiyun case -EFSBADCRC:
802*4882a593Smuzhiyun errstr = "Filesystem failed CRC";
803*4882a593Smuzhiyun break;
804*4882a593Smuzhiyun case -EIO:
805*4882a593Smuzhiyun errstr = "IO failure";
806*4882a593Smuzhiyun break;
807*4882a593Smuzhiyun case -ENOMEM:
808*4882a593Smuzhiyun errstr = "Out of memory";
809*4882a593Smuzhiyun break;
810*4882a593Smuzhiyun case -EROFS:
811*4882a593Smuzhiyun if (!sb || (EXT4_SB(sb)->s_journal &&
812*4882a593Smuzhiyun EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT))
813*4882a593Smuzhiyun errstr = "Journal has aborted";
814*4882a593Smuzhiyun else
815*4882a593Smuzhiyun errstr = "Readonly filesystem";
816*4882a593Smuzhiyun break;
817*4882a593Smuzhiyun default:
818*4882a593Smuzhiyun /* If the caller passed in an extra buffer for unknown
819*4882a593Smuzhiyun * errors, textualise them now. Else we just return
820*4882a593Smuzhiyun * NULL. */
821*4882a593Smuzhiyun if (nbuf) {
822*4882a593Smuzhiyun /* Check for truncated error codes... */
823*4882a593Smuzhiyun if (snprintf(nbuf, 16, "error %d", -errno) >= 0)
824*4882a593Smuzhiyun errstr = nbuf;
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun break;
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun return errstr;
830*4882a593Smuzhiyun }
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun /* __ext4_std_error decodes expected errors from journaling functions
833*4882a593Smuzhiyun * automatically and invokes the appropriate error response. */
834*4882a593Smuzhiyun
__ext4_std_error(struct super_block * sb,const char * function,unsigned int line,int errno)835*4882a593Smuzhiyun void __ext4_std_error(struct super_block *sb, const char *function,
836*4882a593Smuzhiyun unsigned int line, int errno)
837*4882a593Smuzhiyun {
838*4882a593Smuzhiyun char nbuf[16];
839*4882a593Smuzhiyun const char *errstr;
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
842*4882a593Smuzhiyun return;
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun /* Special case: if the error is EROFS, and we're not already
845*4882a593Smuzhiyun * inside a transaction, then there's really no point in logging
846*4882a593Smuzhiyun * an error. */
847*4882a593Smuzhiyun if (errno == -EROFS && journal_current_handle() == NULL && sb_rdonly(sb))
848*4882a593Smuzhiyun return;
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun if (ext4_error_ratelimit(sb)) {
851*4882a593Smuzhiyun errstr = ext4_decode_error(sb, errno, nbuf);
852*4882a593Smuzhiyun printk(KERN_CRIT "EXT4-fs error (device %s) in %s:%d: %s\n",
853*4882a593Smuzhiyun sb->s_id, function, line, errstr);
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun save_error_info(sb, -errno, 0, 0, function, line);
857*4882a593Smuzhiyun ext4_handle_error(sb);
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun /*
861*4882a593Smuzhiyun * ext4_abort is a much stronger failure handler than ext4_error. The
862*4882a593Smuzhiyun * abort function may be used to deal with unrecoverable failures such
863*4882a593Smuzhiyun * as journal IO errors or ENOMEM at a critical moment in log management.
864*4882a593Smuzhiyun *
865*4882a593Smuzhiyun * We unconditionally force the filesystem into an ABORT|READONLY state,
866*4882a593Smuzhiyun * unless the error response on the fs has been set to panic in which
867*4882a593Smuzhiyun * case we take the easy way out and panic immediately.
868*4882a593Smuzhiyun */
869*4882a593Smuzhiyun
__ext4_abort(struct super_block * sb,const char * function,unsigned int line,int error,const char * fmt,...)870*4882a593Smuzhiyun void __ext4_abort(struct super_block *sb, const char *function,
871*4882a593Smuzhiyun unsigned int line, int error, const char *fmt, ...)
872*4882a593Smuzhiyun {
873*4882a593Smuzhiyun struct va_format vaf;
874*4882a593Smuzhiyun va_list args;
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
877*4882a593Smuzhiyun return;
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun save_error_info(sb, error, 0, 0, function, line);
880*4882a593Smuzhiyun va_start(args, fmt);
881*4882a593Smuzhiyun vaf.fmt = fmt;
882*4882a593Smuzhiyun vaf.va = &args;
883*4882a593Smuzhiyun printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: %pV\n",
884*4882a593Smuzhiyun sb->s_id, function, line, &vaf);
885*4882a593Smuzhiyun va_end(args);
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun if (sb_rdonly(sb) == 0) {
888*4882a593Smuzhiyun ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
889*4882a593Smuzhiyun if (EXT4_SB(sb)->s_journal)
890*4882a593Smuzhiyun jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");
893*4882a593Smuzhiyun /*
894*4882a593Smuzhiyun * Make sure updated value of ->s_mount_flags will be visible
895*4882a593Smuzhiyun * before ->s_flags update
896*4882a593Smuzhiyun */
897*4882a593Smuzhiyun smp_wmb();
898*4882a593Smuzhiyun sb->s_flags |= SB_RDONLY;
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun if (test_opt(sb, ERRORS_PANIC) && !system_going_down())
901*4882a593Smuzhiyun panic("EXT4-fs panic from previous error\n");
902*4882a593Smuzhiyun }
903*4882a593Smuzhiyun
__ext4_msg(struct super_block * sb,const char * prefix,const char * fmt,...)904*4882a593Smuzhiyun void __ext4_msg(struct super_block *sb,
905*4882a593Smuzhiyun const char *prefix, const char *fmt, ...)
906*4882a593Smuzhiyun {
907*4882a593Smuzhiyun struct va_format vaf;
908*4882a593Smuzhiyun va_list args;
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun atomic_inc(&EXT4_SB(sb)->s_msg_count);
911*4882a593Smuzhiyun if (!___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
912*4882a593Smuzhiyun return;
913*4882a593Smuzhiyun
914*4882a593Smuzhiyun va_start(args, fmt);
915*4882a593Smuzhiyun vaf.fmt = fmt;
916*4882a593Smuzhiyun vaf.va = &args;
917*4882a593Smuzhiyun printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
918*4882a593Smuzhiyun va_end(args);
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun
ext4_warning_ratelimit(struct super_block * sb)921*4882a593Smuzhiyun static int ext4_warning_ratelimit(struct super_block *sb)
922*4882a593Smuzhiyun {
923*4882a593Smuzhiyun atomic_inc(&EXT4_SB(sb)->s_warning_count);
924*4882a593Smuzhiyun return ___ratelimit(&(EXT4_SB(sb)->s_warning_ratelimit_state),
925*4882a593Smuzhiyun "EXT4-fs warning");
926*4882a593Smuzhiyun }
927*4882a593Smuzhiyun
__ext4_warning(struct super_block * sb,const char * function,unsigned int line,const char * fmt,...)928*4882a593Smuzhiyun void __ext4_warning(struct super_block *sb, const char *function,
929*4882a593Smuzhiyun unsigned int line, const char *fmt, ...)
930*4882a593Smuzhiyun {
931*4882a593Smuzhiyun struct va_format vaf;
932*4882a593Smuzhiyun va_list args;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun if (!ext4_warning_ratelimit(sb))
935*4882a593Smuzhiyun return;
936*4882a593Smuzhiyun
937*4882a593Smuzhiyun va_start(args, fmt);
938*4882a593Smuzhiyun vaf.fmt = fmt;
939*4882a593Smuzhiyun vaf.va = &args;
940*4882a593Smuzhiyun printk(KERN_WARNING "EXT4-fs warning (device %s): %s:%d: %pV\n",
941*4882a593Smuzhiyun sb->s_id, function, line, &vaf);
942*4882a593Smuzhiyun va_end(args);
943*4882a593Smuzhiyun }
944*4882a593Smuzhiyun
__ext4_warning_inode(const struct inode * inode,const char * function,unsigned int line,const char * fmt,...)945*4882a593Smuzhiyun void __ext4_warning_inode(const struct inode *inode, const char *function,
946*4882a593Smuzhiyun unsigned int line, const char *fmt, ...)
947*4882a593Smuzhiyun {
948*4882a593Smuzhiyun struct va_format vaf;
949*4882a593Smuzhiyun va_list args;
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun if (!ext4_warning_ratelimit(inode->i_sb))
952*4882a593Smuzhiyun return;
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun va_start(args, fmt);
955*4882a593Smuzhiyun vaf.fmt = fmt;
956*4882a593Smuzhiyun vaf.va = &args;
957*4882a593Smuzhiyun printk(KERN_WARNING "EXT4-fs warning (device %s): %s:%d: "
958*4882a593Smuzhiyun "inode #%lu: comm %s: %pV\n", inode->i_sb->s_id,
959*4882a593Smuzhiyun function, line, inode->i_ino, current->comm, &vaf);
960*4882a593Smuzhiyun va_end(args);
961*4882a593Smuzhiyun }
962*4882a593Smuzhiyun
__ext4_grp_locked_error(const char * function,unsigned int line,struct super_block * sb,ext4_group_t grp,unsigned long ino,ext4_fsblk_t block,const char * fmt,...)963*4882a593Smuzhiyun void __ext4_grp_locked_error(const char *function, unsigned int line,
964*4882a593Smuzhiyun struct super_block *sb, ext4_group_t grp,
965*4882a593Smuzhiyun unsigned long ino, ext4_fsblk_t block,
966*4882a593Smuzhiyun const char *fmt, ...)
967*4882a593Smuzhiyun __releases(bitlock)
968*4882a593Smuzhiyun __acquires(bitlock)
969*4882a593Smuzhiyun {
970*4882a593Smuzhiyun struct va_format vaf;
971*4882a593Smuzhiyun va_list args;
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
974*4882a593Smuzhiyun return;
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun trace_ext4_error(sb, function, line);
977*4882a593Smuzhiyun __save_error_info(sb, EFSCORRUPTED, ino, block, function, line);
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun if (ext4_error_ratelimit(sb)) {
980*4882a593Smuzhiyun va_start(args, fmt);
981*4882a593Smuzhiyun vaf.fmt = fmt;
982*4882a593Smuzhiyun vaf.va = &args;
983*4882a593Smuzhiyun printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: group %u, ",
984*4882a593Smuzhiyun sb->s_id, function, line, grp);
985*4882a593Smuzhiyun if (ino)
986*4882a593Smuzhiyun printk(KERN_CONT "inode %lu: ", ino);
987*4882a593Smuzhiyun if (block)
988*4882a593Smuzhiyun printk(KERN_CONT "block %llu:",
989*4882a593Smuzhiyun (unsigned long long) block);
990*4882a593Smuzhiyun printk(KERN_CONT "%pV\n", &vaf);
991*4882a593Smuzhiyun va_end(args);
992*4882a593Smuzhiyun }
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun if (test_opt(sb, WARN_ON_ERROR))
995*4882a593Smuzhiyun WARN_ON_ONCE(1);
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun if (test_opt(sb, ERRORS_CONT)) {
998*4882a593Smuzhiyun ext4_commit_super(sb, 0);
999*4882a593Smuzhiyun return;
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun ext4_unlock_group(sb, grp);
1003*4882a593Smuzhiyun ext4_commit_super(sb, 1);
1004*4882a593Smuzhiyun ext4_handle_error(sb);
1005*4882a593Smuzhiyun /*
1006*4882a593Smuzhiyun * We only get here in the ERRORS_RO case; relocking the group
1007*4882a593Smuzhiyun * may be dangerous, but nothing bad will happen since the
1008*4882a593Smuzhiyun * filesystem will have already been marked read/only and the
1009*4882a593Smuzhiyun * journal has been aborted. We return 1 as a hint to callers
1010*4882a593Smuzhiyun * who might what to use the return value from
1011*4882a593Smuzhiyun * ext4_grp_locked_error() to distinguish between the
1012*4882a593Smuzhiyun * ERRORS_CONT and ERRORS_RO case, and perhaps return more
1013*4882a593Smuzhiyun * aggressively from the ext4 function in question, with a
1014*4882a593Smuzhiyun * more appropriate error code.
1015*4882a593Smuzhiyun */
1016*4882a593Smuzhiyun ext4_lock_group(sb, grp);
1017*4882a593Smuzhiyun return;
1018*4882a593Smuzhiyun }
1019*4882a593Smuzhiyun
ext4_mark_group_bitmap_corrupted(struct super_block * sb,ext4_group_t group,unsigned int flags)1020*4882a593Smuzhiyun void ext4_mark_group_bitmap_corrupted(struct super_block *sb,
1021*4882a593Smuzhiyun ext4_group_t group,
1022*4882a593Smuzhiyun unsigned int flags)
1023*4882a593Smuzhiyun {
1024*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
1025*4882a593Smuzhiyun struct ext4_group_info *grp = ext4_get_group_info(sb, group);
1026*4882a593Smuzhiyun struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL);
1027*4882a593Smuzhiyun int ret;
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) {
1030*4882a593Smuzhiyun ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT,
1031*4882a593Smuzhiyun &grp->bb_state);
1032*4882a593Smuzhiyun if (!ret)
1033*4882a593Smuzhiyun percpu_counter_sub(&sbi->s_freeclusters_counter,
1034*4882a593Smuzhiyun grp->bb_free);
1035*4882a593Smuzhiyun }
1036*4882a593Smuzhiyun
1037*4882a593Smuzhiyun if (flags & EXT4_GROUP_INFO_IBITMAP_CORRUPT) {
1038*4882a593Smuzhiyun ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT,
1039*4882a593Smuzhiyun &grp->bb_state);
1040*4882a593Smuzhiyun if (!ret && gdp) {
1041*4882a593Smuzhiyun int count;
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun count = ext4_free_inodes_count(sb, gdp);
1044*4882a593Smuzhiyun percpu_counter_sub(&sbi->s_freeinodes_counter,
1045*4882a593Smuzhiyun count);
1046*4882a593Smuzhiyun }
1047*4882a593Smuzhiyun }
1048*4882a593Smuzhiyun }
1049*4882a593Smuzhiyun
ext4_update_dynamic_rev(struct super_block * sb)1050*4882a593Smuzhiyun void ext4_update_dynamic_rev(struct super_block *sb)
1051*4882a593Smuzhiyun {
1052*4882a593Smuzhiyun struct ext4_super_block *es = EXT4_SB(sb)->s_es;
1053*4882a593Smuzhiyun
1054*4882a593Smuzhiyun if (le32_to_cpu(es->s_rev_level) > EXT4_GOOD_OLD_REV)
1055*4882a593Smuzhiyun return;
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun ext4_warning(sb,
1058*4882a593Smuzhiyun "updating to rev %d because of new feature flag, "
1059*4882a593Smuzhiyun "running e2fsck is recommended",
1060*4882a593Smuzhiyun EXT4_DYNAMIC_REV);
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun es->s_first_ino = cpu_to_le32(EXT4_GOOD_OLD_FIRST_INO);
1063*4882a593Smuzhiyun es->s_inode_size = cpu_to_le16(EXT4_GOOD_OLD_INODE_SIZE);
1064*4882a593Smuzhiyun es->s_rev_level = cpu_to_le32(EXT4_DYNAMIC_REV);
1065*4882a593Smuzhiyun /* leave es->s_feature_*compat flags alone */
1066*4882a593Smuzhiyun /* es->s_uuid will be set by e2fsck if empty */
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun /*
1069*4882a593Smuzhiyun * The rest of the superblock fields should be zero, and if not it
1070*4882a593Smuzhiyun * means they are likely already in use, so leave them alone. We
1071*4882a593Smuzhiyun * can leave it up to e2fsck to clean up any inconsistencies there.
1072*4882a593Smuzhiyun */
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun /*
1076*4882a593Smuzhiyun * Open the external journal device
1077*4882a593Smuzhiyun */
ext4_blkdev_get(dev_t dev,struct super_block * sb)1078*4882a593Smuzhiyun static struct block_device *ext4_blkdev_get(dev_t dev, struct super_block *sb)
1079*4882a593Smuzhiyun {
1080*4882a593Smuzhiyun struct block_device *bdev;
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb);
1083*4882a593Smuzhiyun if (IS_ERR(bdev))
1084*4882a593Smuzhiyun goto fail;
1085*4882a593Smuzhiyun return bdev;
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun fail:
1088*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
1089*4882a593Smuzhiyun "failed to open journal device unknown-block(%u,%u) %ld",
1090*4882a593Smuzhiyun MAJOR(dev), MINOR(dev), PTR_ERR(bdev));
1091*4882a593Smuzhiyun return NULL;
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun /*
1095*4882a593Smuzhiyun * Release the journal device
1096*4882a593Smuzhiyun */
ext4_blkdev_put(struct block_device * bdev)1097*4882a593Smuzhiyun static void ext4_blkdev_put(struct block_device *bdev)
1098*4882a593Smuzhiyun {
1099*4882a593Smuzhiyun blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun
ext4_blkdev_remove(struct ext4_sb_info * sbi)1102*4882a593Smuzhiyun static void ext4_blkdev_remove(struct ext4_sb_info *sbi)
1103*4882a593Smuzhiyun {
1104*4882a593Smuzhiyun struct block_device *bdev;
1105*4882a593Smuzhiyun bdev = sbi->s_journal_bdev;
1106*4882a593Smuzhiyun if (bdev) {
1107*4882a593Smuzhiyun ext4_blkdev_put(bdev);
1108*4882a593Smuzhiyun sbi->s_journal_bdev = NULL;
1109*4882a593Smuzhiyun }
1110*4882a593Smuzhiyun }
1111*4882a593Smuzhiyun
orphan_list_entry(struct list_head * l)1112*4882a593Smuzhiyun static inline struct inode *orphan_list_entry(struct list_head *l)
1113*4882a593Smuzhiyun {
1114*4882a593Smuzhiyun return &list_entry(l, struct ext4_inode_info, i_orphan)->vfs_inode;
1115*4882a593Smuzhiyun }
1116*4882a593Smuzhiyun
dump_orphan_list(struct super_block * sb,struct ext4_sb_info * sbi)1117*4882a593Smuzhiyun static void dump_orphan_list(struct super_block *sb, struct ext4_sb_info *sbi)
1118*4882a593Smuzhiyun {
1119*4882a593Smuzhiyun struct list_head *l;
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "sb orphan head is %d",
1122*4882a593Smuzhiyun le32_to_cpu(sbi->s_es->s_last_orphan));
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun printk(KERN_ERR "sb_info orphan list:\n");
1125*4882a593Smuzhiyun list_for_each(l, &sbi->s_orphan) {
1126*4882a593Smuzhiyun struct inode *inode = orphan_list_entry(l);
1127*4882a593Smuzhiyun printk(KERN_ERR " "
1128*4882a593Smuzhiyun "inode %s:%lu at %p: mode %o, nlink %d, next %d\n",
1129*4882a593Smuzhiyun inode->i_sb->s_id, inode->i_ino, inode,
1130*4882a593Smuzhiyun inode->i_mode, inode->i_nlink,
1131*4882a593Smuzhiyun NEXT_ORPHAN(inode));
1132*4882a593Smuzhiyun }
1133*4882a593Smuzhiyun }
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
1136*4882a593Smuzhiyun static int ext4_quota_off(struct super_block *sb, int type);
1137*4882a593Smuzhiyun
ext4_quota_off_umount(struct super_block * sb)1138*4882a593Smuzhiyun static inline void ext4_quota_off_umount(struct super_block *sb)
1139*4882a593Smuzhiyun {
1140*4882a593Smuzhiyun int type;
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun /* Use our quota_off function to clear inode flags etc. */
1143*4882a593Smuzhiyun for (type = 0; type < EXT4_MAXQUOTAS; type++)
1144*4882a593Smuzhiyun ext4_quota_off(sb, type);
1145*4882a593Smuzhiyun }
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun /*
1148*4882a593Smuzhiyun * This is a helper function which is used in the mount/remount
1149*4882a593Smuzhiyun * codepaths (which holds s_umount) to fetch the quota file name.
1150*4882a593Smuzhiyun */
get_qf_name(struct super_block * sb,struct ext4_sb_info * sbi,int type)1151*4882a593Smuzhiyun static inline char *get_qf_name(struct super_block *sb,
1152*4882a593Smuzhiyun struct ext4_sb_info *sbi,
1153*4882a593Smuzhiyun int type)
1154*4882a593Smuzhiyun {
1155*4882a593Smuzhiyun return rcu_dereference_protected(sbi->s_qf_names[type],
1156*4882a593Smuzhiyun lockdep_is_held(&sb->s_umount));
1157*4882a593Smuzhiyun }
1158*4882a593Smuzhiyun #else
ext4_quota_off_umount(struct super_block * sb)1159*4882a593Smuzhiyun static inline void ext4_quota_off_umount(struct super_block *sb)
1160*4882a593Smuzhiyun {
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun #endif
1163*4882a593Smuzhiyun
ext4_put_super(struct super_block * sb)1164*4882a593Smuzhiyun static void ext4_put_super(struct super_block *sb)
1165*4882a593Smuzhiyun {
1166*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
1167*4882a593Smuzhiyun struct ext4_super_block *es = sbi->s_es;
1168*4882a593Smuzhiyun struct buffer_head **group_desc;
1169*4882a593Smuzhiyun struct flex_groups **flex_groups;
1170*4882a593Smuzhiyun int aborted = 0;
1171*4882a593Smuzhiyun int i, err;
1172*4882a593Smuzhiyun
1173*4882a593Smuzhiyun /*
1174*4882a593Smuzhiyun * Unregister sysfs before destroying jbd2 journal.
1175*4882a593Smuzhiyun * Since we could still access attr_journal_task attribute via sysfs
1176*4882a593Smuzhiyun * path which could have sbi->s_journal->j_task as NULL
1177*4882a593Smuzhiyun * Unregister sysfs before flush sbi->s_error_work.
1178*4882a593Smuzhiyun * Since user may read /proc/fs/ext4/xx/mb_groups during umount, If
1179*4882a593Smuzhiyun * read metadata verify failed then will queue error work.
1180*4882a593Smuzhiyun * flush_stashed_error_work will call start_this_handle may trigger
1181*4882a593Smuzhiyun * BUG_ON.
1182*4882a593Smuzhiyun */
1183*4882a593Smuzhiyun ext4_unregister_sysfs(sb);
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun ext4_unregister_li_request(sb);
1186*4882a593Smuzhiyun ext4_quota_off_umount(sb);
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun destroy_workqueue(sbi->rsv_conversion_wq);
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun if (sbi->s_journal) {
1191*4882a593Smuzhiyun aborted = is_journal_aborted(sbi->s_journal);
1192*4882a593Smuzhiyun err = jbd2_journal_destroy(sbi->s_journal);
1193*4882a593Smuzhiyun sbi->s_journal = NULL;
1194*4882a593Smuzhiyun if ((err < 0) && !aborted) {
1195*4882a593Smuzhiyun ext4_abort(sb, -err, "Couldn't clean up the journal");
1196*4882a593Smuzhiyun }
1197*4882a593Smuzhiyun }
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun ext4_es_unregister_shrinker(sbi);
1200*4882a593Smuzhiyun del_timer_sync(&sbi->s_err_report);
1201*4882a593Smuzhiyun ext4_release_system_zone(sb);
1202*4882a593Smuzhiyun ext4_mb_release(sb);
1203*4882a593Smuzhiyun ext4_ext_release(sb);
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun if (!sb_rdonly(sb) && !aborted) {
1206*4882a593Smuzhiyun ext4_clear_feature_journal_needs_recovery(sb);
1207*4882a593Smuzhiyun es->s_state = cpu_to_le16(sbi->s_mount_state);
1208*4882a593Smuzhiyun }
1209*4882a593Smuzhiyun if (!sb_rdonly(sb))
1210*4882a593Smuzhiyun ext4_commit_super(sb, 1);
1211*4882a593Smuzhiyun
1212*4882a593Smuzhiyun rcu_read_lock();
1213*4882a593Smuzhiyun group_desc = rcu_dereference(sbi->s_group_desc);
1214*4882a593Smuzhiyun for (i = 0; i < sbi->s_gdb_count; i++)
1215*4882a593Smuzhiyun brelse(group_desc[i]);
1216*4882a593Smuzhiyun kvfree(group_desc);
1217*4882a593Smuzhiyun flex_groups = rcu_dereference(sbi->s_flex_groups);
1218*4882a593Smuzhiyun if (flex_groups) {
1219*4882a593Smuzhiyun for (i = 0; i < sbi->s_flex_groups_allocated; i++)
1220*4882a593Smuzhiyun kvfree(flex_groups[i]);
1221*4882a593Smuzhiyun kvfree(flex_groups);
1222*4882a593Smuzhiyun }
1223*4882a593Smuzhiyun rcu_read_unlock();
1224*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_freeclusters_counter);
1225*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_freeinodes_counter);
1226*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_dirs_counter);
1227*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_dirtyclusters_counter);
1228*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit);
1229*4882a593Smuzhiyun percpu_free_rwsem(&sbi->s_writepages_rwsem);
1230*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
1231*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++)
1232*4882a593Smuzhiyun kfree(get_qf_name(sb, sbi, i));
1233*4882a593Smuzhiyun #endif
1234*4882a593Smuzhiyun
1235*4882a593Smuzhiyun /* Debugging code just in case the in-memory inode orphan list
1236*4882a593Smuzhiyun * isn't empty. The on-disk one can be non-empty if we've
1237*4882a593Smuzhiyun * detected an error and taken the fs readonly, but the
1238*4882a593Smuzhiyun * in-memory list had better be clean by this point. */
1239*4882a593Smuzhiyun if (!list_empty(&sbi->s_orphan))
1240*4882a593Smuzhiyun dump_orphan_list(sb, sbi);
1241*4882a593Smuzhiyun J_ASSERT(list_empty(&sbi->s_orphan));
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun sync_blockdev(sb->s_bdev);
1244*4882a593Smuzhiyun invalidate_bdev(sb->s_bdev);
1245*4882a593Smuzhiyun if (sbi->s_journal_bdev && sbi->s_journal_bdev != sb->s_bdev) {
1246*4882a593Smuzhiyun /*
1247*4882a593Smuzhiyun * Invalidate the journal device's buffers. We don't want them
1248*4882a593Smuzhiyun * floating about in memory - the physical journal device may
1249*4882a593Smuzhiyun * hotswapped, and it breaks the `ro-after' testing code.
1250*4882a593Smuzhiyun */
1251*4882a593Smuzhiyun sync_blockdev(sbi->s_journal_bdev);
1252*4882a593Smuzhiyun invalidate_bdev(sbi->s_journal_bdev);
1253*4882a593Smuzhiyun ext4_blkdev_remove(sbi);
1254*4882a593Smuzhiyun }
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun ext4_xattr_destroy_cache(sbi->s_ea_inode_cache);
1257*4882a593Smuzhiyun sbi->s_ea_inode_cache = NULL;
1258*4882a593Smuzhiyun
1259*4882a593Smuzhiyun ext4_xattr_destroy_cache(sbi->s_ea_block_cache);
1260*4882a593Smuzhiyun sbi->s_ea_block_cache = NULL;
1261*4882a593Smuzhiyun
1262*4882a593Smuzhiyun ext4_stop_mmpd(sbi);
1263*4882a593Smuzhiyun
1264*4882a593Smuzhiyun brelse(sbi->s_sbh);
1265*4882a593Smuzhiyun sb->s_fs_info = NULL;
1266*4882a593Smuzhiyun /*
1267*4882a593Smuzhiyun * Now that we are completely done shutting down the
1268*4882a593Smuzhiyun * superblock, we need to actually destroy the kobject.
1269*4882a593Smuzhiyun */
1270*4882a593Smuzhiyun kobject_put(&sbi->s_kobj);
1271*4882a593Smuzhiyun wait_for_completion(&sbi->s_kobj_unregister);
1272*4882a593Smuzhiyun if (sbi->s_chksum_driver)
1273*4882a593Smuzhiyun crypto_free_shash(sbi->s_chksum_driver);
1274*4882a593Smuzhiyun kfree(sbi->s_blockgroup_lock);
1275*4882a593Smuzhiyun fs_put_dax(sbi->s_daxdev);
1276*4882a593Smuzhiyun fscrypt_free_dummy_policy(&sbi->s_dummy_enc_policy);
1277*4882a593Smuzhiyun #ifdef CONFIG_UNICODE
1278*4882a593Smuzhiyun utf8_unload(sb->s_encoding);
1279*4882a593Smuzhiyun #endif
1280*4882a593Smuzhiyun kfree(sbi);
1281*4882a593Smuzhiyun }
1282*4882a593Smuzhiyun
1283*4882a593Smuzhiyun static struct kmem_cache *ext4_inode_cachep;
1284*4882a593Smuzhiyun
1285*4882a593Smuzhiyun /*
1286*4882a593Smuzhiyun * Called inside transaction, so use GFP_NOFS
1287*4882a593Smuzhiyun */
ext4_alloc_inode(struct super_block * sb)1288*4882a593Smuzhiyun static struct inode *ext4_alloc_inode(struct super_block *sb)
1289*4882a593Smuzhiyun {
1290*4882a593Smuzhiyun struct ext4_inode_info *ei;
1291*4882a593Smuzhiyun
1292*4882a593Smuzhiyun ei = kmem_cache_alloc(ext4_inode_cachep, GFP_NOFS);
1293*4882a593Smuzhiyun if (!ei)
1294*4882a593Smuzhiyun return NULL;
1295*4882a593Smuzhiyun
1296*4882a593Smuzhiyun inode_set_iversion(&ei->vfs_inode, 1);
1297*4882a593Smuzhiyun spin_lock_init(&ei->i_raw_lock);
1298*4882a593Smuzhiyun INIT_LIST_HEAD(&ei->i_prealloc_list);
1299*4882a593Smuzhiyun atomic_set(&ei->i_prealloc_active, 0);
1300*4882a593Smuzhiyun spin_lock_init(&ei->i_prealloc_lock);
1301*4882a593Smuzhiyun ext4_es_init_tree(&ei->i_es_tree);
1302*4882a593Smuzhiyun rwlock_init(&ei->i_es_lock);
1303*4882a593Smuzhiyun INIT_LIST_HEAD(&ei->i_es_list);
1304*4882a593Smuzhiyun ei->i_es_all_nr = 0;
1305*4882a593Smuzhiyun ei->i_es_shk_nr = 0;
1306*4882a593Smuzhiyun ei->i_es_shrink_lblk = 0;
1307*4882a593Smuzhiyun ei->i_reserved_data_blocks = 0;
1308*4882a593Smuzhiyun spin_lock_init(&(ei->i_block_reservation_lock));
1309*4882a593Smuzhiyun ext4_init_pending_tree(&ei->i_pending_tree);
1310*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
1311*4882a593Smuzhiyun ei->i_reserved_quota = 0;
1312*4882a593Smuzhiyun memset(&ei->i_dquot, 0, sizeof(ei->i_dquot));
1313*4882a593Smuzhiyun #endif
1314*4882a593Smuzhiyun ei->jinode = NULL;
1315*4882a593Smuzhiyun INIT_LIST_HEAD(&ei->i_rsv_conversion_list);
1316*4882a593Smuzhiyun spin_lock_init(&ei->i_completed_io_lock);
1317*4882a593Smuzhiyun ei->i_sync_tid = 0;
1318*4882a593Smuzhiyun ei->i_datasync_tid = 0;
1319*4882a593Smuzhiyun atomic_set(&ei->i_unwritten, 0);
1320*4882a593Smuzhiyun INIT_WORK(&ei->i_rsv_conversion_work, ext4_end_io_rsv_work);
1321*4882a593Smuzhiyun ext4_fc_init_inode(&ei->vfs_inode);
1322*4882a593Smuzhiyun mutex_init(&ei->i_fc_lock);
1323*4882a593Smuzhiyun return &ei->vfs_inode;
1324*4882a593Smuzhiyun }
1325*4882a593Smuzhiyun
ext4_drop_inode(struct inode * inode)1326*4882a593Smuzhiyun static int ext4_drop_inode(struct inode *inode)
1327*4882a593Smuzhiyun {
1328*4882a593Smuzhiyun int drop = generic_drop_inode(inode);
1329*4882a593Smuzhiyun
1330*4882a593Smuzhiyun if (!drop)
1331*4882a593Smuzhiyun drop = fscrypt_drop_inode(inode);
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun trace_ext4_drop_inode(inode, drop);
1334*4882a593Smuzhiyun return drop;
1335*4882a593Smuzhiyun }
1336*4882a593Smuzhiyun
ext4_free_in_core_inode(struct inode * inode)1337*4882a593Smuzhiyun static void ext4_free_in_core_inode(struct inode *inode)
1338*4882a593Smuzhiyun {
1339*4882a593Smuzhiyun fscrypt_free_inode(inode);
1340*4882a593Smuzhiyun if (!list_empty(&(EXT4_I(inode)->i_fc_list))) {
1341*4882a593Smuzhiyun pr_warn("%s: inode %ld still in fc list",
1342*4882a593Smuzhiyun __func__, inode->i_ino);
1343*4882a593Smuzhiyun }
1344*4882a593Smuzhiyun kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
1345*4882a593Smuzhiyun }
1346*4882a593Smuzhiyun
ext4_destroy_inode(struct inode * inode)1347*4882a593Smuzhiyun static void ext4_destroy_inode(struct inode *inode)
1348*4882a593Smuzhiyun {
1349*4882a593Smuzhiyun if (!list_empty(&(EXT4_I(inode)->i_orphan))) {
1350*4882a593Smuzhiyun ext4_msg(inode->i_sb, KERN_ERR,
1351*4882a593Smuzhiyun "Inode %lu (%p): orphan list check failed!",
1352*4882a593Smuzhiyun inode->i_ino, EXT4_I(inode));
1353*4882a593Smuzhiyun print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS, 16, 4,
1354*4882a593Smuzhiyun EXT4_I(inode), sizeof(struct ext4_inode_info),
1355*4882a593Smuzhiyun true);
1356*4882a593Smuzhiyun dump_stack();
1357*4882a593Smuzhiyun }
1358*4882a593Smuzhiyun
1359*4882a593Smuzhiyun if (EXT4_I(inode)->i_reserved_data_blocks)
1360*4882a593Smuzhiyun ext4_msg(inode->i_sb, KERN_ERR,
1361*4882a593Smuzhiyun "Inode %lu (%p): i_reserved_data_blocks (%u) not cleared!",
1362*4882a593Smuzhiyun inode->i_ino, EXT4_I(inode),
1363*4882a593Smuzhiyun EXT4_I(inode)->i_reserved_data_blocks);
1364*4882a593Smuzhiyun }
1365*4882a593Smuzhiyun
init_once(void * foo)1366*4882a593Smuzhiyun static void init_once(void *foo)
1367*4882a593Smuzhiyun {
1368*4882a593Smuzhiyun struct ext4_inode_info *ei = (struct ext4_inode_info *) foo;
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun INIT_LIST_HEAD(&ei->i_orphan);
1371*4882a593Smuzhiyun init_rwsem(&ei->xattr_sem);
1372*4882a593Smuzhiyun init_rwsem(&ei->i_data_sem);
1373*4882a593Smuzhiyun init_rwsem(&ei->i_mmap_sem);
1374*4882a593Smuzhiyun inode_init_once(&ei->vfs_inode);
1375*4882a593Smuzhiyun ext4_fc_init_inode(&ei->vfs_inode);
1376*4882a593Smuzhiyun }
1377*4882a593Smuzhiyun
init_inodecache(void)1378*4882a593Smuzhiyun static int __init init_inodecache(void)
1379*4882a593Smuzhiyun {
1380*4882a593Smuzhiyun ext4_inode_cachep = kmem_cache_create_usercopy("ext4_inode_cache",
1381*4882a593Smuzhiyun sizeof(struct ext4_inode_info), 0,
1382*4882a593Smuzhiyun (SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
1383*4882a593Smuzhiyun SLAB_ACCOUNT),
1384*4882a593Smuzhiyun offsetof(struct ext4_inode_info, i_data),
1385*4882a593Smuzhiyun sizeof_field(struct ext4_inode_info, i_data),
1386*4882a593Smuzhiyun init_once);
1387*4882a593Smuzhiyun if (ext4_inode_cachep == NULL)
1388*4882a593Smuzhiyun return -ENOMEM;
1389*4882a593Smuzhiyun return 0;
1390*4882a593Smuzhiyun }
1391*4882a593Smuzhiyun
destroy_inodecache(void)1392*4882a593Smuzhiyun static void destroy_inodecache(void)
1393*4882a593Smuzhiyun {
1394*4882a593Smuzhiyun /*
1395*4882a593Smuzhiyun * Make sure all delayed rcu free inodes are flushed before we
1396*4882a593Smuzhiyun * destroy cache.
1397*4882a593Smuzhiyun */
1398*4882a593Smuzhiyun rcu_barrier();
1399*4882a593Smuzhiyun kmem_cache_destroy(ext4_inode_cachep);
1400*4882a593Smuzhiyun }
1401*4882a593Smuzhiyun
ext4_clear_inode(struct inode * inode)1402*4882a593Smuzhiyun void ext4_clear_inode(struct inode *inode)
1403*4882a593Smuzhiyun {
1404*4882a593Smuzhiyun ext4_fc_del(inode);
1405*4882a593Smuzhiyun invalidate_inode_buffers(inode);
1406*4882a593Smuzhiyun clear_inode(inode);
1407*4882a593Smuzhiyun ext4_discard_preallocations(inode, 0);
1408*4882a593Smuzhiyun ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS);
1409*4882a593Smuzhiyun dquot_drop(inode);
1410*4882a593Smuzhiyun if (EXT4_I(inode)->jinode) {
1411*4882a593Smuzhiyun jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode),
1412*4882a593Smuzhiyun EXT4_I(inode)->jinode);
1413*4882a593Smuzhiyun jbd2_free_inode(EXT4_I(inode)->jinode);
1414*4882a593Smuzhiyun EXT4_I(inode)->jinode = NULL;
1415*4882a593Smuzhiyun }
1416*4882a593Smuzhiyun fscrypt_put_encryption_info(inode);
1417*4882a593Smuzhiyun fsverity_cleanup_inode(inode);
1418*4882a593Smuzhiyun }
1419*4882a593Smuzhiyun
ext4_nfs_get_inode(struct super_block * sb,u64 ino,u32 generation)1420*4882a593Smuzhiyun static struct inode *ext4_nfs_get_inode(struct super_block *sb,
1421*4882a593Smuzhiyun u64 ino, u32 generation)
1422*4882a593Smuzhiyun {
1423*4882a593Smuzhiyun struct inode *inode;
1424*4882a593Smuzhiyun
1425*4882a593Smuzhiyun /*
1426*4882a593Smuzhiyun * Currently we don't know the generation for parent directory, so
1427*4882a593Smuzhiyun * a generation of 0 means "accept any"
1428*4882a593Smuzhiyun */
1429*4882a593Smuzhiyun inode = ext4_iget(sb, ino, EXT4_IGET_HANDLE);
1430*4882a593Smuzhiyun if (IS_ERR(inode))
1431*4882a593Smuzhiyun return ERR_CAST(inode);
1432*4882a593Smuzhiyun if (generation && inode->i_generation != generation) {
1433*4882a593Smuzhiyun iput(inode);
1434*4882a593Smuzhiyun return ERR_PTR(-ESTALE);
1435*4882a593Smuzhiyun }
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun return inode;
1438*4882a593Smuzhiyun }
1439*4882a593Smuzhiyun
ext4_fh_to_dentry(struct super_block * sb,struct fid * fid,int fh_len,int fh_type)1440*4882a593Smuzhiyun static struct dentry *ext4_fh_to_dentry(struct super_block *sb, struct fid *fid,
1441*4882a593Smuzhiyun int fh_len, int fh_type)
1442*4882a593Smuzhiyun {
1443*4882a593Smuzhiyun return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
1444*4882a593Smuzhiyun ext4_nfs_get_inode);
1445*4882a593Smuzhiyun }
1446*4882a593Smuzhiyun
ext4_fh_to_parent(struct super_block * sb,struct fid * fid,int fh_len,int fh_type)1447*4882a593Smuzhiyun static struct dentry *ext4_fh_to_parent(struct super_block *sb, struct fid *fid,
1448*4882a593Smuzhiyun int fh_len, int fh_type)
1449*4882a593Smuzhiyun {
1450*4882a593Smuzhiyun return generic_fh_to_parent(sb, fid, fh_len, fh_type,
1451*4882a593Smuzhiyun ext4_nfs_get_inode);
1452*4882a593Smuzhiyun }
1453*4882a593Smuzhiyun
ext4_nfs_commit_metadata(struct inode * inode)1454*4882a593Smuzhiyun static int ext4_nfs_commit_metadata(struct inode *inode)
1455*4882a593Smuzhiyun {
1456*4882a593Smuzhiyun struct writeback_control wbc = {
1457*4882a593Smuzhiyun .sync_mode = WB_SYNC_ALL
1458*4882a593Smuzhiyun };
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun trace_ext4_nfs_commit_metadata(inode);
1461*4882a593Smuzhiyun return ext4_write_inode(inode, &wbc);
1462*4882a593Smuzhiyun }
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun /*
1465*4882a593Smuzhiyun * Try to release metadata pages (indirect blocks, directories) which are
1466*4882a593Smuzhiyun * mapped via the block device. Since these pages could have journal heads
1467*4882a593Smuzhiyun * which would prevent try_to_free_buffers() from freeing them, we must use
1468*4882a593Smuzhiyun * jbd2 layer's try_to_free_buffers() function to release them.
1469*4882a593Smuzhiyun */
bdev_try_to_free_page(struct super_block * sb,struct page * page,gfp_t wait)1470*4882a593Smuzhiyun static int bdev_try_to_free_page(struct super_block *sb, struct page *page,
1471*4882a593Smuzhiyun gfp_t wait)
1472*4882a593Smuzhiyun {
1473*4882a593Smuzhiyun journal_t *journal = EXT4_SB(sb)->s_journal;
1474*4882a593Smuzhiyun
1475*4882a593Smuzhiyun WARN_ON(PageChecked(page));
1476*4882a593Smuzhiyun if (!page_has_buffers(page))
1477*4882a593Smuzhiyun return 0;
1478*4882a593Smuzhiyun if (journal)
1479*4882a593Smuzhiyun return jbd2_journal_try_to_free_buffers(journal, page);
1480*4882a593Smuzhiyun
1481*4882a593Smuzhiyun return try_to_free_buffers(page);
1482*4882a593Smuzhiyun }
1483*4882a593Smuzhiyun
1484*4882a593Smuzhiyun #ifdef CONFIG_FS_ENCRYPTION
ext4_get_context(struct inode * inode,void * ctx,size_t len)1485*4882a593Smuzhiyun static int ext4_get_context(struct inode *inode, void *ctx, size_t len)
1486*4882a593Smuzhiyun {
1487*4882a593Smuzhiyun return ext4_xattr_get(inode, EXT4_XATTR_INDEX_ENCRYPTION,
1488*4882a593Smuzhiyun EXT4_XATTR_NAME_ENCRYPTION_CONTEXT, ctx, len);
1489*4882a593Smuzhiyun }
1490*4882a593Smuzhiyun
ext4_set_context(struct inode * inode,const void * ctx,size_t len,void * fs_data)1491*4882a593Smuzhiyun static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,
1492*4882a593Smuzhiyun void *fs_data)
1493*4882a593Smuzhiyun {
1494*4882a593Smuzhiyun handle_t *handle = fs_data;
1495*4882a593Smuzhiyun int res, res2, credits, retries = 0;
1496*4882a593Smuzhiyun
1497*4882a593Smuzhiyun /*
1498*4882a593Smuzhiyun * Encrypting the root directory is not allowed because e2fsck expects
1499*4882a593Smuzhiyun * lost+found to exist and be unencrypted, and encrypting the root
1500*4882a593Smuzhiyun * directory would imply encrypting the lost+found directory as well as
1501*4882a593Smuzhiyun * the filename "lost+found" itself.
1502*4882a593Smuzhiyun */
1503*4882a593Smuzhiyun if (inode->i_ino == EXT4_ROOT_INO)
1504*4882a593Smuzhiyun return -EPERM;
1505*4882a593Smuzhiyun
1506*4882a593Smuzhiyun if (WARN_ON_ONCE(IS_DAX(inode) && i_size_read(inode)))
1507*4882a593Smuzhiyun return -EINVAL;
1508*4882a593Smuzhiyun
1509*4882a593Smuzhiyun if (ext4_test_inode_flag(inode, EXT4_INODE_DAX))
1510*4882a593Smuzhiyun return -EOPNOTSUPP;
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun res = ext4_convert_inline_data(inode);
1513*4882a593Smuzhiyun if (res)
1514*4882a593Smuzhiyun return res;
1515*4882a593Smuzhiyun
1516*4882a593Smuzhiyun /*
1517*4882a593Smuzhiyun * If a journal handle was specified, then the encryption context is
1518*4882a593Smuzhiyun * being set on a new inode via inheritance and is part of a larger
1519*4882a593Smuzhiyun * transaction to create the inode. Otherwise the encryption context is
1520*4882a593Smuzhiyun * being set on an existing inode in its own transaction. Only in the
1521*4882a593Smuzhiyun * latter case should the "retry on ENOSPC" logic be used.
1522*4882a593Smuzhiyun */
1523*4882a593Smuzhiyun
1524*4882a593Smuzhiyun if (handle) {
1525*4882a593Smuzhiyun res = ext4_xattr_set_handle(handle, inode,
1526*4882a593Smuzhiyun EXT4_XATTR_INDEX_ENCRYPTION,
1527*4882a593Smuzhiyun EXT4_XATTR_NAME_ENCRYPTION_CONTEXT,
1528*4882a593Smuzhiyun ctx, len, 0);
1529*4882a593Smuzhiyun if (!res) {
1530*4882a593Smuzhiyun ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT);
1531*4882a593Smuzhiyun ext4_clear_inode_state(inode,
1532*4882a593Smuzhiyun EXT4_STATE_MAY_INLINE_DATA);
1533*4882a593Smuzhiyun /*
1534*4882a593Smuzhiyun * Update inode->i_flags - S_ENCRYPTED will be enabled,
1535*4882a593Smuzhiyun * S_DAX may be disabled
1536*4882a593Smuzhiyun */
1537*4882a593Smuzhiyun ext4_set_inode_flags(inode, false);
1538*4882a593Smuzhiyun }
1539*4882a593Smuzhiyun return res;
1540*4882a593Smuzhiyun }
1541*4882a593Smuzhiyun
1542*4882a593Smuzhiyun res = dquot_initialize(inode);
1543*4882a593Smuzhiyun if (res)
1544*4882a593Smuzhiyun return res;
1545*4882a593Smuzhiyun retry:
1546*4882a593Smuzhiyun res = ext4_xattr_set_credits(inode, len, false /* is_create */,
1547*4882a593Smuzhiyun &credits);
1548*4882a593Smuzhiyun if (res)
1549*4882a593Smuzhiyun return res;
1550*4882a593Smuzhiyun
1551*4882a593Smuzhiyun handle = ext4_journal_start(inode, EXT4_HT_MISC, credits);
1552*4882a593Smuzhiyun if (IS_ERR(handle))
1553*4882a593Smuzhiyun return PTR_ERR(handle);
1554*4882a593Smuzhiyun
1555*4882a593Smuzhiyun res = ext4_xattr_set_handle(handle, inode, EXT4_XATTR_INDEX_ENCRYPTION,
1556*4882a593Smuzhiyun EXT4_XATTR_NAME_ENCRYPTION_CONTEXT,
1557*4882a593Smuzhiyun ctx, len, 0);
1558*4882a593Smuzhiyun if (!res) {
1559*4882a593Smuzhiyun ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT);
1560*4882a593Smuzhiyun /*
1561*4882a593Smuzhiyun * Update inode->i_flags - S_ENCRYPTED will be enabled,
1562*4882a593Smuzhiyun * S_DAX may be disabled
1563*4882a593Smuzhiyun */
1564*4882a593Smuzhiyun ext4_set_inode_flags(inode, false);
1565*4882a593Smuzhiyun res = ext4_mark_inode_dirty(handle, inode);
1566*4882a593Smuzhiyun if (res)
1567*4882a593Smuzhiyun EXT4_ERROR_INODE(inode, "Failed to mark inode dirty");
1568*4882a593Smuzhiyun }
1569*4882a593Smuzhiyun res2 = ext4_journal_stop(handle);
1570*4882a593Smuzhiyun
1571*4882a593Smuzhiyun if (res == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
1572*4882a593Smuzhiyun goto retry;
1573*4882a593Smuzhiyun if (!res)
1574*4882a593Smuzhiyun res = res2;
1575*4882a593Smuzhiyun return res;
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun
ext4_get_dummy_policy(struct super_block * sb)1578*4882a593Smuzhiyun static const union fscrypt_policy *ext4_get_dummy_policy(struct super_block *sb)
1579*4882a593Smuzhiyun {
1580*4882a593Smuzhiyun return EXT4_SB(sb)->s_dummy_enc_policy.policy;
1581*4882a593Smuzhiyun }
1582*4882a593Smuzhiyun
ext4_has_stable_inodes(struct super_block * sb)1583*4882a593Smuzhiyun static bool ext4_has_stable_inodes(struct super_block *sb)
1584*4882a593Smuzhiyun {
1585*4882a593Smuzhiyun return ext4_has_feature_stable_inodes(sb);
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun
ext4_get_ino_and_lblk_bits(struct super_block * sb,int * ino_bits_ret,int * lblk_bits_ret)1588*4882a593Smuzhiyun static void ext4_get_ino_and_lblk_bits(struct super_block *sb,
1589*4882a593Smuzhiyun int *ino_bits_ret, int *lblk_bits_ret)
1590*4882a593Smuzhiyun {
1591*4882a593Smuzhiyun *ino_bits_ret = 8 * sizeof(EXT4_SB(sb)->s_es->s_inodes_count);
1592*4882a593Smuzhiyun *lblk_bits_ret = 8 * sizeof(ext4_lblk_t);
1593*4882a593Smuzhiyun }
1594*4882a593Smuzhiyun
1595*4882a593Smuzhiyun static const struct fscrypt_operations ext4_cryptops = {
1596*4882a593Smuzhiyun .key_prefix = "ext4:",
1597*4882a593Smuzhiyun .get_context = ext4_get_context,
1598*4882a593Smuzhiyun .set_context = ext4_set_context,
1599*4882a593Smuzhiyun .get_dummy_policy = ext4_get_dummy_policy,
1600*4882a593Smuzhiyun .empty_dir = ext4_empty_dir,
1601*4882a593Smuzhiyun .max_namelen = EXT4_NAME_LEN,
1602*4882a593Smuzhiyun .has_stable_inodes = ext4_has_stable_inodes,
1603*4882a593Smuzhiyun .get_ino_and_lblk_bits = ext4_get_ino_and_lblk_bits,
1604*4882a593Smuzhiyun };
1605*4882a593Smuzhiyun #endif
1606*4882a593Smuzhiyun
1607*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
1608*4882a593Smuzhiyun static const char * const quotatypes[] = INITQFNAMES;
1609*4882a593Smuzhiyun #define QTYPE2NAME(t) (quotatypes[t])
1610*4882a593Smuzhiyun
1611*4882a593Smuzhiyun static int ext4_write_dquot(struct dquot *dquot);
1612*4882a593Smuzhiyun static int ext4_acquire_dquot(struct dquot *dquot);
1613*4882a593Smuzhiyun static int ext4_release_dquot(struct dquot *dquot);
1614*4882a593Smuzhiyun static int ext4_mark_dquot_dirty(struct dquot *dquot);
1615*4882a593Smuzhiyun static int ext4_write_info(struct super_block *sb, int type);
1616*4882a593Smuzhiyun static int ext4_quota_on(struct super_block *sb, int type, int format_id,
1617*4882a593Smuzhiyun const struct path *path);
1618*4882a593Smuzhiyun static int ext4_quota_on_mount(struct super_block *sb, int type);
1619*4882a593Smuzhiyun static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
1620*4882a593Smuzhiyun size_t len, loff_t off);
1621*4882a593Smuzhiyun static ssize_t ext4_quota_write(struct super_block *sb, int type,
1622*4882a593Smuzhiyun const char *data, size_t len, loff_t off);
1623*4882a593Smuzhiyun static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
1624*4882a593Smuzhiyun unsigned int flags);
1625*4882a593Smuzhiyun static int ext4_enable_quotas(struct super_block *sb);
1626*4882a593Smuzhiyun
ext4_get_dquots(struct inode * inode)1627*4882a593Smuzhiyun static struct dquot **ext4_get_dquots(struct inode *inode)
1628*4882a593Smuzhiyun {
1629*4882a593Smuzhiyun return EXT4_I(inode)->i_dquot;
1630*4882a593Smuzhiyun }
1631*4882a593Smuzhiyun
1632*4882a593Smuzhiyun static const struct dquot_operations ext4_quota_operations = {
1633*4882a593Smuzhiyun .get_reserved_space = ext4_get_reserved_space,
1634*4882a593Smuzhiyun .write_dquot = ext4_write_dquot,
1635*4882a593Smuzhiyun .acquire_dquot = ext4_acquire_dquot,
1636*4882a593Smuzhiyun .release_dquot = ext4_release_dquot,
1637*4882a593Smuzhiyun .mark_dirty = ext4_mark_dquot_dirty,
1638*4882a593Smuzhiyun .write_info = ext4_write_info,
1639*4882a593Smuzhiyun .alloc_dquot = dquot_alloc,
1640*4882a593Smuzhiyun .destroy_dquot = dquot_destroy,
1641*4882a593Smuzhiyun .get_projid = ext4_get_projid,
1642*4882a593Smuzhiyun .get_inode_usage = ext4_get_inode_usage,
1643*4882a593Smuzhiyun .get_next_id = dquot_get_next_id,
1644*4882a593Smuzhiyun };
1645*4882a593Smuzhiyun
1646*4882a593Smuzhiyun static const struct quotactl_ops ext4_qctl_operations = {
1647*4882a593Smuzhiyun .quota_on = ext4_quota_on,
1648*4882a593Smuzhiyun .quota_off = ext4_quota_off,
1649*4882a593Smuzhiyun .quota_sync = dquot_quota_sync,
1650*4882a593Smuzhiyun .get_state = dquot_get_state,
1651*4882a593Smuzhiyun .set_info = dquot_set_dqinfo,
1652*4882a593Smuzhiyun .get_dqblk = dquot_get_dqblk,
1653*4882a593Smuzhiyun .set_dqblk = dquot_set_dqblk,
1654*4882a593Smuzhiyun .get_nextdqblk = dquot_get_next_dqblk,
1655*4882a593Smuzhiyun };
1656*4882a593Smuzhiyun #endif
1657*4882a593Smuzhiyun
1658*4882a593Smuzhiyun static const struct super_operations ext4_sops = {
1659*4882a593Smuzhiyun .alloc_inode = ext4_alloc_inode,
1660*4882a593Smuzhiyun .free_inode = ext4_free_in_core_inode,
1661*4882a593Smuzhiyun .destroy_inode = ext4_destroy_inode,
1662*4882a593Smuzhiyun .write_inode = ext4_write_inode,
1663*4882a593Smuzhiyun .dirty_inode = ext4_dirty_inode,
1664*4882a593Smuzhiyun .drop_inode = ext4_drop_inode,
1665*4882a593Smuzhiyun .evict_inode = ext4_evict_inode,
1666*4882a593Smuzhiyun .put_super = ext4_put_super,
1667*4882a593Smuzhiyun .sync_fs = ext4_sync_fs,
1668*4882a593Smuzhiyun .freeze_fs = ext4_freeze,
1669*4882a593Smuzhiyun .unfreeze_fs = ext4_unfreeze,
1670*4882a593Smuzhiyun .statfs = ext4_statfs,
1671*4882a593Smuzhiyun .remount_fs = ext4_remount,
1672*4882a593Smuzhiyun .show_options = ext4_show_options,
1673*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
1674*4882a593Smuzhiyun .quota_read = ext4_quota_read,
1675*4882a593Smuzhiyun .quota_write = ext4_quota_write,
1676*4882a593Smuzhiyun .get_dquots = ext4_get_dquots,
1677*4882a593Smuzhiyun #endif
1678*4882a593Smuzhiyun .bdev_try_to_free_page = bdev_try_to_free_page,
1679*4882a593Smuzhiyun };
1680*4882a593Smuzhiyun
1681*4882a593Smuzhiyun static const struct export_operations ext4_export_ops = {
1682*4882a593Smuzhiyun .fh_to_dentry = ext4_fh_to_dentry,
1683*4882a593Smuzhiyun .fh_to_parent = ext4_fh_to_parent,
1684*4882a593Smuzhiyun .get_parent = ext4_get_parent,
1685*4882a593Smuzhiyun .commit_metadata = ext4_nfs_commit_metadata,
1686*4882a593Smuzhiyun };
1687*4882a593Smuzhiyun
1688*4882a593Smuzhiyun enum {
1689*4882a593Smuzhiyun Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid,
1690*4882a593Smuzhiyun Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro,
1691*4882a593Smuzhiyun Opt_nouid32, Opt_debug, Opt_removed,
1692*4882a593Smuzhiyun Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,
1693*4882a593Smuzhiyun Opt_auto_da_alloc, Opt_noauto_da_alloc, Opt_noload,
1694*4882a593Smuzhiyun Opt_commit, Opt_min_batch_time, Opt_max_batch_time, Opt_journal_dev,
1695*4882a593Smuzhiyun Opt_journal_path, Opt_journal_checksum, Opt_journal_async_commit,
1696*4882a593Smuzhiyun Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
1697*4882a593Smuzhiyun Opt_data_err_abort, Opt_data_err_ignore, Opt_test_dummy_encryption,
1698*4882a593Smuzhiyun Opt_inlinecrypt,
1699*4882a593Smuzhiyun Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
1700*4882a593Smuzhiyun Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota,
1701*4882a593Smuzhiyun Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err,
1702*4882a593Smuzhiyun Opt_usrquota, Opt_grpquota, Opt_prjquota, Opt_i_version,
1703*4882a593Smuzhiyun Opt_dax, Opt_dax_always, Opt_dax_inode, Opt_dax_never,
1704*4882a593Smuzhiyun Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_warn_on_error,
1705*4882a593Smuzhiyun Opt_nowarn_on_error, Opt_mblk_io_submit,
1706*4882a593Smuzhiyun Opt_lazytime, Opt_nolazytime, Opt_debug_want_extra_isize,
1707*4882a593Smuzhiyun Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity,
1708*4882a593Smuzhiyun Opt_inode_readahead_blks, Opt_journal_ioprio,
1709*4882a593Smuzhiyun Opt_dioread_nolock, Opt_dioread_lock,
1710*4882a593Smuzhiyun Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable,
1711*4882a593Smuzhiyun Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache,
1712*4882a593Smuzhiyun Opt_prefetch_block_bitmaps,
1713*4882a593Smuzhiyun #ifdef CONFIG_EXT4_DEBUG
1714*4882a593Smuzhiyun Opt_fc_debug_max_replay, Opt_fc_debug_force
1715*4882a593Smuzhiyun #endif
1716*4882a593Smuzhiyun };
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun static const match_table_t tokens = {
1719*4882a593Smuzhiyun {Opt_bsd_df, "bsddf"},
1720*4882a593Smuzhiyun {Opt_minix_df, "minixdf"},
1721*4882a593Smuzhiyun {Opt_grpid, "grpid"},
1722*4882a593Smuzhiyun {Opt_grpid, "bsdgroups"},
1723*4882a593Smuzhiyun {Opt_nogrpid, "nogrpid"},
1724*4882a593Smuzhiyun {Opt_nogrpid, "sysvgroups"},
1725*4882a593Smuzhiyun {Opt_resgid, "resgid=%u"},
1726*4882a593Smuzhiyun {Opt_resuid, "resuid=%u"},
1727*4882a593Smuzhiyun {Opt_sb, "sb=%u"},
1728*4882a593Smuzhiyun {Opt_err_cont, "errors=continue"},
1729*4882a593Smuzhiyun {Opt_err_panic, "errors=panic"},
1730*4882a593Smuzhiyun {Opt_err_ro, "errors=remount-ro"},
1731*4882a593Smuzhiyun {Opt_nouid32, "nouid32"},
1732*4882a593Smuzhiyun {Opt_debug, "debug"},
1733*4882a593Smuzhiyun {Opt_removed, "oldalloc"},
1734*4882a593Smuzhiyun {Opt_removed, "orlov"},
1735*4882a593Smuzhiyun {Opt_user_xattr, "user_xattr"},
1736*4882a593Smuzhiyun {Opt_nouser_xattr, "nouser_xattr"},
1737*4882a593Smuzhiyun {Opt_acl, "acl"},
1738*4882a593Smuzhiyun {Opt_noacl, "noacl"},
1739*4882a593Smuzhiyun {Opt_noload, "norecovery"},
1740*4882a593Smuzhiyun {Opt_noload, "noload"},
1741*4882a593Smuzhiyun {Opt_removed, "nobh"},
1742*4882a593Smuzhiyun {Opt_removed, "bh"},
1743*4882a593Smuzhiyun {Opt_commit, "commit=%u"},
1744*4882a593Smuzhiyun {Opt_min_batch_time, "min_batch_time=%u"},
1745*4882a593Smuzhiyun {Opt_max_batch_time, "max_batch_time=%u"},
1746*4882a593Smuzhiyun {Opt_journal_dev, "journal_dev=%u"},
1747*4882a593Smuzhiyun {Opt_journal_path, "journal_path=%s"},
1748*4882a593Smuzhiyun {Opt_journal_checksum, "journal_checksum"},
1749*4882a593Smuzhiyun {Opt_nojournal_checksum, "nojournal_checksum"},
1750*4882a593Smuzhiyun {Opt_journal_async_commit, "journal_async_commit"},
1751*4882a593Smuzhiyun {Opt_abort, "abort"},
1752*4882a593Smuzhiyun {Opt_data_journal, "data=journal"},
1753*4882a593Smuzhiyun {Opt_data_ordered, "data=ordered"},
1754*4882a593Smuzhiyun {Opt_data_writeback, "data=writeback"},
1755*4882a593Smuzhiyun {Opt_data_err_abort, "data_err=abort"},
1756*4882a593Smuzhiyun {Opt_data_err_ignore, "data_err=ignore"},
1757*4882a593Smuzhiyun {Opt_offusrjquota, "usrjquota="},
1758*4882a593Smuzhiyun {Opt_usrjquota, "usrjquota=%s"},
1759*4882a593Smuzhiyun {Opt_offgrpjquota, "grpjquota="},
1760*4882a593Smuzhiyun {Opt_grpjquota, "grpjquota=%s"},
1761*4882a593Smuzhiyun {Opt_jqfmt_vfsold, "jqfmt=vfsold"},
1762*4882a593Smuzhiyun {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
1763*4882a593Smuzhiyun {Opt_jqfmt_vfsv1, "jqfmt=vfsv1"},
1764*4882a593Smuzhiyun {Opt_grpquota, "grpquota"},
1765*4882a593Smuzhiyun {Opt_noquota, "noquota"},
1766*4882a593Smuzhiyun {Opt_quota, "quota"},
1767*4882a593Smuzhiyun {Opt_usrquota, "usrquota"},
1768*4882a593Smuzhiyun {Opt_prjquota, "prjquota"},
1769*4882a593Smuzhiyun {Opt_barrier, "barrier=%u"},
1770*4882a593Smuzhiyun {Opt_barrier, "barrier"},
1771*4882a593Smuzhiyun {Opt_nobarrier, "nobarrier"},
1772*4882a593Smuzhiyun {Opt_i_version, "i_version"},
1773*4882a593Smuzhiyun {Opt_dax, "dax"},
1774*4882a593Smuzhiyun {Opt_dax_always, "dax=always"},
1775*4882a593Smuzhiyun {Opt_dax_inode, "dax=inode"},
1776*4882a593Smuzhiyun {Opt_dax_never, "dax=never"},
1777*4882a593Smuzhiyun {Opt_stripe, "stripe=%u"},
1778*4882a593Smuzhiyun {Opt_delalloc, "delalloc"},
1779*4882a593Smuzhiyun {Opt_warn_on_error, "warn_on_error"},
1780*4882a593Smuzhiyun {Opt_nowarn_on_error, "nowarn_on_error"},
1781*4882a593Smuzhiyun {Opt_lazytime, "lazytime"},
1782*4882a593Smuzhiyun {Opt_nolazytime, "nolazytime"},
1783*4882a593Smuzhiyun {Opt_debug_want_extra_isize, "debug_want_extra_isize=%u"},
1784*4882a593Smuzhiyun {Opt_nodelalloc, "nodelalloc"},
1785*4882a593Smuzhiyun {Opt_removed, "mblk_io_submit"},
1786*4882a593Smuzhiyun {Opt_removed, "nomblk_io_submit"},
1787*4882a593Smuzhiyun {Opt_block_validity, "block_validity"},
1788*4882a593Smuzhiyun {Opt_noblock_validity, "noblock_validity"},
1789*4882a593Smuzhiyun {Opt_inode_readahead_blks, "inode_readahead_blks=%u"},
1790*4882a593Smuzhiyun {Opt_journal_ioprio, "journal_ioprio=%u"},
1791*4882a593Smuzhiyun {Opt_auto_da_alloc, "auto_da_alloc=%u"},
1792*4882a593Smuzhiyun {Opt_auto_da_alloc, "auto_da_alloc"},
1793*4882a593Smuzhiyun {Opt_noauto_da_alloc, "noauto_da_alloc"},
1794*4882a593Smuzhiyun {Opt_dioread_nolock, "dioread_nolock"},
1795*4882a593Smuzhiyun {Opt_dioread_lock, "nodioread_nolock"},
1796*4882a593Smuzhiyun {Opt_dioread_lock, "dioread_lock"},
1797*4882a593Smuzhiyun {Opt_discard, "discard"},
1798*4882a593Smuzhiyun {Opt_nodiscard, "nodiscard"},
1799*4882a593Smuzhiyun {Opt_init_itable, "init_itable=%u"},
1800*4882a593Smuzhiyun {Opt_init_itable, "init_itable"},
1801*4882a593Smuzhiyun {Opt_noinit_itable, "noinit_itable"},
1802*4882a593Smuzhiyun #ifdef CONFIG_EXT4_DEBUG
1803*4882a593Smuzhiyun {Opt_fc_debug_force, "fc_debug_force"},
1804*4882a593Smuzhiyun {Opt_fc_debug_max_replay, "fc_debug_max_replay=%u"},
1805*4882a593Smuzhiyun #endif
1806*4882a593Smuzhiyun {Opt_max_dir_size_kb, "max_dir_size_kb=%u"},
1807*4882a593Smuzhiyun {Opt_test_dummy_encryption, "test_dummy_encryption=%s"},
1808*4882a593Smuzhiyun {Opt_test_dummy_encryption, "test_dummy_encryption"},
1809*4882a593Smuzhiyun {Opt_inlinecrypt, "inlinecrypt"},
1810*4882a593Smuzhiyun {Opt_nombcache, "nombcache"},
1811*4882a593Smuzhiyun {Opt_nombcache, "no_mbcache"}, /* for backward compatibility */
1812*4882a593Smuzhiyun {Opt_prefetch_block_bitmaps, "prefetch_block_bitmaps"},
1813*4882a593Smuzhiyun {Opt_removed, "check=none"}, /* mount option from ext2/3 */
1814*4882a593Smuzhiyun {Opt_removed, "nocheck"}, /* mount option from ext2/3 */
1815*4882a593Smuzhiyun {Opt_removed, "reservation"}, /* mount option from ext2/3 */
1816*4882a593Smuzhiyun {Opt_removed, "noreservation"}, /* mount option from ext2/3 */
1817*4882a593Smuzhiyun {Opt_removed, "journal=%u"}, /* mount option from ext2/3 */
1818*4882a593Smuzhiyun {Opt_err, NULL},
1819*4882a593Smuzhiyun };
1820*4882a593Smuzhiyun
get_sb_block(void ** data)1821*4882a593Smuzhiyun static ext4_fsblk_t get_sb_block(void **data)
1822*4882a593Smuzhiyun {
1823*4882a593Smuzhiyun ext4_fsblk_t sb_block;
1824*4882a593Smuzhiyun char *options = (char *) *data;
1825*4882a593Smuzhiyun
1826*4882a593Smuzhiyun if (!options || strncmp(options, "sb=", 3) != 0)
1827*4882a593Smuzhiyun return 1; /* Default location */
1828*4882a593Smuzhiyun
1829*4882a593Smuzhiyun options += 3;
1830*4882a593Smuzhiyun /* TODO: use simple_strtoll with >32bit ext4 */
1831*4882a593Smuzhiyun sb_block = simple_strtoul(options, &options, 0);
1832*4882a593Smuzhiyun if (*options && *options != ',') {
1833*4882a593Smuzhiyun printk(KERN_ERR "EXT4-fs: Invalid sb specification: %s\n",
1834*4882a593Smuzhiyun (char *) *data);
1835*4882a593Smuzhiyun return 1;
1836*4882a593Smuzhiyun }
1837*4882a593Smuzhiyun if (*options == ',')
1838*4882a593Smuzhiyun options++;
1839*4882a593Smuzhiyun *data = (void *) options;
1840*4882a593Smuzhiyun
1841*4882a593Smuzhiyun return sb_block;
1842*4882a593Smuzhiyun }
1843*4882a593Smuzhiyun
1844*4882a593Smuzhiyun #define DEFAULT_JOURNAL_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 3))
1845*4882a593Smuzhiyun static const char deprecated_msg[] =
1846*4882a593Smuzhiyun "Mount option \"%s\" will be removed by %s\n"
1847*4882a593Smuzhiyun "Contact linux-ext4@vger.kernel.org if you think we should keep it.\n";
1848*4882a593Smuzhiyun
1849*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
set_qf_name(struct super_block * sb,int qtype,substring_t * args)1850*4882a593Smuzhiyun static int set_qf_name(struct super_block *sb, int qtype, substring_t *args)
1851*4882a593Smuzhiyun {
1852*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
1853*4882a593Smuzhiyun char *qname, *old_qname = get_qf_name(sb, sbi, qtype);
1854*4882a593Smuzhiyun int ret = -1;
1855*4882a593Smuzhiyun
1856*4882a593Smuzhiyun if (sb_any_quota_loaded(sb) && !old_qname) {
1857*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
1858*4882a593Smuzhiyun "Cannot change journaled "
1859*4882a593Smuzhiyun "quota options when quota turned on");
1860*4882a593Smuzhiyun return -1;
1861*4882a593Smuzhiyun }
1862*4882a593Smuzhiyun if (ext4_has_feature_quota(sb)) {
1863*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "Journaled quota options "
1864*4882a593Smuzhiyun "ignored when QUOTA feature is enabled");
1865*4882a593Smuzhiyun return 1;
1866*4882a593Smuzhiyun }
1867*4882a593Smuzhiyun qname = match_strdup(args);
1868*4882a593Smuzhiyun if (!qname) {
1869*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
1870*4882a593Smuzhiyun "Not enough memory for storing quotafile name");
1871*4882a593Smuzhiyun return -1;
1872*4882a593Smuzhiyun }
1873*4882a593Smuzhiyun if (old_qname) {
1874*4882a593Smuzhiyun if (strcmp(old_qname, qname) == 0)
1875*4882a593Smuzhiyun ret = 1;
1876*4882a593Smuzhiyun else
1877*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
1878*4882a593Smuzhiyun "%s quota file already specified",
1879*4882a593Smuzhiyun QTYPE2NAME(qtype));
1880*4882a593Smuzhiyun goto errout;
1881*4882a593Smuzhiyun }
1882*4882a593Smuzhiyun if (strchr(qname, '/')) {
1883*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
1884*4882a593Smuzhiyun "quotafile must be on filesystem root");
1885*4882a593Smuzhiyun goto errout;
1886*4882a593Smuzhiyun }
1887*4882a593Smuzhiyun rcu_assign_pointer(sbi->s_qf_names[qtype], qname);
1888*4882a593Smuzhiyun set_opt(sb, QUOTA);
1889*4882a593Smuzhiyun return 1;
1890*4882a593Smuzhiyun errout:
1891*4882a593Smuzhiyun kfree(qname);
1892*4882a593Smuzhiyun return ret;
1893*4882a593Smuzhiyun }
1894*4882a593Smuzhiyun
clear_qf_name(struct super_block * sb,int qtype)1895*4882a593Smuzhiyun static int clear_qf_name(struct super_block *sb, int qtype)
1896*4882a593Smuzhiyun {
1897*4882a593Smuzhiyun
1898*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
1899*4882a593Smuzhiyun char *old_qname = get_qf_name(sb, sbi, qtype);
1900*4882a593Smuzhiyun
1901*4882a593Smuzhiyun if (sb_any_quota_loaded(sb) && old_qname) {
1902*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options"
1903*4882a593Smuzhiyun " when quota turned on");
1904*4882a593Smuzhiyun return -1;
1905*4882a593Smuzhiyun }
1906*4882a593Smuzhiyun rcu_assign_pointer(sbi->s_qf_names[qtype], NULL);
1907*4882a593Smuzhiyun synchronize_rcu();
1908*4882a593Smuzhiyun kfree(old_qname);
1909*4882a593Smuzhiyun return 1;
1910*4882a593Smuzhiyun }
1911*4882a593Smuzhiyun #endif
1912*4882a593Smuzhiyun
1913*4882a593Smuzhiyun #define MOPT_SET 0x0001
1914*4882a593Smuzhiyun #define MOPT_CLEAR 0x0002
1915*4882a593Smuzhiyun #define MOPT_NOSUPPORT 0x0004
1916*4882a593Smuzhiyun #define MOPT_EXPLICIT 0x0008
1917*4882a593Smuzhiyun #define MOPT_CLEAR_ERR 0x0010
1918*4882a593Smuzhiyun #define MOPT_GTE0 0x0020
1919*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
1920*4882a593Smuzhiyun #define MOPT_Q 0
1921*4882a593Smuzhiyun #define MOPT_QFMT 0x0040
1922*4882a593Smuzhiyun #else
1923*4882a593Smuzhiyun #define MOPT_Q MOPT_NOSUPPORT
1924*4882a593Smuzhiyun #define MOPT_QFMT MOPT_NOSUPPORT
1925*4882a593Smuzhiyun #endif
1926*4882a593Smuzhiyun #define MOPT_DATAJ 0x0080
1927*4882a593Smuzhiyun #define MOPT_NO_EXT2 0x0100
1928*4882a593Smuzhiyun #define MOPT_NO_EXT3 0x0200
1929*4882a593Smuzhiyun #define MOPT_EXT4_ONLY (MOPT_NO_EXT2 | MOPT_NO_EXT3)
1930*4882a593Smuzhiyun #define MOPT_STRING 0x0400
1931*4882a593Smuzhiyun #define MOPT_SKIP 0x0800
1932*4882a593Smuzhiyun #define MOPT_2 0x1000
1933*4882a593Smuzhiyun
1934*4882a593Smuzhiyun static const struct mount_opts {
1935*4882a593Smuzhiyun int token;
1936*4882a593Smuzhiyun int mount_opt;
1937*4882a593Smuzhiyun int flags;
1938*4882a593Smuzhiyun } ext4_mount_opts[] = {
1939*4882a593Smuzhiyun {Opt_minix_df, EXT4_MOUNT_MINIX_DF, MOPT_SET},
1940*4882a593Smuzhiyun {Opt_bsd_df, EXT4_MOUNT_MINIX_DF, MOPT_CLEAR},
1941*4882a593Smuzhiyun {Opt_grpid, EXT4_MOUNT_GRPID, MOPT_SET},
1942*4882a593Smuzhiyun {Opt_nogrpid, EXT4_MOUNT_GRPID, MOPT_CLEAR},
1943*4882a593Smuzhiyun {Opt_block_validity, EXT4_MOUNT_BLOCK_VALIDITY, MOPT_SET},
1944*4882a593Smuzhiyun {Opt_noblock_validity, EXT4_MOUNT_BLOCK_VALIDITY, MOPT_CLEAR},
1945*4882a593Smuzhiyun {Opt_dioread_nolock, EXT4_MOUNT_DIOREAD_NOLOCK,
1946*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET},
1947*4882a593Smuzhiyun {Opt_dioread_lock, EXT4_MOUNT_DIOREAD_NOLOCK,
1948*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_CLEAR},
1949*4882a593Smuzhiyun {Opt_discard, EXT4_MOUNT_DISCARD, MOPT_SET},
1950*4882a593Smuzhiyun {Opt_nodiscard, EXT4_MOUNT_DISCARD, MOPT_CLEAR},
1951*4882a593Smuzhiyun {Opt_delalloc, EXT4_MOUNT_DELALLOC,
1952*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
1953*4882a593Smuzhiyun {Opt_nodelalloc, EXT4_MOUNT_DELALLOC,
1954*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_CLEAR},
1955*4882a593Smuzhiyun {Opt_warn_on_error, EXT4_MOUNT_WARN_ON_ERROR, MOPT_SET},
1956*4882a593Smuzhiyun {Opt_nowarn_on_error, EXT4_MOUNT_WARN_ON_ERROR, MOPT_CLEAR},
1957*4882a593Smuzhiyun {Opt_commit, 0, MOPT_NO_EXT2},
1958*4882a593Smuzhiyun {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
1959*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_CLEAR},
1960*4882a593Smuzhiyun {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
1961*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
1962*4882a593Smuzhiyun {Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT |
1963*4882a593Smuzhiyun EXT4_MOUNT_JOURNAL_CHECKSUM),
1964*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
1965*4882a593Smuzhiyun {Opt_noload, EXT4_MOUNT_NOLOAD, MOPT_NO_EXT2 | MOPT_SET},
1966*4882a593Smuzhiyun {Opt_err_panic, EXT4_MOUNT_ERRORS_PANIC, MOPT_SET | MOPT_CLEAR_ERR},
1967*4882a593Smuzhiyun {Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR},
1968*4882a593Smuzhiyun {Opt_err_cont, EXT4_MOUNT_ERRORS_CONT, MOPT_SET | MOPT_CLEAR_ERR},
1969*4882a593Smuzhiyun {Opt_data_err_abort, EXT4_MOUNT_DATA_ERR_ABORT,
1970*4882a593Smuzhiyun MOPT_NO_EXT2},
1971*4882a593Smuzhiyun {Opt_data_err_ignore, EXT4_MOUNT_DATA_ERR_ABORT,
1972*4882a593Smuzhiyun MOPT_NO_EXT2},
1973*4882a593Smuzhiyun {Opt_barrier, EXT4_MOUNT_BARRIER, MOPT_SET},
1974*4882a593Smuzhiyun {Opt_nobarrier, EXT4_MOUNT_BARRIER, MOPT_CLEAR},
1975*4882a593Smuzhiyun {Opt_noauto_da_alloc, EXT4_MOUNT_NO_AUTO_DA_ALLOC, MOPT_SET},
1976*4882a593Smuzhiyun {Opt_auto_da_alloc, EXT4_MOUNT_NO_AUTO_DA_ALLOC, MOPT_CLEAR},
1977*4882a593Smuzhiyun {Opt_noinit_itable, EXT4_MOUNT_INIT_INODE_TABLE, MOPT_CLEAR},
1978*4882a593Smuzhiyun {Opt_commit, 0, MOPT_GTE0},
1979*4882a593Smuzhiyun {Opt_max_batch_time, 0, MOPT_GTE0},
1980*4882a593Smuzhiyun {Opt_min_batch_time, 0, MOPT_GTE0},
1981*4882a593Smuzhiyun {Opt_inode_readahead_blks, 0, MOPT_GTE0},
1982*4882a593Smuzhiyun {Opt_init_itable, 0, MOPT_GTE0},
1983*4882a593Smuzhiyun {Opt_dax, EXT4_MOUNT_DAX_ALWAYS, MOPT_SET | MOPT_SKIP},
1984*4882a593Smuzhiyun {Opt_dax_always, EXT4_MOUNT_DAX_ALWAYS,
1985*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET | MOPT_SKIP},
1986*4882a593Smuzhiyun {Opt_dax_inode, EXT4_MOUNT2_DAX_INODE,
1987*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET | MOPT_SKIP},
1988*4882a593Smuzhiyun {Opt_dax_never, EXT4_MOUNT2_DAX_NEVER,
1989*4882a593Smuzhiyun MOPT_EXT4_ONLY | MOPT_SET | MOPT_SKIP},
1990*4882a593Smuzhiyun {Opt_stripe, 0, MOPT_GTE0},
1991*4882a593Smuzhiyun {Opt_resuid, 0, MOPT_GTE0},
1992*4882a593Smuzhiyun {Opt_resgid, 0, MOPT_GTE0},
1993*4882a593Smuzhiyun {Opt_journal_dev, 0, MOPT_NO_EXT2 | MOPT_GTE0},
1994*4882a593Smuzhiyun {Opt_journal_path, 0, MOPT_NO_EXT2 | MOPT_STRING},
1995*4882a593Smuzhiyun {Opt_journal_ioprio, 0, MOPT_NO_EXT2 | MOPT_GTE0},
1996*4882a593Smuzhiyun {Opt_data_journal, EXT4_MOUNT_JOURNAL_DATA, MOPT_NO_EXT2 | MOPT_DATAJ},
1997*4882a593Smuzhiyun {Opt_data_ordered, EXT4_MOUNT_ORDERED_DATA, MOPT_NO_EXT2 | MOPT_DATAJ},
1998*4882a593Smuzhiyun {Opt_data_writeback, EXT4_MOUNT_WRITEBACK_DATA,
1999*4882a593Smuzhiyun MOPT_NO_EXT2 | MOPT_DATAJ},
2000*4882a593Smuzhiyun {Opt_user_xattr, EXT4_MOUNT_XATTR_USER, MOPT_SET},
2001*4882a593Smuzhiyun {Opt_nouser_xattr, EXT4_MOUNT_XATTR_USER, MOPT_CLEAR},
2002*4882a593Smuzhiyun #ifdef CONFIG_EXT4_FS_POSIX_ACL
2003*4882a593Smuzhiyun {Opt_acl, EXT4_MOUNT_POSIX_ACL, MOPT_SET},
2004*4882a593Smuzhiyun {Opt_noacl, EXT4_MOUNT_POSIX_ACL, MOPT_CLEAR},
2005*4882a593Smuzhiyun #else
2006*4882a593Smuzhiyun {Opt_acl, 0, MOPT_NOSUPPORT},
2007*4882a593Smuzhiyun {Opt_noacl, 0, MOPT_NOSUPPORT},
2008*4882a593Smuzhiyun #endif
2009*4882a593Smuzhiyun {Opt_nouid32, EXT4_MOUNT_NO_UID32, MOPT_SET},
2010*4882a593Smuzhiyun {Opt_debug, EXT4_MOUNT_DEBUG, MOPT_SET},
2011*4882a593Smuzhiyun {Opt_debug_want_extra_isize, 0, MOPT_GTE0},
2012*4882a593Smuzhiyun {Opt_quota, EXT4_MOUNT_QUOTA | EXT4_MOUNT_USRQUOTA, MOPT_SET | MOPT_Q},
2013*4882a593Smuzhiyun {Opt_usrquota, EXT4_MOUNT_QUOTA | EXT4_MOUNT_USRQUOTA,
2014*4882a593Smuzhiyun MOPT_SET | MOPT_Q},
2015*4882a593Smuzhiyun {Opt_grpquota, EXT4_MOUNT_QUOTA | EXT4_MOUNT_GRPQUOTA,
2016*4882a593Smuzhiyun MOPT_SET | MOPT_Q},
2017*4882a593Smuzhiyun {Opt_prjquota, EXT4_MOUNT_QUOTA | EXT4_MOUNT_PRJQUOTA,
2018*4882a593Smuzhiyun MOPT_SET | MOPT_Q},
2019*4882a593Smuzhiyun {Opt_noquota, (EXT4_MOUNT_QUOTA | EXT4_MOUNT_USRQUOTA |
2020*4882a593Smuzhiyun EXT4_MOUNT_GRPQUOTA | EXT4_MOUNT_PRJQUOTA),
2021*4882a593Smuzhiyun MOPT_CLEAR | MOPT_Q},
2022*4882a593Smuzhiyun {Opt_usrjquota, 0, MOPT_Q | MOPT_STRING},
2023*4882a593Smuzhiyun {Opt_grpjquota, 0, MOPT_Q | MOPT_STRING},
2024*4882a593Smuzhiyun {Opt_offusrjquota, 0, MOPT_Q},
2025*4882a593Smuzhiyun {Opt_offgrpjquota, 0, MOPT_Q},
2026*4882a593Smuzhiyun {Opt_jqfmt_vfsold, QFMT_VFS_OLD, MOPT_QFMT},
2027*4882a593Smuzhiyun {Opt_jqfmt_vfsv0, QFMT_VFS_V0, MOPT_QFMT},
2028*4882a593Smuzhiyun {Opt_jqfmt_vfsv1, QFMT_VFS_V1, MOPT_QFMT},
2029*4882a593Smuzhiyun {Opt_max_dir_size_kb, 0, MOPT_GTE0},
2030*4882a593Smuzhiyun {Opt_test_dummy_encryption, 0, MOPT_STRING},
2031*4882a593Smuzhiyun {Opt_nombcache, EXT4_MOUNT_NO_MBCACHE, MOPT_SET},
2032*4882a593Smuzhiyun {Opt_prefetch_block_bitmaps, EXT4_MOUNT_PREFETCH_BLOCK_BITMAPS,
2033*4882a593Smuzhiyun MOPT_SET},
2034*4882a593Smuzhiyun #ifdef CONFIG_EXT4_DEBUG
2035*4882a593Smuzhiyun {Opt_fc_debug_force, EXT4_MOUNT2_JOURNAL_FAST_COMMIT,
2036*4882a593Smuzhiyun MOPT_SET | MOPT_2 | MOPT_EXT4_ONLY},
2037*4882a593Smuzhiyun {Opt_fc_debug_max_replay, 0, MOPT_GTE0},
2038*4882a593Smuzhiyun #endif
2039*4882a593Smuzhiyun {Opt_err, 0, 0}
2040*4882a593Smuzhiyun };
2041*4882a593Smuzhiyun
2042*4882a593Smuzhiyun #ifdef CONFIG_UNICODE
2043*4882a593Smuzhiyun static const struct ext4_sb_encodings {
2044*4882a593Smuzhiyun __u16 magic;
2045*4882a593Smuzhiyun char *name;
2046*4882a593Smuzhiyun char *version;
2047*4882a593Smuzhiyun } ext4_sb_encoding_map[] = {
2048*4882a593Smuzhiyun {EXT4_ENC_UTF8_12_1, "utf8", "12.1.0"},
2049*4882a593Smuzhiyun };
2050*4882a593Smuzhiyun
ext4_sb_read_encoding(const struct ext4_super_block * es,const struct ext4_sb_encodings ** encoding,__u16 * flags)2051*4882a593Smuzhiyun static int ext4_sb_read_encoding(const struct ext4_super_block *es,
2052*4882a593Smuzhiyun const struct ext4_sb_encodings **encoding,
2053*4882a593Smuzhiyun __u16 *flags)
2054*4882a593Smuzhiyun {
2055*4882a593Smuzhiyun __u16 magic = le16_to_cpu(es->s_encoding);
2056*4882a593Smuzhiyun int i;
2057*4882a593Smuzhiyun
2058*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(ext4_sb_encoding_map); i++)
2059*4882a593Smuzhiyun if (magic == ext4_sb_encoding_map[i].magic)
2060*4882a593Smuzhiyun break;
2061*4882a593Smuzhiyun
2062*4882a593Smuzhiyun if (i >= ARRAY_SIZE(ext4_sb_encoding_map))
2063*4882a593Smuzhiyun return -EINVAL;
2064*4882a593Smuzhiyun
2065*4882a593Smuzhiyun *encoding = &ext4_sb_encoding_map[i];
2066*4882a593Smuzhiyun *flags = le16_to_cpu(es->s_encoding_flags);
2067*4882a593Smuzhiyun
2068*4882a593Smuzhiyun return 0;
2069*4882a593Smuzhiyun }
2070*4882a593Smuzhiyun #endif
2071*4882a593Smuzhiyun
ext4_set_test_dummy_encryption(struct super_block * sb,const char * opt,const substring_t * arg,bool is_remount)2072*4882a593Smuzhiyun static int ext4_set_test_dummy_encryption(struct super_block *sb,
2073*4882a593Smuzhiyun const char *opt,
2074*4882a593Smuzhiyun const substring_t *arg,
2075*4882a593Smuzhiyun bool is_remount)
2076*4882a593Smuzhiyun {
2077*4882a593Smuzhiyun #ifdef CONFIG_FS_ENCRYPTION
2078*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2079*4882a593Smuzhiyun int err;
2080*4882a593Smuzhiyun
2081*4882a593Smuzhiyun if (!ext4_has_feature_encrypt(sb)) {
2082*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2083*4882a593Smuzhiyun "test_dummy_encryption requires encrypt feature");
2084*4882a593Smuzhiyun return -1;
2085*4882a593Smuzhiyun }
2086*4882a593Smuzhiyun
2087*4882a593Smuzhiyun /*
2088*4882a593Smuzhiyun * This mount option is just for testing, and it's not worthwhile to
2089*4882a593Smuzhiyun * implement the extra complexity (e.g. RCU protection) that would be
2090*4882a593Smuzhiyun * needed to allow it to be set or changed during remount. We do allow
2091*4882a593Smuzhiyun * it to be specified during remount, but only if there is no change.
2092*4882a593Smuzhiyun */
2093*4882a593Smuzhiyun if (is_remount && !sbi->s_dummy_enc_policy.policy) {
2094*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2095*4882a593Smuzhiyun "Can't set test_dummy_encryption on remount");
2096*4882a593Smuzhiyun return -1;
2097*4882a593Smuzhiyun }
2098*4882a593Smuzhiyun err = fscrypt_set_test_dummy_encryption(sb, arg->from,
2099*4882a593Smuzhiyun &sbi->s_dummy_enc_policy);
2100*4882a593Smuzhiyun if (err) {
2101*4882a593Smuzhiyun if (err == -EEXIST)
2102*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2103*4882a593Smuzhiyun "Can't change test_dummy_encryption on remount");
2104*4882a593Smuzhiyun else if (err == -EINVAL)
2105*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2106*4882a593Smuzhiyun "Value of option \"%s\" is unrecognized", opt);
2107*4882a593Smuzhiyun else
2108*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2109*4882a593Smuzhiyun "Error processing option \"%s\" [%d]",
2110*4882a593Smuzhiyun opt, err);
2111*4882a593Smuzhiyun return -1;
2112*4882a593Smuzhiyun }
2113*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Test dummy encryption mode enabled");
2114*4882a593Smuzhiyun return 1;
2115*4882a593Smuzhiyun #else
2116*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2117*4882a593Smuzhiyun "test_dummy_encryption option not supported");
2118*4882a593Smuzhiyun return -1;
2119*4882a593Smuzhiyun
2120*4882a593Smuzhiyun #endif
2121*4882a593Smuzhiyun }
2122*4882a593Smuzhiyun
handle_mount_opt(struct super_block * sb,char * opt,int token,substring_t * args,unsigned long * journal_devnum,unsigned int * journal_ioprio,int is_remount)2123*4882a593Smuzhiyun static int handle_mount_opt(struct super_block *sb, char *opt, int token,
2124*4882a593Smuzhiyun substring_t *args, unsigned long *journal_devnum,
2125*4882a593Smuzhiyun unsigned int *journal_ioprio, int is_remount)
2126*4882a593Smuzhiyun {
2127*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2128*4882a593Smuzhiyun const struct mount_opts *m;
2129*4882a593Smuzhiyun kuid_t uid;
2130*4882a593Smuzhiyun kgid_t gid;
2131*4882a593Smuzhiyun int arg = 0;
2132*4882a593Smuzhiyun
2133*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
2134*4882a593Smuzhiyun if (token == Opt_usrjquota)
2135*4882a593Smuzhiyun return set_qf_name(sb, USRQUOTA, &args[0]);
2136*4882a593Smuzhiyun else if (token == Opt_grpjquota)
2137*4882a593Smuzhiyun return set_qf_name(sb, GRPQUOTA, &args[0]);
2138*4882a593Smuzhiyun else if (token == Opt_offusrjquota)
2139*4882a593Smuzhiyun return clear_qf_name(sb, USRQUOTA);
2140*4882a593Smuzhiyun else if (token == Opt_offgrpjquota)
2141*4882a593Smuzhiyun return clear_qf_name(sb, GRPQUOTA);
2142*4882a593Smuzhiyun #endif
2143*4882a593Smuzhiyun switch (token) {
2144*4882a593Smuzhiyun case Opt_noacl:
2145*4882a593Smuzhiyun case Opt_nouser_xattr:
2146*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, deprecated_msg, opt, "3.5");
2147*4882a593Smuzhiyun break;
2148*4882a593Smuzhiyun case Opt_sb:
2149*4882a593Smuzhiyun return 1; /* handled by get_sb_block() */
2150*4882a593Smuzhiyun case Opt_removed:
2151*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Ignoring removed %s option", opt);
2152*4882a593Smuzhiyun return 1;
2153*4882a593Smuzhiyun case Opt_abort:
2154*4882a593Smuzhiyun ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
2155*4882a593Smuzhiyun return 1;
2156*4882a593Smuzhiyun case Opt_i_version:
2157*4882a593Smuzhiyun sb->s_flags |= SB_I_VERSION;
2158*4882a593Smuzhiyun return 1;
2159*4882a593Smuzhiyun case Opt_lazytime:
2160*4882a593Smuzhiyun sb->s_flags |= SB_LAZYTIME;
2161*4882a593Smuzhiyun return 1;
2162*4882a593Smuzhiyun case Opt_nolazytime:
2163*4882a593Smuzhiyun sb->s_flags &= ~SB_LAZYTIME;
2164*4882a593Smuzhiyun return 1;
2165*4882a593Smuzhiyun case Opt_inlinecrypt:
2166*4882a593Smuzhiyun #ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
2167*4882a593Smuzhiyun sb->s_flags |= SB_INLINECRYPT;
2168*4882a593Smuzhiyun #else
2169*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "inline encryption not supported");
2170*4882a593Smuzhiyun #endif
2171*4882a593Smuzhiyun return 1;
2172*4882a593Smuzhiyun }
2173*4882a593Smuzhiyun
2174*4882a593Smuzhiyun for (m = ext4_mount_opts; m->token != Opt_err; m++)
2175*4882a593Smuzhiyun if (token == m->token)
2176*4882a593Smuzhiyun break;
2177*4882a593Smuzhiyun
2178*4882a593Smuzhiyun if (m->token == Opt_err) {
2179*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" "
2180*4882a593Smuzhiyun "or missing value", opt);
2181*4882a593Smuzhiyun return -1;
2182*4882a593Smuzhiyun }
2183*4882a593Smuzhiyun
2184*4882a593Smuzhiyun if ((m->flags & MOPT_NO_EXT2) && IS_EXT2_SB(sb)) {
2185*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2186*4882a593Smuzhiyun "Mount option \"%s\" incompatible with ext2", opt);
2187*4882a593Smuzhiyun return -1;
2188*4882a593Smuzhiyun }
2189*4882a593Smuzhiyun if ((m->flags & MOPT_NO_EXT3) && IS_EXT3_SB(sb)) {
2190*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2191*4882a593Smuzhiyun "Mount option \"%s\" incompatible with ext3", opt);
2192*4882a593Smuzhiyun return -1;
2193*4882a593Smuzhiyun }
2194*4882a593Smuzhiyun
2195*4882a593Smuzhiyun if (args->from && !(m->flags & MOPT_STRING) && match_int(args, &arg))
2196*4882a593Smuzhiyun return -1;
2197*4882a593Smuzhiyun if (args->from && (m->flags & MOPT_GTE0) && (arg < 0))
2198*4882a593Smuzhiyun return -1;
2199*4882a593Smuzhiyun if (m->flags & MOPT_EXPLICIT) {
2200*4882a593Smuzhiyun if (m->mount_opt & EXT4_MOUNT_DELALLOC) {
2201*4882a593Smuzhiyun set_opt2(sb, EXPLICIT_DELALLOC);
2202*4882a593Smuzhiyun } else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) {
2203*4882a593Smuzhiyun set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM);
2204*4882a593Smuzhiyun } else
2205*4882a593Smuzhiyun return -1;
2206*4882a593Smuzhiyun }
2207*4882a593Smuzhiyun if (m->flags & MOPT_CLEAR_ERR)
2208*4882a593Smuzhiyun clear_opt(sb, ERRORS_MASK);
2209*4882a593Smuzhiyun if (token == Opt_noquota && sb_any_quota_loaded(sb)) {
2210*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Cannot change quota "
2211*4882a593Smuzhiyun "options when quota turned on");
2212*4882a593Smuzhiyun return -1;
2213*4882a593Smuzhiyun }
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun if (m->flags & MOPT_NOSUPPORT) {
2216*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "%s option not supported", opt);
2217*4882a593Smuzhiyun } else if (token == Opt_commit) {
2218*4882a593Smuzhiyun if (arg == 0)
2219*4882a593Smuzhiyun arg = JBD2_DEFAULT_MAX_COMMIT_AGE;
2220*4882a593Smuzhiyun else if (arg > INT_MAX / HZ) {
2221*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2222*4882a593Smuzhiyun "Invalid commit interval %d, "
2223*4882a593Smuzhiyun "must be smaller than %d",
2224*4882a593Smuzhiyun arg, INT_MAX / HZ);
2225*4882a593Smuzhiyun return -1;
2226*4882a593Smuzhiyun }
2227*4882a593Smuzhiyun sbi->s_commit_interval = HZ * arg;
2228*4882a593Smuzhiyun } else if (token == Opt_debug_want_extra_isize) {
2229*4882a593Smuzhiyun if ((arg & 1) ||
2230*4882a593Smuzhiyun (arg < 4) ||
2231*4882a593Smuzhiyun (arg > (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) {
2232*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2233*4882a593Smuzhiyun "Invalid want_extra_isize %d", arg);
2234*4882a593Smuzhiyun return -1;
2235*4882a593Smuzhiyun }
2236*4882a593Smuzhiyun sbi->s_want_extra_isize = arg;
2237*4882a593Smuzhiyun } else if (token == Opt_max_batch_time) {
2238*4882a593Smuzhiyun sbi->s_max_batch_time = arg;
2239*4882a593Smuzhiyun } else if (token == Opt_min_batch_time) {
2240*4882a593Smuzhiyun sbi->s_min_batch_time = arg;
2241*4882a593Smuzhiyun } else if (token == Opt_inode_readahead_blks) {
2242*4882a593Smuzhiyun if (arg && (arg > (1 << 30) || !is_power_of_2(arg))) {
2243*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2244*4882a593Smuzhiyun "EXT4-fs: inode_readahead_blks must be "
2245*4882a593Smuzhiyun "0 or a power of 2 smaller than 2^31");
2246*4882a593Smuzhiyun return -1;
2247*4882a593Smuzhiyun }
2248*4882a593Smuzhiyun sbi->s_inode_readahead_blks = arg;
2249*4882a593Smuzhiyun } else if (token == Opt_init_itable) {
2250*4882a593Smuzhiyun set_opt(sb, INIT_INODE_TABLE);
2251*4882a593Smuzhiyun if (!args->from)
2252*4882a593Smuzhiyun arg = EXT4_DEF_LI_WAIT_MULT;
2253*4882a593Smuzhiyun sbi->s_li_wait_mult = arg;
2254*4882a593Smuzhiyun } else if (token == Opt_max_dir_size_kb) {
2255*4882a593Smuzhiyun sbi->s_max_dir_size_kb = arg;
2256*4882a593Smuzhiyun #ifdef CONFIG_EXT4_DEBUG
2257*4882a593Smuzhiyun } else if (token == Opt_fc_debug_max_replay) {
2258*4882a593Smuzhiyun sbi->s_fc_debug_max_replay = arg;
2259*4882a593Smuzhiyun #endif
2260*4882a593Smuzhiyun } else if (token == Opt_stripe) {
2261*4882a593Smuzhiyun sbi->s_stripe = arg;
2262*4882a593Smuzhiyun } else if (token == Opt_resuid) {
2263*4882a593Smuzhiyun uid = make_kuid(current_user_ns(), arg);
2264*4882a593Smuzhiyun if (!uid_valid(uid)) {
2265*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Invalid uid value %d", arg);
2266*4882a593Smuzhiyun return -1;
2267*4882a593Smuzhiyun }
2268*4882a593Smuzhiyun sbi->s_resuid = uid;
2269*4882a593Smuzhiyun } else if (token == Opt_resgid) {
2270*4882a593Smuzhiyun gid = make_kgid(current_user_ns(), arg);
2271*4882a593Smuzhiyun if (!gid_valid(gid)) {
2272*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Invalid gid value %d", arg);
2273*4882a593Smuzhiyun return -1;
2274*4882a593Smuzhiyun }
2275*4882a593Smuzhiyun sbi->s_resgid = gid;
2276*4882a593Smuzhiyun } else if (token == Opt_journal_dev) {
2277*4882a593Smuzhiyun if (is_remount) {
2278*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2279*4882a593Smuzhiyun "Cannot specify journal on remount");
2280*4882a593Smuzhiyun return -1;
2281*4882a593Smuzhiyun }
2282*4882a593Smuzhiyun *journal_devnum = arg;
2283*4882a593Smuzhiyun } else if (token == Opt_journal_path) {
2284*4882a593Smuzhiyun char *journal_path;
2285*4882a593Smuzhiyun struct inode *journal_inode;
2286*4882a593Smuzhiyun struct path path;
2287*4882a593Smuzhiyun int error;
2288*4882a593Smuzhiyun
2289*4882a593Smuzhiyun if (is_remount) {
2290*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2291*4882a593Smuzhiyun "Cannot specify journal on remount");
2292*4882a593Smuzhiyun return -1;
2293*4882a593Smuzhiyun }
2294*4882a593Smuzhiyun journal_path = match_strdup(&args[0]);
2295*4882a593Smuzhiyun if (!journal_path) {
2296*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "error: could not dup "
2297*4882a593Smuzhiyun "journal device string");
2298*4882a593Smuzhiyun return -1;
2299*4882a593Smuzhiyun }
2300*4882a593Smuzhiyun
2301*4882a593Smuzhiyun error = kern_path(journal_path, LOOKUP_FOLLOW, &path);
2302*4882a593Smuzhiyun if (error) {
2303*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "error: could not find "
2304*4882a593Smuzhiyun "journal device path: error %d", error);
2305*4882a593Smuzhiyun kfree(journal_path);
2306*4882a593Smuzhiyun return -1;
2307*4882a593Smuzhiyun }
2308*4882a593Smuzhiyun
2309*4882a593Smuzhiyun journal_inode = d_inode(path.dentry);
2310*4882a593Smuzhiyun if (!S_ISBLK(journal_inode->i_mode)) {
2311*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "error: journal path %s "
2312*4882a593Smuzhiyun "is not a block device", journal_path);
2313*4882a593Smuzhiyun path_put(&path);
2314*4882a593Smuzhiyun kfree(journal_path);
2315*4882a593Smuzhiyun return -1;
2316*4882a593Smuzhiyun }
2317*4882a593Smuzhiyun
2318*4882a593Smuzhiyun *journal_devnum = new_encode_dev(journal_inode->i_rdev);
2319*4882a593Smuzhiyun path_put(&path);
2320*4882a593Smuzhiyun kfree(journal_path);
2321*4882a593Smuzhiyun } else if (token == Opt_journal_ioprio) {
2322*4882a593Smuzhiyun if (arg > 7) {
2323*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Invalid journal IO priority"
2324*4882a593Smuzhiyun " (must be 0-7)");
2325*4882a593Smuzhiyun return -1;
2326*4882a593Smuzhiyun }
2327*4882a593Smuzhiyun *journal_ioprio =
2328*4882a593Smuzhiyun IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, arg);
2329*4882a593Smuzhiyun } else if (token == Opt_test_dummy_encryption) {
2330*4882a593Smuzhiyun return ext4_set_test_dummy_encryption(sb, opt, &args[0],
2331*4882a593Smuzhiyun is_remount);
2332*4882a593Smuzhiyun } else if (m->flags & MOPT_DATAJ) {
2333*4882a593Smuzhiyun if (is_remount) {
2334*4882a593Smuzhiyun if (!sbi->s_journal)
2335*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data option");
2336*4882a593Smuzhiyun else if (test_opt(sb, DATA_FLAGS) != m->mount_opt) {
2337*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2338*4882a593Smuzhiyun "Cannot change data mode on remount");
2339*4882a593Smuzhiyun return -1;
2340*4882a593Smuzhiyun }
2341*4882a593Smuzhiyun } else {
2342*4882a593Smuzhiyun clear_opt(sb, DATA_FLAGS);
2343*4882a593Smuzhiyun sbi->s_mount_opt |= m->mount_opt;
2344*4882a593Smuzhiyun }
2345*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
2346*4882a593Smuzhiyun } else if (m->flags & MOPT_QFMT) {
2347*4882a593Smuzhiyun if (sb_any_quota_loaded(sb) &&
2348*4882a593Smuzhiyun sbi->s_jquota_fmt != m->mount_opt) {
2349*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Cannot change journaled "
2350*4882a593Smuzhiyun "quota options when quota turned on");
2351*4882a593Smuzhiyun return -1;
2352*4882a593Smuzhiyun }
2353*4882a593Smuzhiyun if (ext4_has_feature_quota(sb)) {
2354*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO,
2355*4882a593Smuzhiyun "Quota format mount options ignored "
2356*4882a593Smuzhiyun "when QUOTA feature is enabled");
2357*4882a593Smuzhiyun return 1;
2358*4882a593Smuzhiyun }
2359*4882a593Smuzhiyun sbi->s_jquota_fmt = m->mount_opt;
2360*4882a593Smuzhiyun #endif
2361*4882a593Smuzhiyun } else if (token == Opt_dax || token == Opt_dax_always ||
2362*4882a593Smuzhiyun token == Opt_dax_inode || token == Opt_dax_never) {
2363*4882a593Smuzhiyun #ifdef CONFIG_FS_DAX
2364*4882a593Smuzhiyun switch (token) {
2365*4882a593Smuzhiyun case Opt_dax:
2366*4882a593Smuzhiyun case Opt_dax_always:
2367*4882a593Smuzhiyun if (is_remount &&
2368*4882a593Smuzhiyun (!(sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS) ||
2369*4882a593Smuzhiyun (sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER))) {
2370*4882a593Smuzhiyun fail_dax_change_remount:
2371*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't change "
2372*4882a593Smuzhiyun "dax mount option while remounting");
2373*4882a593Smuzhiyun return -1;
2374*4882a593Smuzhiyun }
2375*4882a593Smuzhiyun if (is_remount &&
2376*4882a593Smuzhiyun (test_opt(sb, DATA_FLAGS) ==
2377*4882a593Smuzhiyun EXT4_MOUNT_JOURNAL_DATA)) {
2378*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
2379*4882a593Smuzhiyun "both data=journal and dax");
2380*4882a593Smuzhiyun return -1;
2381*4882a593Smuzhiyun }
2382*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2383*4882a593Smuzhiyun "DAX enabled. Warning: EXPERIMENTAL, use at your own risk");
2384*4882a593Smuzhiyun sbi->s_mount_opt |= EXT4_MOUNT_DAX_ALWAYS;
2385*4882a593Smuzhiyun sbi->s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER;
2386*4882a593Smuzhiyun break;
2387*4882a593Smuzhiyun case Opt_dax_never:
2388*4882a593Smuzhiyun if (is_remount &&
2389*4882a593Smuzhiyun (!(sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER) ||
2390*4882a593Smuzhiyun (sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS)))
2391*4882a593Smuzhiyun goto fail_dax_change_remount;
2392*4882a593Smuzhiyun sbi->s_mount_opt2 |= EXT4_MOUNT2_DAX_NEVER;
2393*4882a593Smuzhiyun sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS;
2394*4882a593Smuzhiyun break;
2395*4882a593Smuzhiyun case Opt_dax_inode:
2396*4882a593Smuzhiyun if (is_remount &&
2397*4882a593Smuzhiyun ((sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS) ||
2398*4882a593Smuzhiyun (sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER) ||
2399*4882a593Smuzhiyun !(sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_INODE)))
2400*4882a593Smuzhiyun goto fail_dax_change_remount;
2401*4882a593Smuzhiyun sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS;
2402*4882a593Smuzhiyun sbi->s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER;
2403*4882a593Smuzhiyun /* Strictly for printing options */
2404*4882a593Smuzhiyun sbi->s_mount_opt2 |= EXT4_MOUNT2_DAX_INODE;
2405*4882a593Smuzhiyun break;
2406*4882a593Smuzhiyun }
2407*4882a593Smuzhiyun #else
2408*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "dax option not supported");
2409*4882a593Smuzhiyun sbi->s_mount_opt2 |= EXT4_MOUNT2_DAX_NEVER;
2410*4882a593Smuzhiyun sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS;
2411*4882a593Smuzhiyun return -1;
2412*4882a593Smuzhiyun #endif
2413*4882a593Smuzhiyun } else if (token == Opt_data_err_abort) {
2414*4882a593Smuzhiyun sbi->s_mount_opt |= m->mount_opt;
2415*4882a593Smuzhiyun } else if (token == Opt_data_err_ignore) {
2416*4882a593Smuzhiyun sbi->s_mount_opt &= ~m->mount_opt;
2417*4882a593Smuzhiyun } else {
2418*4882a593Smuzhiyun if (!args->from)
2419*4882a593Smuzhiyun arg = 1;
2420*4882a593Smuzhiyun if (m->flags & MOPT_CLEAR)
2421*4882a593Smuzhiyun arg = !arg;
2422*4882a593Smuzhiyun else if (unlikely(!(m->flags & MOPT_SET))) {
2423*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2424*4882a593Smuzhiyun "buggy handling of option %s", opt);
2425*4882a593Smuzhiyun WARN_ON(1);
2426*4882a593Smuzhiyun return -1;
2427*4882a593Smuzhiyun }
2428*4882a593Smuzhiyun if (m->flags & MOPT_2) {
2429*4882a593Smuzhiyun if (arg != 0)
2430*4882a593Smuzhiyun sbi->s_mount_opt2 |= m->mount_opt;
2431*4882a593Smuzhiyun else
2432*4882a593Smuzhiyun sbi->s_mount_opt2 &= ~m->mount_opt;
2433*4882a593Smuzhiyun } else {
2434*4882a593Smuzhiyun if (arg != 0)
2435*4882a593Smuzhiyun sbi->s_mount_opt |= m->mount_opt;
2436*4882a593Smuzhiyun else
2437*4882a593Smuzhiyun sbi->s_mount_opt &= ~m->mount_opt;
2438*4882a593Smuzhiyun }
2439*4882a593Smuzhiyun }
2440*4882a593Smuzhiyun return 1;
2441*4882a593Smuzhiyun }
2442*4882a593Smuzhiyun
parse_options(char * options,struct super_block * sb,unsigned long * journal_devnum,unsigned int * journal_ioprio,int is_remount)2443*4882a593Smuzhiyun static int parse_options(char *options, struct super_block *sb,
2444*4882a593Smuzhiyun unsigned long *journal_devnum,
2445*4882a593Smuzhiyun unsigned int *journal_ioprio,
2446*4882a593Smuzhiyun int is_remount)
2447*4882a593Smuzhiyun {
2448*4882a593Smuzhiyun struct ext4_sb_info __maybe_unused *sbi = EXT4_SB(sb);
2449*4882a593Smuzhiyun char *p, __maybe_unused *usr_qf_name, __maybe_unused *grp_qf_name;
2450*4882a593Smuzhiyun substring_t args[MAX_OPT_ARGS];
2451*4882a593Smuzhiyun int token;
2452*4882a593Smuzhiyun
2453*4882a593Smuzhiyun if (!options)
2454*4882a593Smuzhiyun return 1;
2455*4882a593Smuzhiyun
2456*4882a593Smuzhiyun while ((p = strsep(&options, ",")) != NULL) {
2457*4882a593Smuzhiyun if (!*p)
2458*4882a593Smuzhiyun continue;
2459*4882a593Smuzhiyun /*
2460*4882a593Smuzhiyun * Initialize args struct so we know whether arg was
2461*4882a593Smuzhiyun * found; some options take optional arguments.
2462*4882a593Smuzhiyun */
2463*4882a593Smuzhiyun args[0].to = args[0].from = NULL;
2464*4882a593Smuzhiyun token = match_token(p, tokens, args);
2465*4882a593Smuzhiyun if (handle_mount_opt(sb, p, token, args, journal_devnum,
2466*4882a593Smuzhiyun journal_ioprio, is_remount) < 0)
2467*4882a593Smuzhiyun return 0;
2468*4882a593Smuzhiyun }
2469*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
2470*4882a593Smuzhiyun /*
2471*4882a593Smuzhiyun * We do the test below only for project quotas. 'usrquota' and
2472*4882a593Smuzhiyun * 'grpquota' mount options are allowed even without quota feature
2473*4882a593Smuzhiyun * to support legacy quotas in quota files.
2474*4882a593Smuzhiyun */
2475*4882a593Smuzhiyun if (test_opt(sb, PRJQUOTA) && !ext4_has_feature_project(sb)) {
2476*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Project quota feature not enabled. "
2477*4882a593Smuzhiyun "Cannot enable project quota enforcement.");
2478*4882a593Smuzhiyun return 0;
2479*4882a593Smuzhiyun }
2480*4882a593Smuzhiyun usr_qf_name = get_qf_name(sb, sbi, USRQUOTA);
2481*4882a593Smuzhiyun grp_qf_name = get_qf_name(sb, sbi, GRPQUOTA);
2482*4882a593Smuzhiyun if (usr_qf_name || grp_qf_name) {
2483*4882a593Smuzhiyun if (test_opt(sb, USRQUOTA) && usr_qf_name)
2484*4882a593Smuzhiyun clear_opt(sb, USRQUOTA);
2485*4882a593Smuzhiyun
2486*4882a593Smuzhiyun if (test_opt(sb, GRPQUOTA) && grp_qf_name)
2487*4882a593Smuzhiyun clear_opt(sb, GRPQUOTA);
2488*4882a593Smuzhiyun
2489*4882a593Smuzhiyun if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) {
2490*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "old and new quota "
2491*4882a593Smuzhiyun "format mixing");
2492*4882a593Smuzhiyun return 0;
2493*4882a593Smuzhiyun }
2494*4882a593Smuzhiyun
2495*4882a593Smuzhiyun if (!sbi->s_jquota_fmt) {
2496*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "journaled quota format "
2497*4882a593Smuzhiyun "not specified");
2498*4882a593Smuzhiyun return 0;
2499*4882a593Smuzhiyun }
2500*4882a593Smuzhiyun }
2501*4882a593Smuzhiyun #endif
2502*4882a593Smuzhiyun if (test_opt(sb, DIOREAD_NOLOCK)) {
2503*4882a593Smuzhiyun int blocksize =
2504*4882a593Smuzhiyun BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
2505*4882a593Smuzhiyun if (blocksize < PAGE_SIZE)
2506*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Warning: mounting with an "
2507*4882a593Smuzhiyun "experimental mount option 'dioread_nolock' "
2508*4882a593Smuzhiyun "for blocksize < PAGE_SIZE");
2509*4882a593Smuzhiyun }
2510*4882a593Smuzhiyun return 1;
2511*4882a593Smuzhiyun }
2512*4882a593Smuzhiyun
ext4_show_quota_options(struct seq_file * seq,struct super_block * sb)2513*4882a593Smuzhiyun static inline void ext4_show_quota_options(struct seq_file *seq,
2514*4882a593Smuzhiyun struct super_block *sb)
2515*4882a593Smuzhiyun {
2516*4882a593Smuzhiyun #if defined(CONFIG_QUOTA)
2517*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2518*4882a593Smuzhiyun char *usr_qf_name, *grp_qf_name;
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun if (sbi->s_jquota_fmt) {
2521*4882a593Smuzhiyun char *fmtname = "";
2522*4882a593Smuzhiyun
2523*4882a593Smuzhiyun switch (sbi->s_jquota_fmt) {
2524*4882a593Smuzhiyun case QFMT_VFS_OLD:
2525*4882a593Smuzhiyun fmtname = "vfsold";
2526*4882a593Smuzhiyun break;
2527*4882a593Smuzhiyun case QFMT_VFS_V0:
2528*4882a593Smuzhiyun fmtname = "vfsv0";
2529*4882a593Smuzhiyun break;
2530*4882a593Smuzhiyun case QFMT_VFS_V1:
2531*4882a593Smuzhiyun fmtname = "vfsv1";
2532*4882a593Smuzhiyun break;
2533*4882a593Smuzhiyun }
2534*4882a593Smuzhiyun seq_printf(seq, ",jqfmt=%s", fmtname);
2535*4882a593Smuzhiyun }
2536*4882a593Smuzhiyun
2537*4882a593Smuzhiyun rcu_read_lock();
2538*4882a593Smuzhiyun usr_qf_name = rcu_dereference(sbi->s_qf_names[USRQUOTA]);
2539*4882a593Smuzhiyun grp_qf_name = rcu_dereference(sbi->s_qf_names[GRPQUOTA]);
2540*4882a593Smuzhiyun if (usr_qf_name)
2541*4882a593Smuzhiyun seq_show_option(seq, "usrjquota", usr_qf_name);
2542*4882a593Smuzhiyun if (grp_qf_name)
2543*4882a593Smuzhiyun seq_show_option(seq, "grpjquota", grp_qf_name);
2544*4882a593Smuzhiyun rcu_read_unlock();
2545*4882a593Smuzhiyun #endif
2546*4882a593Smuzhiyun }
2547*4882a593Smuzhiyun
token2str(int token)2548*4882a593Smuzhiyun static const char *token2str(int token)
2549*4882a593Smuzhiyun {
2550*4882a593Smuzhiyun const struct match_token *t;
2551*4882a593Smuzhiyun
2552*4882a593Smuzhiyun for (t = tokens; t->token != Opt_err; t++)
2553*4882a593Smuzhiyun if (t->token == token && !strchr(t->pattern, '='))
2554*4882a593Smuzhiyun break;
2555*4882a593Smuzhiyun return t->pattern;
2556*4882a593Smuzhiyun }
2557*4882a593Smuzhiyun
2558*4882a593Smuzhiyun /*
2559*4882a593Smuzhiyun * Show an option if
2560*4882a593Smuzhiyun * - it's set to a non-default value OR
2561*4882a593Smuzhiyun * - if the per-sb default is different from the global default
2562*4882a593Smuzhiyun */
_ext4_show_options(struct seq_file * seq,struct super_block * sb,int nodefs)2563*4882a593Smuzhiyun static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
2564*4882a593Smuzhiyun int nodefs)
2565*4882a593Smuzhiyun {
2566*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2567*4882a593Smuzhiyun struct ext4_super_block *es = sbi->s_es;
2568*4882a593Smuzhiyun int def_errors, def_mount_opt = sbi->s_def_mount_opt;
2569*4882a593Smuzhiyun const struct mount_opts *m;
2570*4882a593Smuzhiyun char sep = nodefs ? '\n' : ',';
2571*4882a593Smuzhiyun
2572*4882a593Smuzhiyun #define SEQ_OPTS_PUTS(str) seq_printf(seq, "%c" str, sep)
2573*4882a593Smuzhiyun #define SEQ_OPTS_PRINT(str, arg) seq_printf(seq, "%c" str, sep, arg)
2574*4882a593Smuzhiyun
2575*4882a593Smuzhiyun if (sbi->s_sb_block != 1)
2576*4882a593Smuzhiyun SEQ_OPTS_PRINT("sb=%llu", sbi->s_sb_block);
2577*4882a593Smuzhiyun
2578*4882a593Smuzhiyun for (m = ext4_mount_opts; m->token != Opt_err; m++) {
2579*4882a593Smuzhiyun int want_set = m->flags & MOPT_SET;
2580*4882a593Smuzhiyun if (((m->flags & (MOPT_SET|MOPT_CLEAR)) == 0) ||
2581*4882a593Smuzhiyun (m->flags & MOPT_CLEAR_ERR) || m->flags & MOPT_SKIP)
2582*4882a593Smuzhiyun continue;
2583*4882a593Smuzhiyun if (!nodefs && !(m->mount_opt & (sbi->s_mount_opt ^ def_mount_opt)))
2584*4882a593Smuzhiyun continue; /* skip if same as the default */
2585*4882a593Smuzhiyun if ((want_set &&
2586*4882a593Smuzhiyun (sbi->s_mount_opt & m->mount_opt) != m->mount_opt) ||
2587*4882a593Smuzhiyun (!want_set && (sbi->s_mount_opt & m->mount_opt)))
2588*4882a593Smuzhiyun continue; /* select Opt_noFoo vs Opt_Foo */
2589*4882a593Smuzhiyun SEQ_OPTS_PRINT("%s", token2str(m->token));
2590*4882a593Smuzhiyun }
2591*4882a593Smuzhiyun
2592*4882a593Smuzhiyun if (nodefs || !uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT4_DEF_RESUID)) ||
2593*4882a593Smuzhiyun le16_to_cpu(es->s_def_resuid) != EXT4_DEF_RESUID)
2594*4882a593Smuzhiyun SEQ_OPTS_PRINT("resuid=%u",
2595*4882a593Smuzhiyun from_kuid_munged(&init_user_ns, sbi->s_resuid));
2596*4882a593Smuzhiyun if (nodefs || !gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT4_DEF_RESGID)) ||
2597*4882a593Smuzhiyun le16_to_cpu(es->s_def_resgid) != EXT4_DEF_RESGID)
2598*4882a593Smuzhiyun SEQ_OPTS_PRINT("resgid=%u",
2599*4882a593Smuzhiyun from_kgid_munged(&init_user_ns, sbi->s_resgid));
2600*4882a593Smuzhiyun def_errors = nodefs ? -1 : le16_to_cpu(es->s_errors);
2601*4882a593Smuzhiyun if (test_opt(sb, ERRORS_RO) && def_errors != EXT4_ERRORS_RO)
2602*4882a593Smuzhiyun SEQ_OPTS_PUTS("errors=remount-ro");
2603*4882a593Smuzhiyun if (test_opt(sb, ERRORS_CONT) && def_errors != EXT4_ERRORS_CONTINUE)
2604*4882a593Smuzhiyun SEQ_OPTS_PUTS("errors=continue");
2605*4882a593Smuzhiyun if (test_opt(sb, ERRORS_PANIC) && def_errors != EXT4_ERRORS_PANIC)
2606*4882a593Smuzhiyun SEQ_OPTS_PUTS("errors=panic");
2607*4882a593Smuzhiyun if (nodefs || sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ)
2608*4882a593Smuzhiyun SEQ_OPTS_PRINT("commit=%lu", sbi->s_commit_interval / HZ);
2609*4882a593Smuzhiyun if (nodefs || sbi->s_min_batch_time != EXT4_DEF_MIN_BATCH_TIME)
2610*4882a593Smuzhiyun SEQ_OPTS_PRINT("min_batch_time=%u", sbi->s_min_batch_time);
2611*4882a593Smuzhiyun if (nodefs || sbi->s_max_batch_time != EXT4_DEF_MAX_BATCH_TIME)
2612*4882a593Smuzhiyun SEQ_OPTS_PRINT("max_batch_time=%u", sbi->s_max_batch_time);
2613*4882a593Smuzhiyun if (sb->s_flags & SB_I_VERSION)
2614*4882a593Smuzhiyun SEQ_OPTS_PUTS("i_version");
2615*4882a593Smuzhiyun if (nodefs || sbi->s_stripe)
2616*4882a593Smuzhiyun SEQ_OPTS_PRINT("stripe=%lu", sbi->s_stripe);
2617*4882a593Smuzhiyun if (nodefs || EXT4_MOUNT_DATA_FLAGS &
2618*4882a593Smuzhiyun (sbi->s_mount_opt ^ def_mount_opt)) {
2619*4882a593Smuzhiyun if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
2620*4882a593Smuzhiyun SEQ_OPTS_PUTS("data=journal");
2621*4882a593Smuzhiyun else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA)
2622*4882a593Smuzhiyun SEQ_OPTS_PUTS("data=ordered");
2623*4882a593Smuzhiyun else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)
2624*4882a593Smuzhiyun SEQ_OPTS_PUTS("data=writeback");
2625*4882a593Smuzhiyun }
2626*4882a593Smuzhiyun if (nodefs ||
2627*4882a593Smuzhiyun sbi->s_inode_readahead_blks != EXT4_DEF_INODE_READAHEAD_BLKS)
2628*4882a593Smuzhiyun SEQ_OPTS_PRINT("inode_readahead_blks=%u",
2629*4882a593Smuzhiyun sbi->s_inode_readahead_blks);
2630*4882a593Smuzhiyun
2631*4882a593Smuzhiyun if (test_opt(sb, INIT_INODE_TABLE) && (nodefs ||
2632*4882a593Smuzhiyun (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT)))
2633*4882a593Smuzhiyun SEQ_OPTS_PRINT("init_itable=%u", sbi->s_li_wait_mult);
2634*4882a593Smuzhiyun if (nodefs || sbi->s_max_dir_size_kb)
2635*4882a593Smuzhiyun SEQ_OPTS_PRINT("max_dir_size_kb=%u", sbi->s_max_dir_size_kb);
2636*4882a593Smuzhiyun if (test_opt(sb, DATA_ERR_ABORT))
2637*4882a593Smuzhiyun SEQ_OPTS_PUTS("data_err=abort");
2638*4882a593Smuzhiyun
2639*4882a593Smuzhiyun fscrypt_show_test_dummy_encryption(seq, sep, sb);
2640*4882a593Smuzhiyun
2641*4882a593Smuzhiyun if (sb->s_flags & SB_INLINECRYPT)
2642*4882a593Smuzhiyun SEQ_OPTS_PUTS("inlinecrypt");
2643*4882a593Smuzhiyun
2644*4882a593Smuzhiyun if (test_opt(sb, DAX_ALWAYS)) {
2645*4882a593Smuzhiyun if (IS_EXT2_SB(sb))
2646*4882a593Smuzhiyun SEQ_OPTS_PUTS("dax");
2647*4882a593Smuzhiyun else
2648*4882a593Smuzhiyun SEQ_OPTS_PUTS("dax=always");
2649*4882a593Smuzhiyun } else if (test_opt2(sb, DAX_NEVER)) {
2650*4882a593Smuzhiyun SEQ_OPTS_PUTS("dax=never");
2651*4882a593Smuzhiyun } else if (test_opt2(sb, DAX_INODE)) {
2652*4882a593Smuzhiyun SEQ_OPTS_PUTS("dax=inode");
2653*4882a593Smuzhiyun }
2654*4882a593Smuzhiyun ext4_show_quota_options(seq, sb);
2655*4882a593Smuzhiyun return 0;
2656*4882a593Smuzhiyun }
2657*4882a593Smuzhiyun
ext4_show_options(struct seq_file * seq,struct dentry * root)2658*4882a593Smuzhiyun static int ext4_show_options(struct seq_file *seq, struct dentry *root)
2659*4882a593Smuzhiyun {
2660*4882a593Smuzhiyun return _ext4_show_options(seq, root->d_sb, 0);
2661*4882a593Smuzhiyun }
2662*4882a593Smuzhiyun
ext4_seq_options_show(struct seq_file * seq,void * offset)2663*4882a593Smuzhiyun int ext4_seq_options_show(struct seq_file *seq, void *offset)
2664*4882a593Smuzhiyun {
2665*4882a593Smuzhiyun struct super_block *sb = seq->private;
2666*4882a593Smuzhiyun int rc;
2667*4882a593Smuzhiyun
2668*4882a593Smuzhiyun seq_puts(seq, sb_rdonly(sb) ? "ro" : "rw");
2669*4882a593Smuzhiyun rc = _ext4_show_options(seq, sb, 1);
2670*4882a593Smuzhiyun seq_puts(seq, "\n");
2671*4882a593Smuzhiyun return rc;
2672*4882a593Smuzhiyun }
2673*4882a593Smuzhiyun
ext4_setup_super(struct super_block * sb,struct ext4_super_block * es,int read_only)2674*4882a593Smuzhiyun static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es,
2675*4882a593Smuzhiyun int read_only)
2676*4882a593Smuzhiyun {
2677*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2678*4882a593Smuzhiyun int err = 0;
2679*4882a593Smuzhiyun
2680*4882a593Smuzhiyun if (le32_to_cpu(es->s_rev_level) > EXT4_MAX_SUPP_REV) {
2681*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "revision level too high, "
2682*4882a593Smuzhiyun "forcing read-only mode");
2683*4882a593Smuzhiyun err = -EROFS;
2684*4882a593Smuzhiyun goto done;
2685*4882a593Smuzhiyun }
2686*4882a593Smuzhiyun if (read_only)
2687*4882a593Smuzhiyun goto done;
2688*4882a593Smuzhiyun if (!(sbi->s_mount_state & EXT4_VALID_FS))
2689*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "warning: mounting unchecked fs, "
2690*4882a593Smuzhiyun "running e2fsck is recommended");
2691*4882a593Smuzhiyun else if (sbi->s_mount_state & EXT4_ERROR_FS)
2692*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2693*4882a593Smuzhiyun "warning: mounting fs with errors, "
2694*4882a593Smuzhiyun "running e2fsck is recommended");
2695*4882a593Smuzhiyun else if ((__s16) le16_to_cpu(es->s_max_mnt_count) > 0 &&
2696*4882a593Smuzhiyun le16_to_cpu(es->s_mnt_count) >=
2697*4882a593Smuzhiyun (unsigned short) (__s16) le16_to_cpu(es->s_max_mnt_count))
2698*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2699*4882a593Smuzhiyun "warning: maximal mount count reached, "
2700*4882a593Smuzhiyun "running e2fsck is recommended");
2701*4882a593Smuzhiyun else if (le32_to_cpu(es->s_checkinterval) &&
2702*4882a593Smuzhiyun (ext4_get_tstamp(es, s_lastcheck) +
2703*4882a593Smuzhiyun le32_to_cpu(es->s_checkinterval) <= ktime_get_real_seconds()))
2704*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
2705*4882a593Smuzhiyun "warning: checktime reached, "
2706*4882a593Smuzhiyun "running e2fsck is recommended");
2707*4882a593Smuzhiyun if (!sbi->s_journal)
2708*4882a593Smuzhiyun es->s_state &= cpu_to_le16(~EXT4_VALID_FS);
2709*4882a593Smuzhiyun if (!(__s16) le16_to_cpu(es->s_max_mnt_count))
2710*4882a593Smuzhiyun es->s_max_mnt_count = cpu_to_le16(EXT4_DFL_MAX_MNT_COUNT);
2711*4882a593Smuzhiyun le16_add_cpu(&es->s_mnt_count, 1);
2712*4882a593Smuzhiyun ext4_update_tstamp(es, s_mtime);
2713*4882a593Smuzhiyun if (sbi->s_journal)
2714*4882a593Smuzhiyun ext4_set_feature_journal_needs_recovery(sb);
2715*4882a593Smuzhiyun
2716*4882a593Smuzhiyun err = ext4_commit_super(sb, 1);
2717*4882a593Smuzhiyun done:
2718*4882a593Smuzhiyun if (test_opt(sb, DEBUG))
2719*4882a593Smuzhiyun printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, "
2720*4882a593Smuzhiyun "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n",
2721*4882a593Smuzhiyun sb->s_blocksize,
2722*4882a593Smuzhiyun sbi->s_groups_count,
2723*4882a593Smuzhiyun EXT4_BLOCKS_PER_GROUP(sb),
2724*4882a593Smuzhiyun EXT4_INODES_PER_GROUP(sb),
2725*4882a593Smuzhiyun sbi->s_mount_opt, sbi->s_mount_opt2);
2726*4882a593Smuzhiyun
2727*4882a593Smuzhiyun cleancache_init_fs(sb);
2728*4882a593Smuzhiyun return err;
2729*4882a593Smuzhiyun }
2730*4882a593Smuzhiyun
ext4_alloc_flex_bg_array(struct super_block * sb,ext4_group_t ngroup)2731*4882a593Smuzhiyun int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup)
2732*4882a593Smuzhiyun {
2733*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2734*4882a593Smuzhiyun struct flex_groups **old_groups, **new_groups;
2735*4882a593Smuzhiyun int size, i, j;
2736*4882a593Smuzhiyun
2737*4882a593Smuzhiyun if (!sbi->s_log_groups_per_flex)
2738*4882a593Smuzhiyun return 0;
2739*4882a593Smuzhiyun
2740*4882a593Smuzhiyun size = ext4_flex_group(sbi, ngroup - 1) + 1;
2741*4882a593Smuzhiyun if (size <= sbi->s_flex_groups_allocated)
2742*4882a593Smuzhiyun return 0;
2743*4882a593Smuzhiyun
2744*4882a593Smuzhiyun new_groups = kvzalloc(roundup_pow_of_two(size *
2745*4882a593Smuzhiyun sizeof(*sbi->s_flex_groups)), GFP_KERNEL);
2746*4882a593Smuzhiyun if (!new_groups) {
2747*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2748*4882a593Smuzhiyun "not enough memory for %d flex group pointers", size);
2749*4882a593Smuzhiyun return -ENOMEM;
2750*4882a593Smuzhiyun }
2751*4882a593Smuzhiyun for (i = sbi->s_flex_groups_allocated; i < size; i++) {
2752*4882a593Smuzhiyun new_groups[i] = kvzalloc(roundup_pow_of_two(
2753*4882a593Smuzhiyun sizeof(struct flex_groups)),
2754*4882a593Smuzhiyun GFP_KERNEL);
2755*4882a593Smuzhiyun if (!new_groups[i]) {
2756*4882a593Smuzhiyun for (j = sbi->s_flex_groups_allocated; j < i; j++)
2757*4882a593Smuzhiyun kvfree(new_groups[j]);
2758*4882a593Smuzhiyun kvfree(new_groups);
2759*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
2760*4882a593Smuzhiyun "not enough memory for %d flex groups", size);
2761*4882a593Smuzhiyun return -ENOMEM;
2762*4882a593Smuzhiyun }
2763*4882a593Smuzhiyun }
2764*4882a593Smuzhiyun rcu_read_lock();
2765*4882a593Smuzhiyun old_groups = rcu_dereference(sbi->s_flex_groups);
2766*4882a593Smuzhiyun if (old_groups)
2767*4882a593Smuzhiyun memcpy(new_groups, old_groups,
2768*4882a593Smuzhiyun (sbi->s_flex_groups_allocated *
2769*4882a593Smuzhiyun sizeof(struct flex_groups *)));
2770*4882a593Smuzhiyun rcu_read_unlock();
2771*4882a593Smuzhiyun rcu_assign_pointer(sbi->s_flex_groups, new_groups);
2772*4882a593Smuzhiyun sbi->s_flex_groups_allocated = size;
2773*4882a593Smuzhiyun if (old_groups)
2774*4882a593Smuzhiyun ext4_kvfree_array_rcu(old_groups);
2775*4882a593Smuzhiyun return 0;
2776*4882a593Smuzhiyun }
2777*4882a593Smuzhiyun
ext4_fill_flex_info(struct super_block * sb)2778*4882a593Smuzhiyun static int ext4_fill_flex_info(struct super_block *sb)
2779*4882a593Smuzhiyun {
2780*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2781*4882a593Smuzhiyun struct ext4_group_desc *gdp = NULL;
2782*4882a593Smuzhiyun struct flex_groups *fg;
2783*4882a593Smuzhiyun ext4_group_t flex_group;
2784*4882a593Smuzhiyun int i, err;
2785*4882a593Smuzhiyun
2786*4882a593Smuzhiyun sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex;
2787*4882a593Smuzhiyun if (sbi->s_log_groups_per_flex < 1 || sbi->s_log_groups_per_flex > 31) {
2788*4882a593Smuzhiyun sbi->s_log_groups_per_flex = 0;
2789*4882a593Smuzhiyun return 1;
2790*4882a593Smuzhiyun }
2791*4882a593Smuzhiyun
2792*4882a593Smuzhiyun err = ext4_alloc_flex_bg_array(sb, sbi->s_groups_count);
2793*4882a593Smuzhiyun if (err)
2794*4882a593Smuzhiyun goto failed;
2795*4882a593Smuzhiyun
2796*4882a593Smuzhiyun for (i = 0; i < sbi->s_groups_count; i++) {
2797*4882a593Smuzhiyun gdp = ext4_get_group_desc(sb, i, NULL);
2798*4882a593Smuzhiyun
2799*4882a593Smuzhiyun flex_group = ext4_flex_group(sbi, i);
2800*4882a593Smuzhiyun fg = sbi_array_rcu_deref(sbi, s_flex_groups, flex_group);
2801*4882a593Smuzhiyun atomic_add(ext4_free_inodes_count(sb, gdp), &fg->free_inodes);
2802*4882a593Smuzhiyun atomic64_add(ext4_free_group_clusters(sb, gdp),
2803*4882a593Smuzhiyun &fg->free_clusters);
2804*4882a593Smuzhiyun atomic_add(ext4_used_dirs_count(sb, gdp), &fg->used_dirs);
2805*4882a593Smuzhiyun }
2806*4882a593Smuzhiyun
2807*4882a593Smuzhiyun return 1;
2808*4882a593Smuzhiyun failed:
2809*4882a593Smuzhiyun return 0;
2810*4882a593Smuzhiyun }
2811*4882a593Smuzhiyun
ext4_group_desc_csum(struct super_block * sb,__u32 block_group,struct ext4_group_desc * gdp)2812*4882a593Smuzhiyun static __le16 ext4_group_desc_csum(struct super_block *sb, __u32 block_group,
2813*4882a593Smuzhiyun struct ext4_group_desc *gdp)
2814*4882a593Smuzhiyun {
2815*4882a593Smuzhiyun int offset = offsetof(struct ext4_group_desc, bg_checksum);
2816*4882a593Smuzhiyun __u16 crc = 0;
2817*4882a593Smuzhiyun __le32 le_group = cpu_to_le32(block_group);
2818*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2819*4882a593Smuzhiyun
2820*4882a593Smuzhiyun if (ext4_has_metadata_csum(sbi->s_sb)) {
2821*4882a593Smuzhiyun /* Use new metadata_csum algorithm */
2822*4882a593Smuzhiyun __u32 csum32;
2823*4882a593Smuzhiyun __u16 dummy_csum = 0;
2824*4882a593Smuzhiyun
2825*4882a593Smuzhiyun csum32 = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)&le_group,
2826*4882a593Smuzhiyun sizeof(le_group));
2827*4882a593Smuzhiyun csum32 = ext4_chksum(sbi, csum32, (__u8 *)gdp, offset);
2828*4882a593Smuzhiyun csum32 = ext4_chksum(sbi, csum32, (__u8 *)&dummy_csum,
2829*4882a593Smuzhiyun sizeof(dummy_csum));
2830*4882a593Smuzhiyun offset += sizeof(dummy_csum);
2831*4882a593Smuzhiyun if (offset < sbi->s_desc_size)
2832*4882a593Smuzhiyun csum32 = ext4_chksum(sbi, csum32, (__u8 *)gdp + offset,
2833*4882a593Smuzhiyun sbi->s_desc_size - offset);
2834*4882a593Smuzhiyun
2835*4882a593Smuzhiyun crc = csum32 & 0xFFFF;
2836*4882a593Smuzhiyun goto out;
2837*4882a593Smuzhiyun }
2838*4882a593Smuzhiyun
2839*4882a593Smuzhiyun /* old crc16 code */
2840*4882a593Smuzhiyun if (!ext4_has_feature_gdt_csum(sb))
2841*4882a593Smuzhiyun return 0;
2842*4882a593Smuzhiyun
2843*4882a593Smuzhiyun crc = crc16(~0, sbi->s_es->s_uuid, sizeof(sbi->s_es->s_uuid));
2844*4882a593Smuzhiyun crc = crc16(crc, (__u8 *)&le_group, sizeof(le_group));
2845*4882a593Smuzhiyun crc = crc16(crc, (__u8 *)gdp, offset);
2846*4882a593Smuzhiyun offset += sizeof(gdp->bg_checksum); /* skip checksum */
2847*4882a593Smuzhiyun /* for checksum of struct ext4_group_desc do the rest...*/
2848*4882a593Smuzhiyun if (ext4_has_feature_64bit(sb) &&
2849*4882a593Smuzhiyun offset < le16_to_cpu(sbi->s_es->s_desc_size))
2850*4882a593Smuzhiyun crc = crc16(crc, (__u8 *)gdp + offset,
2851*4882a593Smuzhiyun le16_to_cpu(sbi->s_es->s_desc_size) -
2852*4882a593Smuzhiyun offset);
2853*4882a593Smuzhiyun
2854*4882a593Smuzhiyun out:
2855*4882a593Smuzhiyun return cpu_to_le16(crc);
2856*4882a593Smuzhiyun }
2857*4882a593Smuzhiyun
ext4_group_desc_csum_verify(struct super_block * sb,__u32 block_group,struct ext4_group_desc * gdp)2858*4882a593Smuzhiyun int ext4_group_desc_csum_verify(struct super_block *sb, __u32 block_group,
2859*4882a593Smuzhiyun struct ext4_group_desc *gdp)
2860*4882a593Smuzhiyun {
2861*4882a593Smuzhiyun if (ext4_has_group_desc_csum(sb) &&
2862*4882a593Smuzhiyun (gdp->bg_checksum != ext4_group_desc_csum(sb, block_group, gdp)))
2863*4882a593Smuzhiyun return 0;
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun return 1;
2866*4882a593Smuzhiyun }
2867*4882a593Smuzhiyun
ext4_group_desc_csum_set(struct super_block * sb,__u32 block_group,struct ext4_group_desc * gdp)2868*4882a593Smuzhiyun void ext4_group_desc_csum_set(struct super_block *sb, __u32 block_group,
2869*4882a593Smuzhiyun struct ext4_group_desc *gdp)
2870*4882a593Smuzhiyun {
2871*4882a593Smuzhiyun if (!ext4_has_group_desc_csum(sb))
2872*4882a593Smuzhiyun return;
2873*4882a593Smuzhiyun gdp->bg_checksum = ext4_group_desc_csum(sb, block_group, gdp);
2874*4882a593Smuzhiyun }
2875*4882a593Smuzhiyun
2876*4882a593Smuzhiyun /* Called at mount-time, super-block is locked */
ext4_check_descriptors(struct super_block * sb,ext4_fsblk_t sb_block,ext4_group_t * first_not_zeroed)2877*4882a593Smuzhiyun static int ext4_check_descriptors(struct super_block *sb,
2878*4882a593Smuzhiyun ext4_fsblk_t sb_block,
2879*4882a593Smuzhiyun ext4_group_t *first_not_zeroed)
2880*4882a593Smuzhiyun {
2881*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
2882*4882a593Smuzhiyun ext4_fsblk_t first_block = le32_to_cpu(sbi->s_es->s_first_data_block);
2883*4882a593Smuzhiyun ext4_fsblk_t last_block;
2884*4882a593Smuzhiyun ext4_fsblk_t last_bg_block = sb_block + ext4_bg_num_gdb(sb, 0);
2885*4882a593Smuzhiyun ext4_fsblk_t block_bitmap;
2886*4882a593Smuzhiyun ext4_fsblk_t inode_bitmap;
2887*4882a593Smuzhiyun ext4_fsblk_t inode_table;
2888*4882a593Smuzhiyun int flexbg_flag = 0;
2889*4882a593Smuzhiyun ext4_group_t i, grp = sbi->s_groups_count;
2890*4882a593Smuzhiyun
2891*4882a593Smuzhiyun if (ext4_has_feature_flex_bg(sb))
2892*4882a593Smuzhiyun flexbg_flag = 1;
2893*4882a593Smuzhiyun
2894*4882a593Smuzhiyun ext4_debug("Checking group descriptors");
2895*4882a593Smuzhiyun
2896*4882a593Smuzhiyun for (i = 0; i < sbi->s_groups_count; i++) {
2897*4882a593Smuzhiyun struct ext4_group_desc *gdp = ext4_get_group_desc(sb, i, NULL);
2898*4882a593Smuzhiyun
2899*4882a593Smuzhiyun if (i == sbi->s_groups_count - 1 || flexbg_flag)
2900*4882a593Smuzhiyun last_block = ext4_blocks_count(sbi->s_es) - 1;
2901*4882a593Smuzhiyun else
2902*4882a593Smuzhiyun last_block = first_block +
2903*4882a593Smuzhiyun (EXT4_BLOCKS_PER_GROUP(sb) - 1);
2904*4882a593Smuzhiyun
2905*4882a593Smuzhiyun if ((grp == sbi->s_groups_count) &&
2906*4882a593Smuzhiyun !(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED)))
2907*4882a593Smuzhiyun grp = i;
2908*4882a593Smuzhiyun
2909*4882a593Smuzhiyun block_bitmap = ext4_block_bitmap(sb, gdp);
2910*4882a593Smuzhiyun if (block_bitmap == sb_block) {
2911*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2912*4882a593Smuzhiyun "Block bitmap for group %u overlaps "
2913*4882a593Smuzhiyun "superblock", i);
2914*4882a593Smuzhiyun if (!sb_rdonly(sb))
2915*4882a593Smuzhiyun return 0;
2916*4882a593Smuzhiyun }
2917*4882a593Smuzhiyun if (block_bitmap >= sb_block + 1 &&
2918*4882a593Smuzhiyun block_bitmap <= last_bg_block) {
2919*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2920*4882a593Smuzhiyun "Block bitmap for group %u overlaps "
2921*4882a593Smuzhiyun "block group descriptors", i);
2922*4882a593Smuzhiyun if (!sb_rdonly(sb))
2923*4882a593Smuzhiyun return 0;
2924*4882a593Smuzhiyun }
2925*4882a593Smuzhiyun if (block_bitmap < first_block || block_bitmap > last_block) {
2926*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2927*4882a593Smuzhiyun "Block bitmap for group %u not in group "
2928*4882a593Smuzhiyun "(block %llu)!", i, block_bitmap);
2929*4882a593Smuzhiyun return 0;
2930*4882a593Smuzhiyun }
2931*4882a593Smuzhiyun inode_bitmap = ext4_inode_bitmap(sb, gdp);
2932*4882a593Smuzhiyun if (inode_bitmap == sb_block) {
2933*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2934*4882a593Smuzhiyun "Inode bitmap for group %u overlaps "
2935*4882a593Smuzhiyun "superblock", i);
2936*4882a593Smuzhiyun if (!sb_rdonly(sb))
2937*4882a593Smuzhiyun return 0;
2938*4882a593Smuzhiyun }
2939*4882a593Smuzhiyun if (inode_bitmap >= sb_block + 1 &&
2940*4882a593Smuzhiyun inode_bitmap <= last_bg_block) {
2941*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2942*4882a593Smuzhiyun "Inode bitmap for group %u overlaps "
2943*4882a593Smuzhiyun "block group descriptors", i);
2944*4882a593Smuzhiyun if (!sb_rdonly(sb))
2945*4882a593Smuzhiyun return 0;
2946*4882a593Smuzhiyun }
2947*4882a593Smuzhiyun if (inode_bitmap < first_block || inode_bitmap > last_block) {
2948*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2949*4882a593Smuzhiyun "Inode bitmap for group %u not in group "
2950*4882a593Smuzhiyun "(block %llu)!", i, inode_bitmap);
2951*4882a593Smuzhiyun return 0;
2952*4882a593Smuzhiyun }
2953*4882a593Smuzhiyun inode_table = ext4_inode_table(sb, gdp);
2954*4882a593Smuzhiyun if (inode_table == sb_block) {
2955*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2956*4882a593Smuzhiyun "Inode table for group %u overlaps "
2957*4882a593Smuzhiyun "superblock", i);
2958*4882a593Smuzhiyun if (!sb_rdonly(sb))
2959*4882a593Smuzhiyun return 0;
2960*4882a593Smuzhiyun }
2961*4882a593Smuzhiyun if (inode_table >= sb_block + 1 &&
2962*4882a593Smuzhiyun inode_table <= last_bg_block) {
2963*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2964*4882a593Smuzhiyun "Inode table for group %u overlaps "
2965*4882a593Smuzhiyun "block group descriptors", i);
2966*4882a593Smuzhiyun if (!sb_rdonly(sb))
2967*4882a593Smuzhiyun return 0;
2968*4882a593Smuzhiyun }
2969*4882a593Smuzhiyun if (inode_table < first_block ||
2970*4882a593Smuzhiyun inode_table + sbi->s_itb_per_group - 1 > last_block) {
2971*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2972*4882a593Smuzhiyun "Inode table for group %u not in group "
2973*4882a593Smuzhiyun "(block %llu)!", i, inode_table);
2974*4882a593Smuzhiyun return 0;
2975*4882a593Smuzhiyun }
2976*4882a593Smuzhiyun ext4_lock_group(sb, i);
2977*4882a593Smuzhiyun if (!ext4_group_desc_csum_verify(sb, i, gdp)) {
2978*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
2979*4882a593Smuzhiyun "Checksum for group %u failed (%u!=%u)",
2980*4882a593Smuzhiyun i, le16_to_cpu(ext4_group_desc_csum(sb, i,
2981*4882a593Smuzhiyun gdp)), le16_to_cpu(gdp->bg_checksum));
2982*4882a593Smuzhiyun if (!sb_rdonly(sb)) {
2983*4882a593Smuzhiyun ext4_unlock_group(sb, i);
2984*4882a593Smuzhiyun return 0;
2985*4882a593Smuzhiyun }
2986*4882a593Smuzhiyun }
2987*4882a593Smuzhiyun ext4_unlock_group(sb, i);
2988*4882a593Smuzhiyun if (!flexbg_flag)
2989*4882a593Smuzhiyun first_block += EXT4_BLOCKS_PER_GROUP(sb);
2990*4882a593Smuzhiyun }
2991*4882a593Smuzhiyun if (NULL != first_not_zeroed)
2992*4882a593Smuzhiyun *first_not_zeroed = grp;
2993*4882a593Smuzhiyun return 1;
2994*4882a593Smuzhiyun }
2995*4882a593Smuzhiyun
2996*4882a593Smuzhiyun /* ext4_orphan_cleanup() walks a singly-linked list of inodes (starting at
2997*4882a593Smuzhiyun * the superblock) which were deleted from all directories, but held open by
2998*4882a593Smuzhiyun * a process at the time of a crash. We walk the list and try to delete these
2999*4882a593Smuzhiyun * inodes at recovery time (only with a read-write filesystem).
3000*4882a593Smuzhiyun *
3001*4882a593Smuzhiyun * In order to keep the orphan inode chain consistent during traversal (in
3002*4882a593Smuzhiyun * case of crash during recovery), we link each inode into the superblock
3003*4882a593Smuzhiyun * orphan list_head and handle it the same way as an inode deletion during
3004*4882a593Smuzhiyun * normal operation (which journals the operations for us).
3005*4882a593Smuzhiyun *
3006*4882a593Smuzhiyun * We only do an iget() and an iput() on each inode, which is very safe if we
3007*4882a593Smuzhiyun * accidentally point at an in-use or already deleted inode. The worst that
3008*4882a593Smuzhiyun * can happen in this case is that we get a "bit already cleared" message from
3009*4882a593Smuzhiyun * ext4_free_inode(). The only reason we would point at a wrong inode is if
3010*4882a593Smuzhiyun * e2fsck was run on this filesystem, and it must have already done the orphan
3011*4882a593Smuzhiyun * inode cleanup for us, so we can safely abort without any further action.
3012*4882a593Smuzhiyun */
ext4_orphan_cleanup(struct super_block * sb,struct ext4_super_block * es)3013*4882a593Smuzhiyun static void ext4_orphan_cleanup(struct super_block *sb,
3014*4882a593Smuzhiyun struct ext4_super_block *es)
3015*4882a593Smuzhiyun {
3016*4882a593Smuzhiyun unsigned int s_flags = sb->s_flags;
3017*4882a593Smuzhiyun int ret, nr_orphans = 0, nr_truncates = 0;
3018*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
3019*4882a593Smuzhiyun int quota_update = 0;
3020*4882a593Smuzhiyun int i;
3021*4882a593Smuzhiyun #endif
3022*4882a593Smuzhiyun if (!es->s_last_orphan) {
3023*4882a593Smuzhiyun jbd_debug(4, "no orphan inodes to clean up\n");
3024*4882a593Smuzhiyun return;
3025*4882a593Smuzhiyun }
3026*4882a593Smuzhiyun
3027*4882a593Smuzhiyun if (bdev_read_only(sb->s_bdev)) {
3028*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "write access "
3029*4882a593Smuzhiyun "unavailable, skipping orphan cleanup");
3030*4882a593Smuzhiyun return;
3031*4882a593Smuzhiyun }
3032*4882a593Smuzhiyun
3033*4882a593Smuzhiyun /* Check if feature set would not allow a r/w mount */
3034*4882a593Smuzhiyun if (!ext4_feature_set_ok(sb, 0)) {
3035*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "Skipping orphan cleanup due to "
3036*4882a593Smuzhiyun "unknown ROCOMPAT features");
3037*4882a593Smuzhiyun return;
3038*4882a593Smuzhiyun }
3039*4882a593Smuzhiyun
3040*4882a593Smuzhiyun if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
3041*4882a593Smuzhiyun /* don't clear list on RO mount w/ errors */
3042*4882a593Smuzhiyun if (es->s_last_orphan && !(s_flags & SB_RDONLY)) {
3043*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "Errors on filesystem, "
3044*4882a593Smuzhiyun "clearing orphan list.\n");
3045*4882a593Smuzhiyun es->s_last_orphan = 0;
3046*4882a593Smuzhiyun }
3047*4882a593Smuzhiyun jbd_debug(1, "Skipping orphan recovery on fs with errors.\n");
3048*4882a593Smuzhiyun return;
3049*4882a593Smuzhiyun }
3050*4882a593Smuzhiyun
3051*4882a593Smuzhiyun if (s_flags & SB_RDONLY) {
3052*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "orphan cleanup on readonly fs");
3053*4882a593Smuzhiyun sb->s_flags &= ~SB_RDONLY;
3054*4882a593Smuzhiyun }
3055*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
3056*4882a593Smuzhiyun /*
3057*4882a593Smuzhiyun * Turn on quotas which were not enabled for read-only mounts if
3058*4882a593Smuzhiyun * filesystem has quota feature, so that they are updated correctly.
3059*4882a593Smuzhiyun */
3060*4882a593Smuzhiyun if (ext4_has_feature_quota(sb) && (s_flags & SB_RDONLY)) {
3061*4882a593Smuzhiyun int ret = ext4_enable_quotas(sb);
3062*4882a593Smuzhiyun
3063*4882a593Smuzhiyun if (!ret)
3064*4882a593Smuzhiyun quota_update = 1;
3065*4882a593Smuzhiyun else
3066*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
3067*4882a593Smuzhiyun "Cannot turn on quotas: error %d", ret);
3068*4882a593Smuzhiyun }
3069*4882a593Smuzhiyun
3070*4882a593Smuzhiyun /* Turn on journaled quotas used for old sytle */
3071*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++) {
3072*4882a593Smuzhiyun if (EXT4_SB(sb)->s_qf_names[i]) {
3073*4882a593Smuzhiyun int ret = ext4_quota_on_mount(sb, i);
3074*4882a593Smuzhiyun
3075*4882a593Smuzhiyun if (!ret)
3076*4882a593Smuzhiyun quota_update = 1;
3077*4882a593Smuzhiyun else
3078*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
3079*4882a593Smuzhiyun "Cannot turn on journaled "
3080*4882a593Smuzhiyun "quota: type %d: error %d", i, ret);
3081*4882a593Smuzhiyun }
3082*4882a593Smuzhiyun }
3083*4882a593Smuzhiyun #endif
3084*4882a593Smuzhiyun
3085*4882a593Smuzhiyun while (es->s_last_orphan) {
3086*4882a593Smuzhiyun struct inode *inode;
3087*4882a593Smuzhiyun
3088*4882a593Smuzhiyun /*
3089*4882a593Smuzhiyun * We may have encountered an error during cleanup; if
3090*4882a593Smuzhiyun * so, skip the rest.
3091*4882a593Smuzhiyun */
3092*4882a593Smuzhiyun if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
3093*4882a593Smuzhiyun jbd_debug(1, "Skipping orphan recovery on fs with errors.\n");
3094*4882a593Smuzhiyun es->s_last_orphan = 0;
3095*4882a593Smuzhiyun break;
3096*4882a593Smuzhiyun }
3097*4882a593Smuzhiyun
3098*4882a593Smuzhiyun inode = ext4_orphan_get(sb, le32_to_cpu(es->s_last_orphan));
3099*4882a593Smuzhiyun if (IS_ERR(inode)) {
3100*4882a593Smuzhiyun es->s_last_orphan = 0;
3101*4882a593Smuzhiyun break;
3102*4882a593Smuzhiyun }
3103*4882a593Smuzhiyun
3104*4882a593Smuzhiyun list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan);
3105*4882a593Smuzhiyun dquot_initialize(inode);
3106*4882a593Smuzhiyun if (inode->i_nlink) {
3107*4882a593Smuzhiyun if (test_opt(sb, DEBUG))
3108*4882a593Smuzhiyun ext4_msg(sb, KERN_DEBUG,
3109*4882a593Smuzhiyun "%s: truncating inode %lu to %lld bytes",
3110*4882a593Smuzhiyun __func__, inode->i_ino, inode->i_size);
3111*4882a593Smuzhiyun jbd_debug(2, "truncating inode %lu to %lld bytes\n",
3112*4882a593Smuzhiyun inode->i_ino, inode->i_size);
3113*4882a593Smuzhiyun inode_lock(inode);
3114*4882a593Smuzhiyun truncate_inode_pages(inode->i_mapping, inode->i_size);
3115*4882a593Smuzhiyun ret = ext4_truncate(inode);
3116*4882a593Smuzhiyun if (ret) {
3117*4882a593Smuzhiyun /*
3118*4882a593Smuzhiyun * We need to clean up the in-core orphan list
3119*4882a593Smuzhiyun * manually if ext4_truncate() failed to get a
3120*4882a593Smuzhiyun * transaction handle.
3121*4882a593Smuzhiyun */
3122*4882a593Smuzhiyun ext4_orphan_del(NULL, inode);
3123*4882a593Smuzhiyun ext4_std_error(inode->i_sb, ret);
3124*4882a593Smuzhiyun }
3125*4882a593Smuzhiyun inode_unlock(inode);
3126*4882a593Smuzhiyun nr_truncates++;
3127*4882a593Smuzhiyun } else {
3128*4882a593Smuzhiyun if (test_opt(sb, DEBUG))
3129*4882a593Smuzhiyun ext4_msg(sb, KERN_DEBUG,
3130*4882a593Smuzhiyun "%s: deleting unreferenced inode %lu",
3131*4882a593Smuzhiyun __func__, inode->i_ino);
3132*4882a593Smuzhiyun jbd_debug(2, "deleting unreferenced inode %lu\n",
3133*4882a593Smuzhiyun inode->i_ino);
3134*4882a593Smuzhiyun nr_orphans++;
3135*4882a593Smuzhiyun }
3136*4882a593Smuzhiyun iput(inode); /* The delete magic happens here! */
3137*4882a593Smuzhiyun }
3138*4882a593Smuzhiyun
3139*4882a593Smuzhiyun #define PLURAL(x) (x), ((x) == 1) ? "" : "s"
3140*4882a593Smuzhiyun
3141*4882a593Smuzhiyun if (nr_orphans)
3142*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "%d orphan inode%s deleted",
3143*4882a593Smuzhiyun PLURAL(nr_orphans));
3144*4882a593Smuzhiyun if (nr_truncates)
3145*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up",
3146*4882a593Smuzhiyun PLURAL(nr_truncates));
3147*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
3148*4882a593Smuzhiyun /* Turn off quotas if they were enabled for orphan cleanup */
3149*4882a593Smuzhiyun if (quota_update) {
3150*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++) {
3151*4882a593Smuzhiyun if (sb_dqopt(sb)->files[i])
3152*4882a593Smuzhiyun dquot_quota_off(sb, i);
3153*4882a593Smuzhiyun }
3154*4882a593Smuzhiyun }
3155*4882a593Smuzhiyun #endif
3156*4882a593Smuzhiyun sb->s_flags = s_flags; /* Restore SB_RDONLY status */
3157*4882a593Smuzhiyun }
3158*4882a593Smuzhiyun
3159*4882a593Smuzhiyun /*
3160*4882a593Smuzhiyun * Maximal extent format file size.
3161*4882a593Smuzhiyun * Resulting logical blkno at s_maxbytes must fit in our on-disk
3162*4882a593Smuzhiyun * extent format containers, within a sector_t, and within i_blocks
3163*4882a593Smuzhiyun * in the vfs. ext4 inode has 48 bits of i_block in fsblock units,
3164*4882a593Smuzhiyun * so that won't be a limiting factor.
3165*4882a593Smuzhiyun *
3166*4882a593Smuzhiyun * However there is other limiting factor. We do store extents in the form
3167*4882a593Smuzhiyun * of starting block and length, hence the resulting length of the extent
3168*4882a593Smuzhiyun * covering maximum file size must fit into on-disk format containers as
3169*4882a593Smuzhiyun * well. Given that length is always by 1 unit bigger than max unit (because
3170*4882a593Smuzhiyun * we count 0 as well) we have to lower the s_maxbytes by one fs block.
3171*4882a593Smuzhiyun *
3172*4882a593Smuzhiyun * Note, this does *not* consider any metadata overhead for vfs i_blocks.
3173*4882a593Smuzhiyun */
ext4_max_size(int blkbits,int has_huge_files)3174*4882a593Smuzhiyun static loff_t ext4_max_size(int blkbits, int has_huge_files)
3175*4882a593Smuzhiyun {
3176*4882a593Smuzhiyun loff_t res;
3177*4882a593Smuzhiyun loff_t upper_limit = MAX_LFS_FILESIZE;
3178*4882a593Smuzhiyun
3179*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(blkcnt_t) < sizeof(u64));
3180*4882a593Smuzhiyun
3181*4882a593Smuzhiyun if (!has_huge_files) {
3182*4882a593Smuzhiyun upper_limit = (1LL << 32) - 1;
3183*4882a593Smuzhiyun
3184*4882a593Smuzhiyun /* total blocks in file system block size */
3185*4882a593Smuzhiyun upper_limit >>= (blkbits - 9);
3186*4882a593Smuzhiyun upper_limit <<= blkbits;
3187*4882a593Smuzhiyun }
3188*4882a593Smuzhiyun
3189*4882a593Smuzhiyun /*
3190*4882a593Smuzhiyun * 32-bit extent-start container, ee_block. We lower the maxbytes
3191*4882a593Smuzhiyun * by one fs block, so ee_len can cover the extent of maximum file
3192*4882a593Smuzhiyun * size
3193*4882a593Smuzhiyun */
3194*4882a593Smuzhiyun res = (1LL << 32) - 1;
3195*4882a593Smuzhiyun res <<= blkbits;
3196*4882a593Smuzhiyun
3197*4882a593Smuzhiyun /* Sanity check against vm- & vfs- imposed limits */
3198*4882a593Smuzhiyun if (res > upper_limit)
3199*4882a593Smuzhiyun res = upper_limit;
3200*4882a593Smuzhiyun
3201*4882a593Smuzhiyun return res;
3202*4882a593Smuzhiyun }
3203*4882a593Smuzhiyun
3204*4882a593Smuzhiyun /*
3205*4882a593Smuzhiyun * Maximal bitmap file size. There is a direct, and {,double-,triple-}indirect
3206*4882a593Smuzhiyun * block limit, and also a limit of (2^48 - 1) 512-byte sectors in i_blocks.
3207*4882a593Smuzhiyun * We need to be 1 filesystem block less than the 2^48 sector limit.
3208*4882a593Smuzhiyun */
ext4_max_bitmap_size(int bits,int has_huge_files)3209*4882a593Smuzhiyun static loff_t ext4_max_bitmap_size(int bits, int has_huge_files)
3210*4882a593Smuzhiyun {
3211*4882a593Smuzhiyun unsigned long long upper_limit, res = EXT4_NDIR_BLOCKS;
3212*4882a593Smuzhiyun int meta_blocks;
3213*4882a593Smuzhiyun
3214*4882a593Smuzhiyun /*
3215*4882a593Smuzhiyun * This is calculated to be the largest file size for a dense, block
3216*4882a593Smuzhiyun * mapped file such that the file's total number of 512-byte sectors,
3217*4882a593Smuzhiyun * including data and all indirect blocks, does not exceed (2^48 - 1).
3218*4882a593Smuzhiyun *
3219*4882a593Smuzhiyun * __u32 i_blocks_lo and _u16 i_blocks_high represent the total
3220*4882a593Smuzhiyun * number of 512-byte sectors of the file.
3221*4882a593Smuzhiyun */
3222*4882a593Smuzhiyun if (!has_huge_files) {
3223*4882a593Smuzhiyun /*
3224*4882a593Smuzhiyun * !has_huge_files or implies that the inode i_block field
3225*4882a593Smuzhiyun * represents total file blocks in 2^32 512-byte sectors ==
3226*4882a593Smuzhiyun * size of vfs inode i_blocks * 8
3227*4882a593Smuzhiyun */
3228*4882a593Smuzhiyun upper_limit = (1LL << 32) - 1;
3229*4882a593Smuzhiyun
3230*4882a593Smuzhiyun /* total blocks in file system block size */
3231*4882a593Smuzhiyun upper_limit >>= (bits - 9);
3232*4882a593Smuzhiyun
3233*4882a593Smuzhiyun } else {
3234*4882a593Smuzhiyun /*
3235*4882a593Smuzhiyun * We use 48 bit ext4_inode i_blocks
3236*4882a593Smuzhiyun * With EXT4_HUGE_FILE_FL set the i_blocks
3237*4882a593Smuzhiyun * represent total number of blocks in
3238*4882a593Smuzhiyun * file system block size
3239*4882a593Smuzhiyun */
3240*4882a593Smuzhiyun upper_limit = (1LL << 48) - 1;
3241*4882a593Smuzhiyun
3242*4882a593Smuzhiyun }
3243*4882a593Smuzhiyun
3244*4882a593Smuzhiyun /* indirect blocks */
3245*4882a593Smuzhiyun meta_blocks = 1;
3246*4882a593Smuzhiyun /* double indirect blocks */
3247*4882a593Smuzhiyun meta_blocks += 1 + (1LL << (bits-2));
3248*4882a593Smuzhiyun /* tripple indirect blocks */
3249*4882a593Smuzhiyun meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2)));
3250*4882a593Smuzhiyun
3251*4882a593Smuzhiyun upper_limit -= meta_blocks;
3252*4882a593Smuzhiyun upper_limit <<= bits;
3253*4882a593Smuzhiyun
3254*4882a593Smuzhiyun res += 1LL << (bits-2);
3255*4882a593Smuzhiyun res += 1LL << (2*(bits-2));
3256*4882a593Smuzhiyun res += 1LL << (3*(bits-2));
3257*4882a593Smuzhiyun res <<= bits;
3258*4882a593Smuzhiyun if (res > upper_limit)
3259*4882a593Smuzhiyun res = upper_limit;
3260*4882a593Smuzhiyun
3261*4882a593Smuzhiyun if (res > MAX_LFS_FILESIZE)
3262*4882a593Smuzhiyun res = MAX_LFS_FILESIZE;
3263*4882a593Smuzhiyun
3264*4882a593Smuzhiyun return (loff_t)res;
3265*4882a593Smuzhiyun }
3266*4882a593Smuzhiyun
descriptor_loc(struct super_block * sb,ext4_fsblk_t logical_sb_block,int nr)3267*4882a593Smuzhiyun static ext4_fsblk_t descriptor_loc(struct super_block *sb,
3268*4882a593Smuzhiyun ext4_fsblk_t logical_sb_block, int nr)
3269*4882a593Smuzhiyun {
3270*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
3271*4882a593Smuzhiyun ext4_group_t bg, first_meta_bg;
3272*4882a593Smuzhiyun int has_super = 0;
3273*4882a593Smuzhiyun
3274*4882a593Smuzhiyun first_meta_bg = le32_to_cpu(sbi->s_es->s_first_meta_bg);
3275*4882a593Smuzhiyun
3276*4882a593Smuzhiyun if (!ext4_has_feature_meta_bg(sb) || nr < first_meta_bg)
3277*4882a593Smuzhiyun return logical_sb_block + nr + 1;
3278*4882a593Smuzhiyun bg = sbi->s_desc_per_block * nr;
3279*4882a593Smuzhiyun if (ext4_bg_has_super(sb, bg))
3280*4882a593Smuzhiyun has_super = 1;
3281*4882a593Smuzhiyun
3282*4882a593Smuzhiyun /*
3283*4882a593Smuzhiyun * If we have a meta_bg fs with 1k blocks, group 0's GDT is at
3284*4882a593Smuzhiyun * block 2, not 1. If s_first_data_block == 0 (bigalloc is enabled
3285*4882a593Smuzhiyun * on modern mke2fs or blksize > 1k on older mke2fs) then we must
3286*4882a593Smuzhiyun * compensate.
3287*4882a593Smuzhiyun */
3288*4882a593Smuzhiyun if (sb->s_blocksize == 1024 && nr == 0 &&
3289*4882a593Smuzhiyun le32_to_cpu(sbi->s_es->s_first_data_block) == 0)
3290*4882a593Smuzhiyun has_super++;
3291*4882a593Smuzhiyun
3292*4882a593Smuzhiyun return (has_super + ext4_group_first_block_no(sb, bg));
3293*4882a593Smuzhiyun }
3294*4882a593Smuzhiyun
3295*4882a593Smuzhiyun /**
3296*4882a593Smuzhiyun * ext4_get_stripe_size: Get the stripe size.
3297*4882a593Smuzhiyun * @sbi: In memory super block info
3298*4882a593Smuzhiyun *
3299*4882a593Smuzhiyun * If we have specified it via mount option, then
3300*4882a593Smuzhiyun * use the mount option value. If the value specified at mount time is
3301*4882a593Smuzhiyun * greater than the blocks per group use the super block value.
3302*4882a593Smuzhiyun * If the super block value is greater than blocks per group return 0.
3303*4882a593Smuzhiyun * Allocator needs it be less than blocks per group.
3304*4882a593Smuzhiyun *
3305*4882a593Smuzhiyun */
ext4_get_stripe_size(struct ext4_sb_info * sbi)3306*4882a593Smuzhiyun static unsigned long ext4_get_stripe_size(struct ext4_sb_info *sbi)
3307*4882a593Smuzhiyun {
3308*4882a593Smuzhiyun unsigned long stride = le16_to_cpu(sbi->s_es->s_raid_stride);
3309*4882a593Smuzhiyun unsigned long stripe_width =
3310*4882a593Smuzhiyun le32_to_cpu(sbi->s_es->s_raid_stripe_width);
3311*4882a593Smuzhiyun int ret;
3312*4882a593Smuzhiyun
3313*4882a593Smuzhiyun if (sbi->s_stripe && sbi->s_stripe <= sbi->s_blocks_per_group)
3314*4882a593Smuzhiyun ret = sbi->s_stripe;
3315*4882a593Smuzhiyun else if (stripe_width && stripe_width <= sbi->s_blocks_per_group)
3316*4882a593Smuzhiyun ret = stripe_width;
3317*4882a593Smuzhiyun else if (stride && stride <= sbi->s_blocks_per_group)
3318*4882a593Smuzhiyun ret = stride;
3319*4882a593Smuzhiyun else
3320*4882a593Smuzhiyun ret = 0;
3321*4882a593Smuzhiyun
3322*4882a593Smuzhiyun /*
3323*4882a593Smuzhiyun * If the stripe width is 1, this makes no sense and
3324*4882a593Smuzhiyun * we set it to 0 to turn off stripe handling code.
3325*4882a593Smuzhiyun */
3326*4882a593Smuzhiyun if (ret <= 1)
3327*4882a593Smuzhiyun ret = 0;
3328*4882a593Smuzhiyun
3329*4882a593Smuzhiyun return ret;
3330*4882a593Smuzhiyun }
3331*4882a593Smuzhiyun
3332*4882a593Smuzhiyun /*
3333*4882a593Smuzhiyun * Check whether this filesystem can be mounted based on
3334*4882a593Smuzhiyun * the features present and the RDONLY/RDWR mount requested.
3335*4882a593Smuzhiyun * Returns 1 if this filesystem can be mounted as requested,
3336*4882a593Smuzhiyun * 0 if it cannot be.
3337*4882a593Smuzhiyun */
ext4_feature_set_ok(struct super_block * sb,int readonly)3338*4882a593Smuzhiyun static int ext4_feature_set_ok(struct super_block *sb, int readonly)
3339*4882a593Smuzhiyun {
3340*4882a593Smuzhiyun if (ext4_has_unknown_ext4_incompat_features(sb)) {
3341*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
3342*4882a593Smuzhiyun "Couldn't mount because of "
3343*4882a593Smuzhiyun "unsupported optional features (%x)",
3344*4882a593Smuzhiyun (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) &
3345*4882a593Smuzhiyun ~EXT4_FEATURE_INCOMPAT_SUPP));
3346*4882a593Smuzhiyun return 0;
3347*4882a593Smuzhiyun }
3348*4882a593Smuzhiyun
3349*4882a593Smuzhiyun #ifndef CONFIG_UNICODE
3350*4882a593Smuzhiyun if (ext4_has_feature_casefold(sb)) {
3351*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
3352*4882a593Smuzhiyun "Filesystem with casefold feature cannot be "
3353*4882a593Smuzhiyun "mounted without CONFIG_UNICODE");
3354*4882a593Smuzhiyun return 0;
3355*4882a593Smuzhiyun }
3356*4882a593Smuzhiyun #endif
3357*4882a593Smuzhiyun
3358*4882a593Smuzhiyun if (readonly)
3359*4882a593Smuzhiyun return 1;
3360*4882a593Smuzhiyun
3361*4882a593Smuzhiyun if (ext4_has_feature_readonly(sb)) {
3362*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "filesystem is read-only");
3363*4882a593Smuzhiyun sb->s_flags |= SB_RDONLY;
3364*4882a593Smuzhiyun return 1;
3365*4882a593Smuzhiyun }
3366*4882a593Smuzhiyun
3367*4882a593Smuzhiyun /* Check that feature set is OK for a read-write mount */
3368*4882a593Smuzhiyun if (ext4_has_unknown_ext4_ro_compat_features(sb)) {
3369*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "couldn't mount RDWR because of "
3370*4882a593Smuzhiyun "unsupported optional features (%x)",
3371*4882a593Smuzhiyun (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) &
3372*4882a593Smuzhiyun ~EXT4_FEATURE_RO_COMPAT_SUPP));
3373*4882a593Smuzhiyun return 0;
3374*4882a593Smuzhiyun }
3375*4882a593Smuzhiyun if (ext4_has_feature_bigalloc(sb) && !ext4_has_feature_extents(sb)) {
3376*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
3377*4882a593Smuzhiyun "Can't support bigalloc feature without "
3378*4882a593Smuzhiyun "extents feature\n");
3379*4882a593Smuzhiyun return 0;
3380*4882a593Smuzhiyun }
3381*4882a593Smuzhiyun
3382*4882a593Smuzhiyun #if !IS_ENABLED(CONFIG_QUOTA) || !IS_ENABLED(CONFIG_QFMT_V2)
3383*4882a593Smuzhiyun if (!readonly && (ext4_has_feature_quota(sb) ||
3384*4882a593Smuzhiyun ext4_has_feature_project(sb))) {
3385*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
3386*4882a593Smuzhiyun "The kernel was not built with CONFIG_QUOTA and CONFIG_QFMT_V2");
3387*4882a593Smuzhiyun return 0;
3388*4882a593Smuzhiyun }
3389*4882a593Smuzhiyun #endif /* CONFIG_QUOTA */
3390*4882a593Smuzhiyun return 1;
3391*4882a593Smuzhiyun }
3392*4882a593Smuzhiyun
3393*4882a593Smuzhiyun /*
3394*4882a593Smuzhiyun * This function is called once a day if we have errors logged
3395*4882a593Smuzhiyun * on the file system
3396*4882a593Smuzhiyun */
print_daily_error_info(struct timer_list * t)3397*4882a593Smuzhiyun static void print_daily_error_info(struct timer_list *t)
3398*4882a593Smuzhiyun {
3399*4882a593Smuzhiyun struct ext4_sb_info *sbi = from_timer(sbi, t, s_err_report);
3400*4882a593Smuzhiyun struct super_block *sb = sbi->s_sb;
3401*4882a593Smuzhiyun struct ext4_super_block *es = sbi->s_es;
3402*4882a593Smuzhiyun
3403*4882a593Smuzhiyun if (es->s_error_count)
3404*4882a593Smuzhiyun /* fsck newer than v1.41.13 is needed to clean this condition. */
3405*4882a593Smuzhiyun ext4_msg(sb, KERN_NOTICE, "error count since last fsck: %u",
3406*4882a593Smuzhiyun le32_to_cpu(es->s_error_count));
3407*4882a593Smuzhiyun if (es->s_first_error_time) {
3408*4882a593Smuzhiyun printk(KERN_NOTICE "EXT4-fs (%s): initial error at time %llu: %.*s:%d",
3409*4882a593Smuzhiyun sb->s_id,
3410*4882a593Smuzhiyun ext4_get_tstamp(es, s_first_error_time),
3411*4882a593Smuzhiyun (int) sizeof(es->s_first_error_func),
3412*4882a593Smuzhiyun es->s_first_error_func,
3413*4882a593Smuzhiyun le32_to_cpu(es->s_first_error_line));
3414*4882a593Smuzhiyun if (es->s_first_error_ino)
3415*4882a593Smuzhiyun printk(KERN_CONT ": inode %u",
3416*4882a593Smuzhiyun le32_to_cpu(es->s_first_error_ino));
3417*4882a593Smuzhiyun if (es->s_first_error_block)
3418*4882a593Smuzhiyun printk(KERN_CONT ": block %llu", (unsigned long long)
3419*4882a593Smuzhiyun le64_to_cpu(es->s_first_error_block));
3420*4882a593Smuzhiyun printk(KERN_CONT "\n");
3421*4882a593Smuzhiyun }
3422*4882a593Smuzhiyun if (es->s_last_error_time) {
3423*4882a593Smuzhiyun printk(KERN_NOTICE "EXT4-fs (%s): last error at time %llu: %.*s:%d",
3424*4882a593Smuzhiyun sb->s_id,
3425*4882a593Smuzhiyun ext4_get_tstamp(es, s_last_error_time),
3426*4882a593Smuzhiyun (int) sizeof(es->s_last_error_func),
3427*4882a593Smuzhiyun es->s_last_error_func,
3428*4882a593Smuzhiyun le32_to_cpu(es->s_last_error_line));
3429*4882a593Smuzhiyun if (es->s_last_error_ino)
3430*4882a593Smuzhiyun printk(KERN_CONT ": inode %u",
3431*4882a593Smuzhiyun le32_to_cpu(es->s_last_error_ino));
3432*4882a593Smuzhiyun if (es->s_last_error_block)
3433*4882a593Smuzhiyun printk(KERN_CONT ": block %llu", (unsigned long long)
3434*4882a593Smuzhiyun le64_to_cpu(es->s_last_error_block));
3435*4882a593Smuzhiyun printk(KERN_CONT "\n");
3436*4882a593Smuzhiyun }
3437*4882a593Smuzhiyun mod_timer(&sbi->s_err_report, jiffies + 24*60*60*HZ); /* Once a day */
3438*4882a593Smuzhiyun }
3439*4882a593Smuzhiyun
3440*4882a593Smuzhiyun /* Find next suitable group and run ext4_init_inode_table */
ext4_run_li_request(struct ext4_li_request * elr)3441*4882a593Smuzhiyun static int ext4_run_li_request(struct ext4_li_request *elr)
3442*4882a593Smuzhiyun {
3443*4882a593Smuzhiyun struct ext4_group_desc *gdp = NULL;
3444*4882a593Smuzhiyun struct super_block *sb = elr->lr_super;
3445*4882a593Smuzhiyun ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
3446*4882a593Smuzhiyun ext4_group_t group = elr->lr_next_group;
3447*4882a593Smuzhiyun unsigned int prefetch_ios = 0;
3448*4882a593Smuzhiyun int ret = 0;
3449*4882a593Smuzhiyun u64 start_time;
3450*4882a593Smuzhiyun
3451*4882a593Smuzhiyun if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) {
3452*4882a593Smuzhiyun elr->lr_next_group = ext4_mb_prefetch(sb, group,
3453*4882a593Smuzhiyun EXT4_SB(sb)->s_mb_prefetch, &prefetch_ios);
3454*4882a593Smuzhiyun if (prefetch_ios)
3455*4882a593Smuzhiyun ext4_mb_prefetch_fini(sb, elr->lr_next_group,
3456*4882a593Smuzhiyun prefetch_ios);
3457*4882a593Smuzhiyun trace_ext4_prefetch_bitmaps(sb, group, elr->lr_next_group,
3458*4882a593Smuzhiyun prefetch_ios);
3459*4882a593Smuzhiyun if (group >= elr->lr_next_group) {
3460*4882a593Smuzhiyun ret = 1;
3461*4882a593Smuzhiyun if (elr->lr_first_not_zeroed != ngroups &&
3462*4882a593Smuzhiyun !sb_rdonly(sb) && test_opt(sb, INIT_INODE_TABLE)) {
3463*4882a593Smuzhiyun elr->lr_next_group = elr->lr_first_not_zeroed;
3464*4882a593Smuzhiyun elr->lr_mode = EXT4_LI_MODE_ITABLE;
3465*4882a593Smuzhiyun ret = 0;
3466*4882a593Smuzhiyun }
3467*4882a593Smuzhiyun }
3468*4882a593Smuzhiyun return ret;
3469*4882a593Smuzhiyun }
3470*4882a593Smuzhiyun
3471*4882a593Smuzhiyun for (; group < ngroups; group++) {
3472*4882a593Smuzhiyun gdp = ext4_get_group_desc(sb, group, NULL);
3473*4882a593Smuzhiyun if (!gdp) {
3474*4882a593Smuzhiyun ret = 1;
3475*4882a593Smuzhiyun break;
3476*4882a593Smuzhiyun }
3477*4882a593Smuzhiyun
3478*4882a593Smuzhiyun if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED)))
3479*4882a593Smuzhiyun break;
3480*4882a593Smuzhiyun }
3481*4882a593Smuzhiyun
3482*4882a593Smuzhiyun if (group >= ngroups)
3483*4882a593Smuzhiyun ret = 1;
3484*4882a593Smuzhiyun
3485*4882a593Smuzhiyun if (!ret) {
3486*4882a593Smuzhiyun start_time = ktime_get_real_ns();
3487*4882a593Smuzhiyun ret = ext4_init_inode_table(sb, group,
3488*4882a593Smuzhiyun elr->lr_timeout ? 0 : 1);
3489*4882a593Smuzhiyun trace_ext4_lazy_itable_init(sb, group);
3490*4882a593Smuzhiyun if (elr->lr_timeout == 0) {
3491*4882a593Smuzhiyun elr->lr_timeout = nsecs_to_jiffies((ktime_get_real_ns() - start_time) *
3492*4882a593Smuzhiyun EXT4_SB(elr->lr_super)->s_li_wait_mult);
3493*4882a593Smuzhiyun }
3494*4882a593Smuzhiyun elr->lr_next_sched = jiffies + elr->lr_timeout;
3495*4882a593Smuzhiyun elr->lr_next_group = group + 1;
3496*4882a593Smuzhiyun }
3497*4882a593Smuzhiyun return ret;
3498*4882a593Smuzhiyun }
3499*4882a593Smuzhiyun
3500*4882a593Smuzhiyun /*
3501*4882a593Smuzhiyun * Remove lr_request from the list_request and free the
3502*4882a593Smuzhiyun * request structure. Should be called with li_list_mtx held
3503*4882a593Smuzhiyun */
ext4_remove_li_request(struct ext4_li_request * elr)3504*4882a593Smuzhiyun static void ext4_remove_li_request(struct ext4_li_request *elr)
3505*4882a593Smuzhiyun {
3506*4882a593Smuzhiyun if (!elr)
3507*4882a593Smuzhiyun return;
3508*4882a593Smuzhiyun
3509*4882a593Smuzhiyun list_del(&elr->lr_request);
3510*4882a593Smuzhiyun EXT4_SB(elr->lr_super)->s_li_request = NULL;
3511*4882a593Smuzhiyun kfree(elr);
3512*4882a593Smuzhiyun }
3513*4882a593Smuzhiyun
ext4_unregister_li_request(struct super_block * sb)3514*4882a593Smuzhiyun static void ext4_unregister_li_request(struct super_block *sb)
3515*4882a593Smuzhiyun {
3516*4882a593Smuzhiyun mutex_lock(&ext4_li_mtx);
3517*4882a593Smuzhiyun if (!ext4_li_info) {
3518*4882a593Smuzhiyun mutex_unlock(&ext4_li_mtx);
3519*4882a593Smuzhiyun return;
3520*4882a593Smuzhiyun }
3521*4882a593Smuzhiyun
3522*4882a593Smuzhiyun mutex_lock(&ext4_li_info->li_list_mtx);
3523*4882a593Smuzhiyun ext4_remove_li_request(EXT4_SB(sb)->s_li_request);
3524*4882a593Smuzhiyun mutex_unlock(&ext4_li_info->li_list_mtx);
3525*4882a593Smuzhiyun mutex_unlock(&ext4_li_mtx);
3526*4882a593Smuzhiyun }
3527*4882a593Smuzhiyun
3528*4882a593Smuzhiyun static struct task_struct *ext4_lazyinit_task;
3529*4882a593Smuzhiyun
3530*4882a593Smuzhiyun /*
3531*4882a593Smuzhiyun * This is the function where ext4lazyinit thread lives. It walks
3532*4882a593Smuzhiyun * through the request list searching for next scheduled filesystem.
3533*4882a593Smuzhiyun * When such a fs is found, run the lazy initialization request
3534*4882a593Smuzhiyun * (ext4_rn_li_request) and keep track of the time spend in this
3535*4882a593Smuzhiyun * function. Based on that time we compute next schedule time of
3536*4882a593Smuzhiyun * the request. When walking through the list is complete, compute
3537*4882a593Smuzhiyun * next waking time and put itself into sleep.
3538*4882a593Smuzhiyun */
ext4_lazyinit_thread(void * arg)3539*4882a593Smuzhiyun static int ext4_lazyinit_thread(void *arg)
3540*4882a593Smuzhiyun {
3541*4882a593Smuzhiyun struct ext4_lazy_init *eli = (struct ext4_lazy_init *)arg;
3542*4882a593Smuzhiyun struct list_head *pos, *n;
3543*4882a593Smuzhiyun struct ext4_li_request *elr;
3544*4882a593Smuzhiyun unsigned long next_wakeup, cur;
3545*4882a593Smuzhiyun
3546*4882a593Smuzhiyun BUG_ON(NULL == eli);
3547*4882a593Smuzhiyun set_freezable();
3548*4882a593Smuzhiyun
3549*4882a593Smuzhiyun cont_thread:
3550*4882a593Smuzhiyun while (true) {
3551*4882a593Smuzhiyun next_wakeup = MAX_JIFFY_OFFSET;
3552*4882a593Smuzhiyun
3553*4882a593Smuzhiyun mutex_lock(&eli->li_list_mtx);
3554*4882a593Smuzhiyun if (list_empty(&eli->li_request_list)) {
3555*4882a593Smuzhiyun mutex_unlock(&eli->li_list_mtx);
3556*4882a593Smuzhiyun goto exit_thread;
3557*4882a593Smuzhiyun }
3558*4882a593Smuzhiyun list_for_each_safe(pos, n, &eli->li_request_list) {
3559*4882a593Smuzhiyun int err = 0;
3560*4882a593Smuzhiyun int progress = 0;
3561*4882a593Smuzhiyun elr = list_entry(pos, struct ext4_li_request,
3562*4882a593Smuzhiyun lr_request);
3563*4882a593Smuzhiyun
3564*4882a593Smuzhiyun if (time_before(jiffies, elr->lr_next_sched)) {
3565*4882a593Smuzhiyun if (time_before(elr->lr_next_sched, next_wakeup))
3566*4882a593Smuzhiyun next_wakeup = elr->lr_next_sched;
3567*4882a593Smuzhiyun continue;
3568*4882a593Smuzhiyun }
3569*4882a593Smuzhiyun if (down_read_trylock(&elr->lr_super->s_umount)) {
3570*4882a593Smuzhiyun if (sb_start_write_trylock(elr->lr_super)) {
3571*4882a593Smuzhiyun progress = 1;
3572*4882a593Smuzhiyun /*
3573*4882a593Smuzhiyun * We hold sb->s_umount, sb can not
3574*4882a593Smuzhiyun * be removed from the list, it is
3575*4882a593Smuzhiyun * now safe to drop li_list_mtx
3576*4882a593Smuzhiyun */
3577*4882a593Smuzhiyun mutex_unlock(&eli->li_list_mtx);
3578*4882a593Smuzhiyun err = ext4_run_li_request(elr);
3579*4882a593Smuzhiyun sb_end_write(elr->lr_super);
3580*4882a593Smuzhiyun mutex_lock(&eli->li_list_mtx);
3581*4882a593Smuzhiyun n = pos->next;
3582*4882a593Smuzhiyun }
3583*4882a593Smuzhiyun up_read((&elr->lr_super->s_umount));
3584*4882a593Smuzhiyun }
3585*4882a593Smuzhiyun /* error, remove the lazy_init job */
3586*4882a593Smuzhiyun if (err) {
3587*4882a593Smuzhiyun ext4_remove_li_request(elr);
3588*4882a593Smuzhiyun continue;
3589*4882a593Smuzhiyun }
3590*4882a593Smuzhiyun if (!progress) {
3591*4882a593Smuzhiyun elr->lr_next_sched = jiffies +
3592*4882a593Smuzhiyun (prandom_u32()
3593*4882a593Smuzhiyun % (EXT4_DEF_LI_MAX_START_DELAY * HZ));
3594*4882a593Smuzhiyun }
3595*4882a593Smuzhiyun if (time_before(elr->lr_next_sched, next_wakeup))
3596*4882a593Smuzhiyun next_wakeup = elr->lr_next_sched;
3597*4882a593Smuzhiyun }
3598*4882a593Smuzhiyun mutex_unlock(&eli->li_list_mtx);
3599*4882a593Smuzhiyun
3600*4882a593Smuzhiyun try_to_freeze();
3601*4882a593Smuzhiyun
3602*4882a593Smuzhiyun cur = jiffies;
3603*4882a593Smuzhiyun if ((time_after_eq(cur, next_wakeup)) ||
3604*4882a593Smuzhiyun (MAX_JIFFY_OFFSET == next_wakeup)) {
3605*4882a593Smuzhiyun cond_resched();
3606*4882a593Smuzhiyun continue;
3607*4882a593Smuzhiyun }
3608*4882a593Smuzhiyun
3609*4882a593Smuzhiyun schedule_timeout_interruptible(next_wakeup - cur);
3610*4882a593Smuzhiyun
3611*4882a593Smuzhiyun if (kthread_should_stop()) {
3612*4882a593Smuzhiyun ext4_clear_request_list();
3613*4882a593Smuzhiyun goto exit_thread;
3614*4882a593Smuzhiyun }
3615*4882a593Smuzhiyun }
3616*4882a593Smuzhiyun
3617*4882a593Smuzhiyun exit_thread:
3618*4882a593Smuzhiyun /*
3619*4882a593Smuzhiyun * It looks like the request list is empty, but we need
3620*4882a593Smuzhiyun * to check it under the li_list_mtx lock, to prevent any
3621*4882a593Smuzhiyun * additions into it, and of course we should lock ext4_li_mtx
3622*4882a593Smuzhiyun * to atomically free the list and ext4_li_info, because at
3623*4882a593Smuzhiyun * this point another ext4 filesystem could be registering
3624*4882a593Smuzhiyun * new one.
3625*4882a593Smuzhiyun */
3626*4882a593Smuzhiyun mutex_lock(&ext4_li_mtx);
3627*4882a593Smuzhiyun mutex_lock(&eli->li_list_mtx);
3628*4882a593Smuzhiyun if (!list_empty(&eli->li_request_list)) {
3629*4882a593Smuzhiyun mutex_unlock(&eli->li_list_mtx);
3630*4882a593Smuzhiyun mutex_unlock(&ext4_li_mtx);
3631*4882a593Smuzhiyun goto cont_thread;
3632*4882a593Smuzhiyun }
3633*4882a593Smuzhiyun mutex_unlock(&eli->li_list_mtx);
3634*4882a593Smuzhiyun kfree(ext4_li_info);
3635*4882a593Smuzhiyun ext4_li_info = NULL;
3636*4882a593Smuzhiyun mutex_unlock(&ext4_li_mtx);
3637*4882a593Smuzhiyun
3638*4882a593Smuzhiyun return 0;
3639*4882a593Smuzhiyun }
3640*4882a593Smuzhiyun
ext4_clear_request_list(void)3641*4882a593Smuzhiyun static void ext4_clear_request_list(void)
3642*4882a593Smuzhiyun {
3643*4882a593Smuzhiyun struct list_head *pos, *n;
3644*4882a593Smuzhiyun struct ext4_li_request *elr;
3645*4882a593Smuzhiyun
3646*4882a593Smuzhiyun mutex_lock(&ext4_li_info->li_list_mtx);
3647*4882a593Smuzhiyun list_for_each_safe(pos, n, &ext4_li_info->li_request_list) {
3648*4882a593Smuzhiyun elr = list_entry(pos, struct ext4_li_request,
3649*4882a593Smuzhiyun lr_request);
3650*4882a593Smuzhiyun ext4_remove_li_request(elr);
3651*4882a593Smuzhiyun }
3652*4882a593Smuzhiyun mutex_unlock(&ext4_li_info->li_list_mtx);
3653*4882a593Smuzhiyun }
3654*4882a593Smuzhiyun
ext4_run_lazyinit_thread(void)3655*4882a593Smuzhiyun static int ext4_run_lazyinit_thread(void)
3656*4882a593Smuzhiyun {
3657*4882a593Smuzhiyun ext4_lazyinit_task = kthread_run(ext4_lazyinit_thread,
3658*4882a593Smuzhiyun ext4_li_info, "ext4lazyinit");
3659*4882a593Smuzhiyun if (IS_ERR(ext4_lazyinit_task)) {
3660*4882a593Smuzhiyun int err = PTR_ERR(ext4_lazyinit_task);
3661*4882a593Smuzhiyun ext4_clear_request_list();
3662*4882a593Smuzhiyun kfree(ext4_li_info);
3663*4882a593Smuzhiyun ext4_li_info = NULL;
3664*4882a593Smuzhiyun printk(KERN_CRIT "EXT4-fs: error %d creating inode table "
3665*4882a593Smuzhiyun "initialization thread\n",
3666*4882a593Smuzhiyun err);
3667*4882a593Smuzhiyun return err;
3668*4882a593Smuzhiyun }
3669*4882a593Smuzhiyun ext4_li_info->li_state |= EXT4_LAZYINIT_RUNNING;
3670*4882a593Smuzhiyun return 0;
3671*4882a593Smuzhiyun }
3672*4882a593Smuzhiyun
3673*4882a593Smuzhiyun /*
3674*4882a593Smuzhiyun * Check whether it make sense to run itable init. thread or not.
3675*4882a593Smuzhiyun * If there is at least one uninitialized inode table, return
3676*4882a593Smuzhiyun * corresponding group number, else the loop goes through all
3677*4882a593Smuzhiyun * groups and return total number of groups.
3678*4882a593Smuzhiyun */
ext4_has_uninit_itable(struct super_block * sb)3679*4882a593Smuzhiyun static ext4_group_t ext4_has_uninit_itable(struct super_block *sb)
3680*4882a593Smuzhiyun {
3681*4882a593Smuzhiyun ext4_group_t group, ngroups = EXT4_SB(sb)->s_groups_count;
3682*4882a593Smuzhiyun struct ext4_group_desc *gdp = NULL;
3683*4882a593Smuzhiyun
3684*4882a593Smuzhiyun if (!ext4_has_group_desc_csum(sb))
3685*4882a593Smuzhiyun return ngroups;
3686*4882a593Smuzhiyun
3687*4882a593Smuzhiyun for (group = 0; group < ngroups; group++) {
3688*4882a593Smuzhiyun gdp = ext4_get_group_desc(sb, group, NULL);
3689*4882a593Smuzhiyun if (!gdp)
3690*4882a593Smuzhiyun continue;
3691*4882a593Smuzhiyun
3692*4882a593Smuzhiyun if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED)))
3693*4882a593Smuzhiyun break;
3694*4882a593Smuzhiyun }
3695*4882a593Smuzhiyun
3696*4882a593Smuzhiyun return group;
3697*4882a593Smuzhiyun }
3698*4882a593Smuzhiyun
ext4_li_info_new(void)3699*4882a593Smuzhiyun static int ext4_li_info_new(void)
3700*4882a593Smuzhiyun {
3701*4882a593Smuzhiyun struct ext4_lazy_init *eli = NULL;
3702*4882a593Smuzhiyun
3703*4882a593Smuzhiyun eli = kzalloc(sizeof(*eli), GFP_KERNEL);
3704*4882a593Smuzhiyun if (!eli)
3705*4882a593Smuzhiyun return -ENOMEM;
3706*4882a593Smuzhiyun
3707*4882a593Smuzhiyun INIT_LIST_HEAD(&eli->li_request_list);
3708*4882a593Smuzhiyun mutex_init(&eli->li_list_mtx);
3709*4882a593Smuzhiyun
3710*4882a593Smuzhiyun eli->li_state |= EXT4_LAZYINIT_QUIT;
3711*4882a593Smuzhiyun
3712*4882a593Smuzhiyun ext4_li_info = eli;
3713*4882a593Smuzhiyun
3714*4882a593Smuzhiyun return 0;
3715*4882a593Smuzhiyun }
3716*4882a593Smuzhiyun
ext4_li_request_new(struct super_block * sb,ext4_group_t start)3717*4882a593Smuzhiyun static struct ext4_li_request *ext4_li_request_new(struct super_block *sb,
3718*4882a593Smuzhiyun ext4_group_t start)
3719*4882a593Smuzhiyun {
3720*4882a593Smuzhiyun struct ext4_li_request *elr;
3721*4882a593Smuzhiyun
3722*4882a593Smuzhiyun elr = kzalloc(sizeof(*elr), GFP_KERNEL);
3723*4882a593Smuzhiyun if (!elr)
3724*4882a593Smuzhiyun return NULL;
3725*4882a593Smuzhiyun
3726*4882a593Smuzhiyun elr->lr_super = sb;
3727*4882a593Smuzhiyun elr->lr_first_not_zeroed = start;
3728*4882a593Smuzhiyun if (test_opt(sb, PREFETCH_BLOCK_BITMAPS))
3729*4882a593Smuzhiyun elr->lr_mode = EXT4_LI_MODE_PREFETCH_BBITMAP;
3730*4882a593Smuzhiyun else {
3731*4882a593Smuzhiyun elr->lr_mode = EXT4_LI_MODE_ITABLE;
3732*4882a593Smuzhiyun elr->lr_next_group = start;
3733*4882a593Smuzhiyun }
3734*4882a593Smuzhiyun
3735*4882a593Smuzhiyun /*
3736*4882a593Smuzhiyun * Randomize first schedule time of the request to
3737*4882a593Smuzhiyun * spread the inode table initialization requests
3738*4882a593Smuzhiyun * better.
3739*4882a593Smuzhiyun */
3740*4882a593Smuzhiyun elr->lr_next_sched = jiffies + (prandom_u32() %
3741*4882a593Smuzhiyun (EXT4_DEF_LI_MAX_START_DELAY * HZ));
3742*4882a593Smuzhiyun return elr;
3743*4882a593Smuzhiyun }
3744*4882a593Smuzhiyun
ext4_register_li_request(struct super_block * sb,ext4_group_t first_not_zeroed)3745*4882a593Smuzhiyun int ext4_register_li_request(struct super_block *sb,
3746*4882a593Smuzhiyun ext4_group_t first_not_zeroed)
3747*4882a593Smuzhiyun {
3748*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
3749*4882a593Smuzhiyun struct ext4_li_request *elr = NULL;
3750*4882a593Smuzhiyun ext4_group_t ngroups = sbi->s_groups_count;
3751*4882a593Smuzhiyun int ret = 0;
3752*4882a593Smuzhiyun
3753*4882a593Smuzhiyun mutex_lock(&ext4_li_mtx);
3754*4882a593Smuzhiyun if (sbi->s_li_request != NULL) {
3755*4882a593Smuzhiyun /*
3756*4882a593Smuzhiyun * Reset timeout so it can be computed again, because
3757*4882a593Smuzhiyun * s_li_wait_mult might have changed.
3758*4882a593Smuzhiyun */
3759*4882a593Smuzhiyun sbi->s_li_request->lr_timeout = 0;
3760*4882a593Smuzhiyun goto out;
3761*4882a593Smuzhiyun }
3762*4882a593Smuzhiyun
3763*4882a593Smuzhiyun if (!test_opt(sb, PREFETCH_BLOCK_BITMAPS) &&
3764*4882a593Smuzhiyun (first_not_zeroed == ngroups || sb_rdonly(sb) ||
3765*4882a593Smuzhiyun !test_opt(sb, INIT_INODE_TABLE)))
3766*4882a593Smuzhiyun goto out;
3767*4882a593Smuzhiyun
3768*4882a593Smuzhiyun elr = ext4_li_request_new(sb, first_not_zeroed);
3769*4882a593Smuzhiyun if (!elr) {
3770*4882a593Smuzhiyun ret = -ENOMEM;
3771*4882a593Smuzhiyun goto out;
3772*4882a593Smuzhiyun }
3773*4882a593Smuzhiyun
3774*4882a593Smuzhiyun if (NULL == ext4_li_info) {
3775*4882a593Smuzhiyun ret = ext4_li_info_new();
3776*4882a593Smuzhiyun if (ret)
3777*4882a593Smuzhiyun goto out;
3778*4882a593Smuzhiyun }
3779*4882a593Smuzhiyun
3780*4882a593Smuzhiyun mutex_lock(&ext4_li_info->li_list_mtx);
3781*4882a593Smuzhiyun list_add(&elr->lr_request, &ext4_li_info->li_request_list);
3782*4882a593Smuzhiyun mutex_unlock(&ext4_li_info->li_list_mtx);
3783*4882a593Smuzhiyun
3784*4882a593Smuzhiyun sbi->s_li_request = elr;
3785*4882a593Smuzhiyun /*
3786*4882a593Smuzhiyun * set elr to NULL here since it has been inserted to
3787*4882a593Smuzhiyun * the request_list and the removal and free of it is
3788*4882a593Smuzhiyun * handled by ext4_clear_request_list from now on.
3789*4882a593Smuzhiyun */
3790*4882a593Smuzhiyun elr = NULL;
3791*4882a593Smuzhiyun
3792*4882a593Smuzhiyun if (!(ext4_li_info->li_state & EXT4_LAZYINIT_RUNNING)) {
3793*4882a593Smuzhiyun ret = ext4_run_lazyinit_thread();
3794*4882a593Smuzhiyun if (ret)
3795*4882a593Smuzhiyun goto out;
3796*4882a593Smuzhiyun }
3797*4882a593Smuzhiyun out:
3798*4882a593Smuzhiyun mutex_unlock(&ext4_li_mtx);
3799*4882a593Smuzhiyun if (ret)
3800*4882a593Smuzhiyun kfree(elr);
3801*4882a593Smuzhiyun return ret;
3802*4882a593Smuzhiyun }
3803*4882a593Smuzhiyun
3804*4882a593Smuzhiyun /*
3805*4882a593Smuzhiyun * We do not need to lock anything since this is called on
3806*4882a593Smuzhiyun * module unload.
3807*4882a593Smuzhiyun */
ext4_destroy_lazyinit_thread(void)3808*4882a593Smuzhiyun static void ext4_destroy_lazyinit_thread(void)
3809*4882a593Smuzhiyun {
3810*4882a593Smuzhiyun /*
3811*4882a593Smuzhiyun * If thread exited earlier
3812*4882a593Smuzhiyun * there's nothing to be done.
3813*4882a593Smuzhiyun */
3814*4882a593Smuzhiyun if (!ext4_li_info || !ext4_lazyinit_task)
3815*4882a593Smuzhiyun return;
3816*4882a593Smuzhiyun
3817*4882a593Smuzhiyun kthread_stop(ext4_lazyinit_task);
3818*4882a593Smuzhiyun }
3819*4882a593Smuzhiyun
set_journal_csum_feature_set(struct super_block * sb)3820*4882a593Smuzhiyun static int set_journal_csum_feature_set(struct super_block *sb)
3821*4882a593Smuzhiyun {
3822*4882a593Smuzhiyun int ret = 1;
3823*4882a593Smuzhiyun int compat, incompat;
3824*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
3825*4882a593Smuzhiyun
3826*4882a593Smuzhiyun if (ext4_has_metadata_csum(sb)) {
3827*4882a593Smuzhiyun /* journal checksum v3 */
3828*4882a593Smuzhiyun compat = 0;
3829*4882a593Smuzhiyun incompat = JBD2_FEATURE_INCOMPAT_CSUM_V3;
3830*4882a593Smuzhiyun } else {
3831*4882a593Smuzhiyun /* journal checksum v1 */
3832*4882a593Smuzhiyun compat = JBD2_FEATURE_COMPAT_CHECKSUM;
3833*4882a593Smuzhiyun incompat = 0;
3834*4882a593Smuzhiyun }
3835*4882a593Smuzhiyun
3836*4882a593Smuzhiyun jbd2_journal_clear_features(sbi->s_journal,
3837*4882a593Smuzhiyun JBD2_FEATURE_COMPAT_CHECKSUM, 0,
3838*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_CSUM_V3 |
3839*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_CSUM_V2);
3840*4882a593Smuzhiyun if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
3841*4882a593Smuzhiyun ret = jbd2_journal_set_features(sbi->s_journal,
3842*4882a593Smuzhiyun compat, 0,
3843*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT |
3844*4882a593Smuzhiyun incompat);
3845*4882a593Smuzhiyun } else if (test_opt(sb, JOURNAL_CHECKSUM)) {
3846*4882a593Smuzhiyun ret = jbd2_journal_set_features(sbi->s_journal,
3847*4882a593Smuzhiyun compat, 0,
3848*4882a593Smuzhiyun incompat);
3849*4882a593Smuzhiyun jbd2_journal_clear_features(sbi->s_journal, 0, 0,
3850*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT);
3851*4882a593Smuzhiyun } else {
3852*4882a593Smuzhiyun jbd2_journal_clear_features(sbi->s_journal, 0, 0,
3853*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT);
3854*4882a593Smuzhiyun }
3855*4882a593Smuzhiyun
3856*4882a593Smuzhiyun return ret;
3857*4882a593Smuzhiyun }
3858*4882a593Smuzhiyun
3859*4882a593Smuzhiyun /*
3860*4882a593Smuzhiyun * Note: calculating the overhead so we can be compatible with
3861*4882a593Smuzhiyun * historical BSD practice is quite difficult in the face of
3862*4882a593Smuzhiyun * clusters/bigalloc. This is because multiple metadata blocks from
3863*4882a593Smuzhiyun * different block group can end up in the same allocation cluster.
3864*4882a593Smuzhiyun * Calculating the exact overhead in the face of clustered allocation
3865*4882a593Smuzhiyun * requires either O(all block bitmaps) in memory or O(number of block
3866*4882a593Smuzhiyun * groups**2) in time. We will still calculate the superblock for
3867*4882a593Smuzhiyun * older file systems --- and if we come across with a bigalloc file
3868*4882a593Smuzhiyun * system with zero in s_overhead_clusters the estimate will be close to
3869*4882a593Smuzhiyun * correct especially for very large cluster sizes --- but for newer
3870*4882a593Smuzhiyun * file systems, it's better to calculate this figure once at mkfs
3871*4882a593Smuzhiyun * time, and store it in the superblock. If the superblock value is
3872*4882a593Smuzhiyun * present (even for non-bigalloc file systems), we will use it.
3873*4882a593Smuzhiyun */
count_overhead(struct super_block * sb,ext4_group_t grp,char * buf)3874*4882a593Smuzhiyun static int count_overhead(struct super_block *sb, ext4_group_t grp,
3875*4882a593Smuzhiyun char *buf)
3876*4882a593Smuzhiyun {
3877*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
3878*4882a593Smuzhiyun struct ext4_group_desc *gdp;
3879*4882a593Smuzhiyun ext4_fsblk_t first_block, last_block, b;
3880*4882a593Smuzhiyun ext4_group_t i, ngroups = ext4_get_groups_count(sb);
3881*4882a593Smuzhiyun int s, j, count = 0;
3882*4882a593Smuzhiyun int has_super = ext4_bg_has_super(sb, grp);
3883*4882a593Smuzhiyun
3884*4882a593Smuzhiyun if (!ext4_has_feature_bigalloc(sb))
3885*4882a593Smuzhiyun return (has_super + ext4_bg_num_gdb(sb, grp) +
3886*4882a593Smuzhiyun (has_super ? le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) : 0) +
3887*4882a593Smuzhiyun sbi->s_itb_per_group + 2);
3888*4882a593Smuzhiyun
3889*4882a593Smuzhiyun first_block = le32_to_cpu(sbi->s_es->s_first_data_block) +
3890*4882a593Smuzhiyun (grp * EXT4_BLOCKS_PER_GROUP(sb));
3891*4882a593Smuzhiyun last_block = first_block + EXT4_BLOCKS_PER_GROUP(sb) - 1;
3892*4882a593Smuzhiyun for (i = 0; i < ngroups; i++) {
3893*4882a593Smuzhiyun gdp = ext4_get_group_desc(sb, i, NULL);
3894*4882a593Smuzhiyun b = ext4_block_bitmap(sb, gdp);
3895*4882a593Smuzhiyun if (b >= first_block && b <= last_block) {
3896*4882a593Smuzhiyun ext4_set_bit(EXT4_B2C(sbi, b - first_block), buf);
3897*4882a593Smuzhiyun count++;
3898*4882a593Smuzhiyun }
3899*4882a593Smuzhiyun b = ext4_inode_bitmap(sb, gdp);
3900*4882a593Smuzhiyun if (b >= first_block && b <= last_block) {
3901*4882a593Smuzhiyun ext4_set_bit(EXT4_B2C(sbi, b - first_block), buf);
3902*4882a593Smuzhiyun count++;
3903*4882a593Smuzhiyun }
3904*4882a593Smuzhiyun b = ext4_inode_table(sb, gdp);
3905*4882a593Smuzhiyun if (b >= first_block && b + sbi->s_itb_per_group <= last_block)
3906*4882a593Smuzhiyun for (j = 0; j < sbi->s_itb_per_group; j++, b++) {
3907*4882a593Smuzhiyun int c = EXT4_B2C(sbi, b - first_block);
3908*4882a593Smuzhiyun ext4_set_bit(c, buf);
3909*4882a593Smuzhiyun count++;
3910*4882a593Smuzhiyun }
3911*4882a593Smuzhiyun if (i != grp)
3912*4882a593Smuzhiyun continue;
3913*4882a593Smuzhiyun s = 0;
3914*4882a593Smuzhiyun if (ext4_bg_has_super(sb, grp)) {
3915*4882a593Smuzhiyun ext4_set_bit(s++, buf);
3916*4882a593Smuzhiyun count++;
3917*4882a593Smuzhiyun }
3918*4882a593Smuzhiyun j = ext4_bg_num_gdb(sb, grp);
3919*4882a593Smuzhiyun if (s + j > EXT4_BLOCKS_PER_GROUP(sb)) {
3920*4882a593Smuzhiyun ext4_error(sb, "Invalid number of block group "
3921*4882a593Smuzhiyun "descriptor blocks: %d", j);
3922*4882a593Smuzhiyun j = EXT4_BLOCKS_PER_GROUP(sb) - s;
3923*4882a593Smuzhiyun }
3924*4882a593Smuzhiyun count += j;
3925*4882a593Smuzhiyun for (; j > 0; j--)
3926*4882a593Smuzhiyun ext4_set_bit(EXT4_B2C(sbi, s++), buf);
3927*4882a593Smuzhiyun }
3928*4882a593Smuzhiyun if (!count)
3929*4882a593Smuzhiyun return 0;
3930*4882a593Smuzhiyun return EXT4_CLUSTERS_PER_GROUP(sb) -
3931*4882a593Smuzhiyun ext4_count_free(buf, EXT4_CLUSTERS_PER_GROUP(sb) / 8);
3932*4882a593Smuzhiyun }
3933*4882a593Smuzhiyun
3934*4882a593Smuzhiyun /*
3935*4882a593Smuzhiyun * Compute the overhead and stash it in sbi->s_overhead
3936*4882a593Smuzhiyun */
ext4_calculate_overhead(struct super_block * sb)3937*4882a593Smuzhiyun int ext4_calculate_overhead(struct super_block *sb)
3938*4882a593Smuzhiyun {
3939*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
3940*4882a593Smuzhiyun struct ext4_super_block *es = sbi->s_es;
3941*4882a593Smuzhiyun struct inode *j_inode;
3942*4882a593Smuzhiyun unsigned int j_blocks, j_inum = le32_to_cpu(es->s_journal_inum);
3943*4882a593Smuzhiyun ext4_group_t i, ngroups = ext4_get_groups_count(sb);
3944*4882a593Smuzhiyun ext4_fsblk_t overhead = 0;
3945*4882a593Smuzhiyun char *buf = (char *) get_zeroed_page(GFP_NOFS);
3946*4882a593Smuzhiyun
3947*4882a593Smuzhiyun if (!buf)
3948*4882a593Smuzhiyun return -ENOMEM;
3949*4882a593Smuzhiyun
3950*4882a593Smuzhiyun /*
3951*4882a593Smuzhiyun * Compute the overhead (FS structures). This is constant
3952*4882a593Smuzhiyun * for a given filesystem unless the number of block groups
3953*4882a593Smuzhiyun * changes so we cache the previous value until it does.
3954*4882a593Smuzhiyun */
3955*4882a593Smuzhiyun
3956*4882a593Smuzhiyun /*
3957*4882a593Smuzhiyun * All of the blocks before first_data_block are overhead
3958*4882a593Smuzhiyun */
3959*4882a593Smuzhiyun overhead = EXT4_B2C(sbi, le32_to_cpu(es->s_first_data_block));
3960*4882a593Smuzhiyun
3961*4882a593Smuzhiyun /*
3962*4882a593Smuzhiyun * Add the overhead found in each block group
3963*4882a593Smuzhiyun */
3964*4882a593Smuzhiyun for (i = 0; i < ngroups; i++) {
3965*4882a593Smuzhiyun int blks;
3966*4882a593Smuzhiyun
3967*4882a593Smuzhiyun blks = count_overhead(sb, i, buf);
3968*4882a593Smuzhiyun overhead += blks;
3969*4882a593Smuzhiyun if (blks)
3970*4882a593Smuzhiyun memset(buf, 0, PAGE_SIZE);
3971*4882a593Smuzhiyun cond_resched();
3972*4882a593Smuzhiyun }
3973*4882a593Smuzhiyun
3974*4882a593Smuzhiyun /*
3975*4882a593Smuzhiyun * Add the internal journal blocks whether the journal has been
3976*4882a593Smuzhiyun * loaded or not
3977*4882a593Smuzhiyun */
3978*4882a593Smuzhiyun if (sbi->s_journal && !sbi->s_journal_bdev)
3979*4882a593Smuzhiyun overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_total_len);
3980*4882a593Smuzhiyun else if (ext4_has_feature_journal(sb) && !sbi->s_journal && j_inum) {
3981*4882a593Smuzhiyun /* j_inum for internal journal is non-zero */
3982*4882a593Smuzhiyun j_inode = ext4_get_journal_inode(sb, j_inum);
3983*4882a593Smuzhiyun if (j_inode) {
3984*4882a593Smuzhiyun j_blocks = j_inode->i_size >> sb->s_blocksize_bits;
3985*4882a593Smuzhiyun overhead += EXT4_NUM_B2C(sbi, j_blocks);
3986*4882a593Smuzhiyun iput(j_inode);
3987*4882a593Smuzhiyun } else {
3988*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't get journal size");
3989*4882a593Smuzhiyun }
3990*4882a593Smuzhiyun }
3991*4882a593Smuzhiyun sbi->s_overhead = overhead;
3992*4882a593Smuzhiyun smp_wmb();
3993*4882a593Smuzhiyun free_page((unsigned long) buf);
3994*4882a593Smuzhiyun return 0;
3995*4882a593Smuzhiyun }
3996*4882a593Smuzhiyun
ext4_set_resv_clusters(struct super_block * sb)3997*4882a593Smuzhiyun static void ext4_set_resv_clusters(struct super_block *sb)
3998*4882a593Smuzhiyun {
3999*4882a593Smuzhiyun ext4_fsblk_t resv_clusters;
4000*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
4001*4882a593Smuzhiyun
4002*4882a593Smuzhiyun /*
4003*4882a593Smuzhiyun * There's no need to reserve anything when we aren't using extents.
4004*4882a593Smuzhiyun * The space estimates are exact, there are no unwritten extents,
4005*4882a593Smuzhiyun * hole punching doesn't need new metadata... This is needed especially
4006*4882a593Smuzhiyun * to keep ext2/3 backward compatibility.
4007*4882a593Smuzhiyun */
4008*4882a593Smuzhiyun if (!ext4_has_feature_extents(sb))
4009*4882a593Smuzhiyun return;
4010*4882a593Smuzhiyun /*
4011*4882a593Smuzhiyun * By default we reserve 2% or 4096 clusters, whichever is smaller.
4012*4882a593Smuzhiyun * This should cover the situations where we can not afford to run
4013*4882a593Smuzhiyun * out of space like for example punch hole, or converting
4014*4882a593Smuzhiyun * unwritten extents in delalloc path. In most cases such
4015*4882a593Smuzhiyun * allocation would require 1, or 2 blocks, higher numbers are
4016*4882a593Smuzhiyun * very rare.
4017*4882a593Smuzhiyun */
4018*4882a593Smuzhiyun resv_clusters = (ext4_blocks_count(sbi->s_es) >>
4019*4882a593Smuzhiyun sbi->s_cluster_bits);
4020*4882a593Smuzhiyun
4021*4882a593Smuzhiyun do_div(resv_clusters, 50);
4022*4882a593Smuzhiyun resv_clusters = min_t(ext4_fsblk_t, resv_clusters, 4096);
4023*4882a593Smuzhiyun
4024*4882a593Smuzhiyun atomic64_set(&sbi->s_resv_clusters, resv_clusters);
4025*4882a593Smuzhiyun }
4026*4882a593Smuzhiyun
ext4_fill_super(struct super_block * sb,void * data,int silent)4027*4882a593Smuzhiyun static int ext4_fill_super(struct super_block *sb, void *data, int silent)
4028*4882a593Smuzhiyun {
4029*4882a593Smuzhiyun struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev);
4030*4882a593Smuzhiyun char *orig_data = kstrdup(data, GFP_KERNEL);
4031*4882a593Smuzhiyun struct buffer_head *bh, **group_desc;
4032*4882a593Smuzhiyun struct ext4_super_block *es = NULL;
4033*4882a593Smuzhiyun struct ext4_sb_info *sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
4034*4882a593Smuzhiyun struct flex_groups **flex_groups;
4035*4882a593Smuzhiyun ext4_fsblk_t block;
4036*4882a593Smuzhiyun ext4_fsblk_t sb_block = get_sb_block(&data);
4037*4882a593Smuzhiyun ext4_fsblk_t logical_sb_block;
4038*4882a593Smuzhiyun unsigned long offset = 0;
4039*4882a593Smuzhiyun unsigned long journal_devnum = 0;
4040*4882a593Smuzhiyun unsigned long def_mount_opts;
4041*4882a593Smuzhiyun struct inode *root;
4042*4882a593Smuzhiyun const char *descr;
4043*4882a593Smuzhiyun int ret = -ENOMEM;
4044*4882a593Smuzhiyun int blocksize, clustersize;
4045*4882a593Smuzhiyun unsigned int db_count;
4046*4882a593Smuzhiyun unsigned int i;
4047*4882a593Smuzhiyun int needs_recovery, has_huge_files;
4048*4882a593Smuzhiyun __u64 blocks_count;
4049*4882a593Smuzhiyun int err = 0;
4050*4882a593Smuzhiyun unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
4051*4882a593Smuzhiyun ext4_group_t first_not_zeroed;
4052*4882a593Smuzhiyun
4053*4882a593Smuzhiyun if ((data && !orig_data) || !sbi)
4054*4882a593Smuzhiyun goto out_free_base;
4055*4882a593Smuzhiyun
4056*4882a593Smuzhiyun sbi->s_daxdev = dax_dev;
4057*4882a593Smuzhiyun sbi->s_blockgroup_lock =
4058*4882a593Smuzhiyun kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
4059*4882a593Smuzhiyun if (!sbi->s_blockgroup_lock)
4060*4882a593Smuzhiyun goto out_free_base;
4061*4882a593Smuzhiyun
4062*4882a593Smuzhiyun sb->s_fs_info = sbi;
4063*4882a593Smuzhiyun sbi->s_sb = sb;
4064*4882a593Smuzhiyun sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;
4065*4882a593Smuzhiyun sbi->s_sb_block = sb_block;
4066*4882a593Smuzhiyun if (sb->s_bdev->bd_part)
4067*4882a593Smuzhiyun sbi->s_sectors_written_start =
4068*4882a593Smuzhiyun part_stat_read(sb->s_bdev->bd_part, sectors[STAT_WRITE]);
4069*4882a593Smuzhiyun
4070*4882a593Smuzhiyun /* Cleanup superblock name */
4071*4882a593Smuzhiyun strreplace(sb->s_id, '/', '!');
4072*4882a593Smuzhiyun
4073*4882a593Smuzhiyun /* -EINVAL is default */
4074*4882a593Smuzhiyun ret = -EINVAL;
4075*4882a593Smuzhiyun blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);
4076*4882a593Smuzhiyun if (!blocksize) {
4077*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "unable to set blocksize");
4078*4882a593Smuzhiyun goto out_fail;
4079*4882a593Smuzhiyun }
4080*4882a593Smuzhiyun
4081*4882a593Smuzhiyun /*
4082*4882a593Smuzhiyun * The ext4 superblock will not be buffer aligned for other than 1kB
4083*4882a593Smuzhiyun * block sizes. We need to calculate the offset from buffer start.
4084*4882a593Smuzhiyun */
4085*4882a593Smuzhiyun if (blocksize != EXT4_MIN_BLOCK_SIZE) {
4086*4882a593Smuzhiyun logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;
4087*4882a593Smuzhiyun offset = do_div(logical_sb_block, blocksize);
4088*4882a593Smuzhiyun } else {
4089*4882a593Smuzhiyun logical_sb_block = sb_block;
4090*4882a593Smuzhiyun }
4091*4882a593Smuzhiyun
4092*4882a593Smuzhiyun bh = ext4_sb_bread_unmovable(sb, logical_sb_block);
4093*4882a593Smuzhiyun if (IS_ERR(bh)) {
4094*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "unable to read superblock");
4095*4882a593Smuzhiyun ret = PTR_ERR(bh);
4096*4882a593Smuzhiyun bh = NULL;
4097*4882a593Smuzhiyun goto out_fail;
4098*4882a593Smuzhiyun }
4099*4882a593Smuzhiyun /*
4100*4882a593Smuzhiyun * Note: s_es must be initialized as soon as possible because
4101*4882a593Smuzhiyun * some ext4 macro-instructions depend on its value
4102*4882a593Smuzhiyun */
4103*4882a593Smuzhiyun es = (struct ext4_super_block *) (bh->b_data + offset);
4104*4882a593Smuzhiyun sbi->s_es = es;
4105*4882a593Smuzhiyun sb->s_magic = le16_to_cpu(es->s_magic);
4106*4882a593Smuzhiyun if (sb->s_magic != EXT4_SUPER_MAGIC)
4107*4882a593Smuzhiyun goto cantfind_ext4;
4108*4882a593Smuzhiyun sbi->s_kbytes_written = le64_to_cpu(es->s_kbytes_written);
4109*4882a593Smuzhiyun
4110*4882a593Smuzhiyun /* Warn if metadata_csum and gdt_csum are both set. */
4111*4882a593Smuzhiyun if (ext4_has_feature_metadata_csum(sb) &&
4112*4882a593Smuzhiyun ext4_has_feature_gdt_csum(sb))
4113*4882a593Smuzhiyun ext4_warning(sb, "metadata_csum and uninit_bg are "
4114*4882a593Smuzhiyun "redundant flags; please run fsck.");
4115*4882a593Smuzhiyun
4116*4882a593Smuzhiyun /* Check for a known checksum algorithm */
4117*4882a593Smuzhiyun if (!ext4_verify_csum_type(sb, es)) {
4118*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "VFS: Found ext4 filesystem with "
4119*4882a593Smuzhiyun "unknown checksum algorithm.");
4120*4882a593Smuzhiyun silent = 1;
4121*4882a593Smuzhiyun goto cantfind_ext4;
4122*4882a593Smuzhiyun }
4123*4882a593Smuzhiyun
4124*4882a593Smuzhiyun /* Load the checksum driver */
4125*4882a593Smuzhiyun sbi->s_chksum_driver = crypto_alloc_shash("crc32c", 0, 0);
4126*4882a593Smuzhiyun if (IS_ERR(sbi->s_chksum_driver)) {
4127*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Cannot load crc32c driver.");
4128*4882a593Smuzhiyun ret = PTR_ERR(sbi->s_chksum_driver);
4129*4882a593Smuzhiyun sbi->s_chksum_driver = NULL;
4130*4882a593Smuzhiyun goto failed_mount;
4131*4882a593Smuzhiyun }
4132*4882a593Smuzhiyun
4133*4882a593Smuzhiyun /* Check superblock checksum */
4134*4882a593Smuzhiyun if (!ext4_superblock_csum_verify(sb, es)) {
4135*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "VFS: Found ext4 filesystem with "
4136*4882a593Smuzhiyun "invalid superblock checksum. Run e2fsck?");
4137*4882a593Smuzhiyun silent = 1;
4138*4882a593Smuzhiyun ret = -EFSBADCRC;
4139*4882a593Smuzhiyun goto cantfind_ext4;
4140*4882a593Smuzhiyun }
4141*4882a593Smuzhiyun
4142*4882a593Smuzhiyun /* Precompute checksum seed for all metadata */
4143*4882a593Smuzhiyun if (ext4_has_feature_csum_seed(sb))
4144*4882a593Smuzhiyun sbi->s_csum_seed = le32_to_cpu(es->s_checksum_seed);
4145*4882a593Smuzhiyun else if (ext4_has_metadata_csum(sb) || ext4_has_feature_ea_inode(sb))
4146*4882a593Smuzhiyun sbi->s_csum_seed = ext4_chksum(sbi, ~0, es->s_uuid,
4147*4882a593Smuzhiyun sizeof(es->s_uuid));
4148*4882a593Smuzhiyun
4149*4882a593Smuzhiyun /* Set defaults before we parse the mount options */
4150*4882a593Smuzhiyun def_mount_opts = le32_to_cpu(es->s_default_mount_opts);
4151*4882a593Smuzhiyun set_opt(sb, INIT_INODE_TABLE);
4152*4882a593Smuzhiyun if (def_mount_opts & EXT4_DEFM_DEBUG)
4153*4882a593Smuzhiyun set_opt(sb, DEBUG);
4154*4882a593Smuzhiyun if (def_mount_opts & EXT4_DEFM_BSDGROUPS)
4155*4882a593Smuzhiyun set_opt(sb, GRPID);
4156*4882a593Smuzhiyun if (def_mount_opts & EXT4_DEFM_UID16)
4157*4882a593Smuzhiyun set_opt(sb, NO_UID32);
4158*4882a593Smuzhiyun /* xattr user namespace & acls are now defaulted on */
4159*4882a593Smuzhiyun set_opt(sb, XATTR_USER);
4160*4882a593Smuzhiyun #ifdef CONFIG_EXT4_FS_POSIX_ACL
4161*4882a593Smuzhiyun set_opt(sb, POSIX_ACL);
4162*4882a593Smuzhiyun #endif
4163*4882a593Smuzhiyun if (ext4_has_feature_fast_commit(sb))
4164*4882a593Smuzhiyun set_opt2(sb, JOURNAL_FAST_COMMIT);
4165*4882a593Smuzhiyun /* don't forget to enable journal_csum when metadata_csum is enabled. */
4166*4882a593Smuzhiyun if (ext4_has_metadata_csum(sb))
4167*4882a593Smuzhiyun set_opt(sb, JOURNAL_CHECKSUM);
4168*4882a593Smuzhiyun
4169*4882a593Smuzhiyun if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA)
4170*4882a593Smuzhiyun set_opt(sb, JOURNAL_DATA);
4171*4882a593Smuzhiyun else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED)
4172*4882a593Smuzhiyun set_opt(sb, ORDERED_DATA);
4173*4882a593Smuzhiyun else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK)
4174*4882a593Smuzhiyun set_opt(sb, WRITEBACK_DATA);
4175*4882a593Smuzhiyun
4176*4882a593Smuzhiyun if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC)
4177*4882a593Smuzhiyun set_opt(sb, ERRORS_PANIC);
4178*4882a593Smuzhiyun else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE)
4179*4882a593Smuzhiyun set_opt(sb, ERRORS_CONT);
4180*4882a593Smuzhiyun else
4181*4882a593Smuzhiyun set_opt(sb, ERRORS_RO);
4182*4882a593Smuzhiyun /* block_validity enabled by default; disable with noblock_validity */
4183*4882a593Smuzhiyun set_opt(sb, BLOCK_VALIDITY);
4184*4882a593Smuzhiyun if (def_mount_opts & EXT4_DEFM_DISCARD)
4185*4882a593Smuzhiyun set_opt(sb, DISCARD);
4186*4882a593Smuzhiyun
4187*4882a593Smuzhiyun sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid));
4188*4882a593Smuzhiyun sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid));
4189*4882a593Smuzhiyun sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ;
4190*4882a593Smuzhiyun sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME;
4191*4882a593Smuzhiyun sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME;
4192*4882a593Smuzhiyun
4193*4882a593Smuzhiyun if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0)
4194*4882a593Smuzhiyun set_opt(sb, BARRIER);
4195*4882a593Smuzhiyun
4196*4882a593Smuzhiyun /*
4197*4882a593Smuzhiyun * enable delayed allocation by default
4198*4882a593Smuzhiyun * Use -o nodelalloc to turn it off
4199*4882a593Smuzhiyun */
4200*4882a593Smuzhiyun if (!IS_EXT3_SB(sb) && !IS_EXT2_SB(sb) &&
4201*4882a593Smuzhiyun ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0))
4202*4882a593Smuzhiyun set_opt(sb, DELALLOC);
4203*4882a593Smuzhiyun
4204*4882a593Smuzhiyun /*
4205*4882a593Smuzhiyun * set default s_li_wait_mult for lazyinit, for the case there is
4206*4882a593Smuzhiyun * no mount option specified.
4207*4882a593Smuzhiyun */
4208*4882a593Smuzhiyun sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT;
4209*4882a593Smuzhiyun
4210*4882a593Smuzhiyun if (le32_to_cpu(es->s_log_block_size) >
4211*4882a593Smuzhiyun (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
4212*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4213*4882a593Smuzhiyun "Invalid log block size: %u",
4214*4882a593Smuzhiyun le32_to_cpu(es->s_log_block_size));
4215*4882a593Smuzhiyun goto failed_mount;
4216*4882a593Smuzhiyun }
4217*4882a593Smuzhiyun if (le32_to_cpu(es->s_log_cluster_size) >
4218*4882a593Smuzhiyun (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
4219*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4220*4882a593Smuzhiyun "Invalid log cluster size: %u",
4221*4882a593Smuzhiyun le32_to_cpu(es->s_log_cluster_size));
4222*4882a593Smuzhiyun goto failed_mount;
4223*4882a593Smuzhiyun }
4224*4882a593Smuzhiyun
4225*4882a593Smuzhiyun blocksize = EXT4_MIN_BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
4226*4882a593Smuzhiyun
4227*4882a593Smuzhiyun if (blocksize == PAGE_SIZE)
4228*4882a593Smuzhiyun set_opt(sb, DIOREAD_NOLOCK);
4229*4882a593Smuzhiyun
4230*4882a593Smuzhiyun if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) {
4231*4882a593Smuzhiyun sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE;
4232*4882a593Smuzhiyun sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO;
4233*4882a593Smuzhiyun } else {
4234*4882a593Smuzhiyun sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
4235*4882a593Smuzhiyun sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
4236*4882a593Smuzhiyun if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) {
4237*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "invalid first ino: %u",
4238*4882a593Smuzhiyun sbi->s_first_ino);
4239*4882a593Smuzhiyun goto failed_mount;
4240*4882a593Smuzhiyun }
4241*4882a593Smuzhiyun if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) ||
4242*4882a593Smuzhiyun (!is_power_of_2(sbi->s_inode_size)) ||
4243*4882a593Smuzhiyun (sbi->s_inode_size > blocksize)) {
4244*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4245*4882a593Smuzhiyun "unsupported inode size: %d",
4246*4882a593Smuzhiyun sbi->s_inode_size);
4247*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "blocksize: %d", blocksize);
4248*4882a593Smuzhiyun goto failed_mount;
4249*4882a593Smuzhiyun }
4250*4882a593Smuzhiyun /*
4251*4882a593Smuzhiyun * i_atime_extra is the last extra field available for
4252*4882a593Smuzhiyun * [acm]times in struct ext4_inode. Checking for that
4253*4882a593Smuzhiyun * field should suffice to ensure we have extra space
4254*4882a593Smuzhiyun * for all three.
4255*4882a593Smuzhiyun */
4256*4882a593Smuzhiyun if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) +
4257*4882a593Smuzhiyun sizeof(((struct ext4_inode *)0)->i_atime_extra)) {
4258*4882a593Smuzhiyun sb->s_time_gran = 1;
4259*4882a593Smuzhiyun sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX;
4260*4882a593Smuzhiyun } else {
4261*4882a593Smuzhiyun sb->s_time_gran = NSEC_PER_SEC;
4262*4882a593Smuzhiyun sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX;
4263*4882a593Smuzhiyun }
4264*4882a593Smuzhiyun sb->s_time_min = EXT4_TIMESTAMP_MIN;
4265*4882a593Smuzhiyun }
4266*4882a593Smuzhiyun if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
4267*4882a593Smuzhiyun sbi->s_want_extra_isize = sizeof(struct ext4_inode) -
4268*4882a593Smuzhiyun EXT4_GOOD_OLD_INODE_SIZE;
4269*4882a593Smuzhiyun if (ext4_has_feature_extra_isize(sb)) {
4270*4882a593Smuzhiyun unsigned v, max = (sbi->s_inode_size -
4271*4882a593Smuzhiyun EXT4_GOOD_OLD_INODE_SIZE);
4272*4882a593Smuzhiyun
4273*4882a593Smuzhiyun v = le16_to_cpu(es->s_want_extra_isize);
4274*4882a593Smuzhiyun if (v > max) {
4275*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4276*4882a593Smuzhiyun "bad s_want_extra_isize: %d", v);
4277*4882a593Smuzhiyun goto failed_mount;
4278*4882a593Smuzhiyun }
4279*4882a593Smuzhiyun if (sbi->s_want_extra_isize < v)
4280*4882a593Smuzhiyun sbi->s_want_extra_isize = v;
4281*4882a593Smuzhiyun
4282*4882a593Smuzhiyun v = le16_to_cpu(es->s_min_extra_isize);
4283*4882a593Smuzhiyun if (v > max) {
4284*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4285*4882a593Smuzhiyun "bad s_min_extra_isize: %d", v);
4286*4882a593Smuzhiyun goto failed_mount;
4287*4882a593Smuzhiyun }
4288*4882a593Smuzhiyun if (sbi->s_want_extra_isize < v)
4289*4882a593Smuzhiyun sbi->s_want_extra_isize = v;
4290*4882a593Smuzhiyun }
4291*4882a593Smuzhiyun }
4292*4882a593Smuzhiyun
4293*4882a593Smuzhiyun if (sbi->s_es->s_mount_opts[0]) {
4294*4882a593Smuzhiyun char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts,
4295*4882a593Smuzhiyun sizeof(sbi->s_es->s_mount_opts),
4296*4882a593Smuzhiyun GFP_KERNEL);
4297*4882a593Smuzhiyun if (!s_mount_opts)
4298*4882a593Smuzhiyun goto failed_mount;
4299*4882a593Smuzhiyun if (!parse_options(s_mount_opts, sb, &journal_devnum,
4300*4882a593Smuzhiyun &journal_ioprio, 0)) {
4301*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
4302*4882a593Smuzhiyun "failed to parse options in superblock: %s",
4303*4882a593Smuzhiyun s_mount_opts);
4304*4882a593Smuzhiyun }
4305*4882a593Smuzhiyun kfree(s_mount_opts);
4306*4882a593Smuzhiyun }
4307*4882a593Smuzhiyun sbi->s_def_mount_opt = sbi->s_mount_opt;
4308*4882a593Smuzhiyun if (!parse_options((char *) data, sb, &journal_devnum,
4309*4882a593Smuzhiyun &journal_ioprio, 0))
4310*4882a593Smuzhiyun goto failed_mount;
4311*4882a593Smuzhiyun
4312*4882a593Smuzhiyun #ifdef CONFIG_UNICODE
4313*4882a593Smuzhiyun if (ext4_has_feature_casefold(sb) && !sb->s_encoding) {
4314*4882a593Smuzhiyun const struct ext4_sb_encodings *encoding_info;
4315*4882a593Smuzhiyun struct unicode_map *encoding;
4316*4882a593Smuzhiyun __u16 encoding_flags;
4317*4882a593Smuzhiyun
4318*4882a593Smuzhiyun if (ext4_sb_read_encoding(es, &encoding_info,
4319*4882a593Smuzhiyun &encoding_flags)) {
4320*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4321*4882a593Smuzhiyun "Encoding requested by superblock is unknown");
4322*4882a593Smuzhiyun goto failed_mount;
4323*4882a593Smuzhiyun }
4324*4882a593Smuzhiyun
4325*4882a593Smuzhiyun encoding = utf8_load(encoding_info->version);
4326*4882a593Smuzhiyun if (IS_ERR(encoding)) {
4327*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4328*4882a593Smuzhiyun "can't mount with superblock charset: %s-%s "
4329*4882a593Smuzhiyun "not supported by the kernel. flags: 0x%x.",
4330*4882a593Smuzhiyun encoding_info->name, encoding_info->version,
4331*4882a593Smuzhiyun encoding_flags);
4332*4882a593Smuzhiyun goto failed_mount;
4333*4882a593Smuzhiyun }
4334*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO,"Using encoding defined by superblock: "
4335*4882a593Smuzhiyun "%s-%s with flags 0x%hx", encoding_info->name,
4336*4882a593Smuzhiyun encoding_info->version?:"\b", encoding_flags);
4337*4882a593Smuzhiyun
4338*4882a593Smuzhiyun sb->s_encoding = encoding;
4339*4882a593Smuzhiyun sb->s_encoding_flags = encoding_flags;
4340*4882a593Smuzhiyun }
4341*4882a593Smuzhiyun #endif
4342*4882a593Smuzhiyun
4343*4882a593Smuzhiyun if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
4344*4882a593Smuzhiyun printk_once(KERN_WARNING "EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, O_DIRECT and fast_commit support!\n");
4345*4882a593Smuzhiyun /* can't mount with both data=journal and dioread_nolock. */
4346*4882a593Smuzhiyun clear_opt(sb, DIOREAD_NOLOCK);
4347*4882a593Smuzhiyun clear_opt2(sb, JOURNAL_FAST_COMMIT);
4348*4882a593Smuzhiyun if (test_opt2(sb, EXPLICIT_DELALLOC)) {
4349*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4350*4882a593Smuzhiyun "both data=journal and delalloc");
4351*4882a593Smuzhiyun goto failed_mount;
4352*4882a593Smuzhiyun }
4353*4882a593Smuzhiyun if (test_opt(sb, DAX_ALWAYS)) {
4354*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4355*4882a593Smuzhiyun "both data=journal and dax");
4356*4882a593Smuzhiyun goto failed_mount;
4357*4882a593Smuzhiyun }
4358*4882a593Smuzhiyun if (ext4_has_feature_encrypt(sb)) {
4359*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
4360*4882a593Smuzhiyun "encrypted files will use data=ordered "
4361*4882a593Smuzhiyun "instead of data journaling mode");
4362*4882a593Smuzhiyun }
4363*4882a593Smuzhiyun if (test_opt(sb, DELALLOC))
4364*4882a593Smuzhiyun clear_opt(sb, DELALLOC);
4365*4882a593Smuzhiyun } else {
4366*4882a593Smuzhiyun sb->s_iflags |= SB_I_CGROUPWB;
4367*4882a593Smuzhiyun }
4368*4882a593Smuzhiyun
4369*4882a593Smuzhiyun sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
4370*4882a593Smuzhiyun (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0);
4371*4882a593Smuzhiyun
4372*4882a593Smuzhiyun if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV &&
4373*4882a593Smuzhiyun (ext4_has_compat_features(sb) ||
4374*4882a593Smuzhiyun ext4_has_ro_compat_features(sb) ||
4375*4882a593Smuzhiyun ext4_has_incompat_features(sb)))
4376*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
4377*4882a593Smuzhiyun "feature flags set on rev 0 fs, "
4378*4882a593Smuzhiyun "running e2fsck is recommended");
4379*4882a593Smuzhiyun
4380*4882a593Smuzhiyun if (es->s_creator_os == cpu_to_le32(EXT4_OS_HURD)) {
4381*4882a593Smuzhiyun set_opt2(sb, HURD_COMPAT);
4382*4882a593Smuzhiyun if (ext4_has_feature_64bit(sb)) {
4383*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4384*4882a593Smuzhiyun "The Hurd can't support 64-bit file systems");
4385*4882a593Smuzhiyun goto failed_mount;
4386*4882a593Smuzhiyun }
4387*4882a593Smuzhiyun
4388*4882a593Smuzhiyun /*
4389*4882a593Smuzhiyun * ea_inode feature uses l_i_version field which is not
4390*4882a593Smuzhiyun * available in HURD_COMPAT mode.
4391*4882a593Smuzhiyun */
4392*4882a593Smuzhiyun if (ext4_has_feature_ea_inode(sb)) {
4393*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4394*4882a593Smuzhiyun "ea_inode feature is not supported for Hurd");
4395*4882a593Smuzhiyun goto failed_mount;
4396*4882a593Smuzhiyun }
4397*4882a593Smuzhiyun }
4398*4882a593Smuzhiyun
4399*4882a593Smuzhiyun if (IS_EXT2_SB(sb)) {
4400*4882a593Smuzhiyun if (ext2_feature_set_ok(sb))
4401*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "mounting ext2 file system "
4402*4882a593Smuzhiyun "using the ext4 subsystem");
4403*4882a593Smuzhiyun else {
4404*4882a593Smuzhiyun /*
4405*4882a593Smuzhiyun * If we're probing be silent, if this looks like
4406*4882a593Smuzhiyun * it's actually an ext[34] filesystem.
4407*4882a593Smuzhiyun */
4408*4882a593Smuzhiyun if (silent && ext4_feature_set_ok(sb, sb_rdonly(sb)))
4409*4882a593Smuzhiyun goto failed_mount;
4410*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "couldn't mount as ext2 due "
4411*4882a593Smuzhiyun "to feature incompatibilities");
4412*4882a593Smuzhiyun goto failed_mount;
4413*4882a593Smuzhiyun }
4414*4882a593Smuzhiyun }
4415*4882a593Smuzhiyun
4416*4882a593Smuzhiyun if (IS_EXT3_SB(sb)) {
4417*4882a593Smuzhiyun if (ext3_feature_set_ok(sb))
4418*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "mounting ext3 file system "
4419*4882a593Smuzhiyun "using the ext4 subsystem");
4420*4882a593Smuzhiyun else {
4421*4882a593Smuzhiyun /*
4422*4882a593Smuzhiyun * If we're probing be silent, if this looks like
4423*4882a593Smuzhiyun * it's actually an ext4 filesystem.
4424*4882a593Smuzhiyun */
4425*4882a593Smuzhiyun if (silent && ext4_feature_set_ok(sb, sb_rdonly(sb)))
4426*4882a593Smuzhiyun goto failed_mount;
4427*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "couldn't mount as ext3 due "
4428*4882a593Smuzhiyun "to feature incompatibilities");
4429*4882a593Smuzhiyun goto failed_mount;
4430*4882a593Smuzhiyun }
4431*4882a593Smuzhiyun }
4432*4882a593Smuzhiyun
4433*4882a593Smuzhiyun /*
4434*4882a593Smuzhiyun * Check feature flags regardless of the revision level, since we
4435*4882a593Smuzhiyun * previously didn't change the revision level when setting the flags,
4436*4882a593Smuzhiyun * so there is a chance incompat flags are set on a rev 0 filesystem.
4437*4882a593Smuzhiyun */
4438*4882a593Smuzhiyun if (!ext4_feature_set_ok(sb, (sb_rdonly(sb))))
4439*4882a593Smuzhiyun goto failed_mount;
4440*4882a593Smuzhiyun
4441*4882a593Smuzhiyun if (le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) > (blocksize / 4)) {
4442*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4443*4882a593Smuzhiyun "Number of reserved GDT blocks insanely large: %d",
4444*4882a593Smuzhiyun le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks));
4445*4882a593Smuzhiyun goto failed_mount;
4446*4882a593Smuzhiyun }
4447*4882a593Smuzhiyun
4448*4882a593Smuzhiyun if (bdev_dax_supported(sb->s_bdev, blocksize))
4449*4882a593Smuzhiyun set_bit(EXT4_FLAGS_BDEV_IS_DAX, &sbi->s_ext4_flags);
4450*4882a593Smuzhiyun
4451*4882a593Smuzhiyun if (sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS) {
4452*4882a593Smuzhiyun if (ext4_has_feature_inline_data(sb)) {
4453*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Cannot use DAX on a filesystem"
4454*4882a593Smuzhiyun " that may contain inline data");
4455*4882a593Smuzhiyun goto failed_mount;
4456*4882a593Smuzhiyun }
4457*4882a593Smuzhiyun if (!test_bit(EXT4_FLAGS_BDEV_IS_DAX, &sbi->s_ext4_flags)) {
4458*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4459*4882a593Smuzhiyun "DAX unsupported by block device.");
4460*4882a593Smuzhiyun goto failed_mount;
4461*4882a593Smuzhiyun }
4462*4882a593Smuzhiyun }
4463*4882a593Smuzhiyun
4464*4882a593Smuzhiyun if (ext4_has_feature_encrypt(sb) && es->s_encryption_level) {
4465*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Unsupported encryption level %d",
4466*4882a593Smuzhiyun es->s_encryption_level);
4467*4882a593Smuzhiyun goto failed_mount;
4468*4882a593Smuzhiyun }
4469*4882a593Smuzhiyun
4470*4882a593Smuzhiyun if (sb->s_blocksize != blocksize) {
4471*4882a593Smuzhiyun /*
4472*4882a593Smuzhiyun * bh must be released before kill_bdev(), otherwise
4473*4882a593Smuzhiyun * it won't be freed and its page also. kill_bdev()
4474*4882a593Smuzhiyun * is called by sb_set_blocksize().
4475*4882a593Smuzhiyun */
4476*4882a593Smuzhiyun brelse(bh);
4477*4882a593Smuzhiyun /* Validate the filesystem blocksize */
4478*4882a593Smuzhiyun if (!sb_set_blocksize(sb, blocksize)) {
4479*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "bad block size %d",
4480*4882a593Smuzhiyun blocksize);
4481*4882a593Smuzhiyun bh = NULL;
4482*4882a593Smuzhiyun goto failed_mount;
4483*4882a593Smuzhiyun }
4484*4882a593Smuzhiyun
4485*4882a593Smuzhiyun logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;
4486*4882a593Smuzhiyun offset = do_div(logical_sb_block, blocksize);
4487*4882a593Smuzhiyun bh = ext4_sb_bread_unmovable(sb, logical_sb_block);
4488*4882a593Smuzhiyun if (IS_ERR(bh)) {
4489*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4490*4882a593Smuzhiyun "Can't read superblock on 2nd try");
4491*4882a593Smuzhiyun ret = PTR_ERR(bh);
4492*4882a593Smuzhiyun bh = NULL;
4493*4882a593Smuzhiyun goto failed_mount;
4494*4882a593Smuzhiyun }
4495*4882a593Smuzhiyun es = (struct ext4_super_block *)(bh->b_data + offset);
4496*4882a593Smuzhiyun sbi->s_es = es;
4497*4882a593Smuzhiyun if (es->s_magic != cpu_to_le16(EXT4_SUPER_MAGIC)) {
4498*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4499*4882a593Smuzhiyun "Magic mismatch, very weird!");
4500*4882a593Smuzhiyun goto failed_mount;
4501*4882a593Smuzhiyun }
4502*4882a593Smuzhiyun }
4503*4882a593Smuzhiyun
4504*4882a593Smuzhiyun has_huge_files = ext4_has_feature_huge_file(sb);
4505*4882a593Smuzhiyun sbi->s_bitmap_maxbytes = ext4_max_bitmap_size(sb->s_blocksize_bits,
4506*4882a593Smuzhiyun has_huge_files);
4507*4882a593Smuzhiyun sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files);
4508*4882a593Smuzhiyun
4509*4882a593Smuzhiyun sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
4510*4882a593Smuzhiyun if (ext4_has_feature_64bit(sb)) {
4511*4882a593Smuzhiyun if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
4512*4882a593Smuzhiyun sbi->s_desc_size > EXT4_MAX_DESC_SIZE ||
4513*4882a593Smuzhiyun !is_power_of_2(sbi->s_desc_size)) {
4514*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4515*4882a593Smuzhiyun "unsupported descriptor size %lu",
4516*4882a593Smuzhiyun sbi->s_desc_size);
4517*4882a593Smuzhiyun goto failed_mount;
4518*4882a593Smuzhiyun }
4519*4882a593Smuzhiyun } else
4520*4882a593Smuzhiyun sbi->s_desc_size = EXT4_MIN_DESC_SIZE;
4521*4882a593Smuzhiyun
4522*4882a593Smuzhiyun sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
4523*4882a593Smuzhiyun sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
4524*4882a593Smuzhiyun
4525*4882a593Smuzhiyun sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb);
4526*4882a593Smuzhiyun if (sbi->s_inodes_per_block == 0)
4527*4882a593Smuzhiyun goto cantfind_ext4;
4528*4882a593Smuzhiyun if (sbi->s_inodes_per_group < sbi->s_inodes_per_block ||
4529*4882a593Smuzhiyun sbi->s_inodes_per_group > blocksize * 8) {
4530*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n",
4531*4882a593Smuzhiyun sbi->s_inodes_per_group);
4532*4882a593Smuzhiyun goto failed_mount;
4533*4882a593Smuzhiyun }
4534*4882a593Smuzhiyun sbi->s_itb_per_group = sbi->s_inodes_per_group /
4535*4882a593Smuzhiyun sbi->s_inodes_per_block;
4536*4882a593Smuzhiyun sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb);
4537*4882a593Smuzhiyun sbi->s_sbh = bh;
4538*4882a593Smuzhiyun sbi->s_mount_state = le16_to_cpu(es->s_state) & ~EXT4_FC_REPLAY;
4539*4882a593Smuzhiyun sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb));
4540*4882a593Smuzhiyun sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb));
4541*4882a593Smuzhiyun
4542*4882a593Smuzhiyun for (i = 0; i < 4; i++)
4543*4882a593Smuzhiyun sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
4544*4882a593Smuzhiyun sbi->s_def_hash_version = es->s_def_hash_version;
4545*4882a593Smuzhiyun if (ext4_has_feature_dir_index(sb)) {
4546*4882a593Smuzhiyun i = le32_to_cpu(es->s_flags);
4547*4882a593Smuzhiyun if (i & EXT2_FLAGS_UNSIGNED_HASH)
4548*4882a593Smuzhiyun sbi->s_hash_unsigned = 3;
4549*4882a593Smuzhiyun else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) {
4550*4882a593Smuzhiyun #ifdef __CHAR_UNSIGNED__
4551*4882a593Smuzhiyun if (!sb_rdonly(sb))
4552*4882a593Smuzhiyun es->s_flags |=
4553*4882a593Smuzhiyun cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH);
4554*4882a593Smuzhiyun sbi->s_hash_unsigned = 3;
4555*4882a593Smuzhiyun #else
4556*4882a593Smuzhiyun if (!sb_rdonly(sb))
4557*4882a593Smuzhiyun es->s_flags |=
4558*4882a593Smuzhiyun cpu_to_le32(EXT2_FLAGS_SIGNED_HASH);
4559*4882a593Smuzhiyun #endif
4560*4882a593Smuzhiyun }
4561*4882a593Smuzhiyun }
4562*4882a593Smuzhiyun
4563*4882a593Smuzhiyun /* Handle clustersize */
4564*4882a593Smuzhiyun clustersize = BLOCK_SIZE << le32_to_cpu(es->s_log_cluster_size);
4565*4882a593Smuzhiyun if (ext4_has_feature_bigalloc(sb)) {
4566*4882a593Smuzhiyun if (clustersize < blocksize) {
4567*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4568*4882a593Smuzhiyun "cluster size (%d) smaller than "
4569*4882a593Smuzhiyun "block size (%d)", clustersize, blocksize);
4570*4882a593Smuzhiyun goto failed_mount;
4571*4882a593Smuzhiyun }
4572*4882a593Smuzhiyun sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) -
4573*4882a593Smuzhiyun le32_to_cpu(es->s_log_block_size);
4574*4882a593Smuzhiyun sbi->s_clusters_per_group =
4575*4882a593Smuzhiyun le32_to_cpu(es->s_clusters_per_group);
4576*4882a593Smuzhiyun if (sbi->s_clusters_per_group > blocksize * 8) {
4577*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4578*4882a593Smuzhiyun "#clusters per group too big: %lu",
4579*4882a593Smuzhiyun sbi->s_clusters_per_group);
4580*4882a593Smuzhiyun goto failed_mount;
4581*4882a593Smuzhiyun }
4582*4882a593Smuzhiyun if (sbi->s_blocks_per_group !=
4583*4882a593Smuzhiyun (sbi->s_clusters_per_group * (clustersize / blocksize))) {
4584*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "blocks per group (%lu) and "
4585*4882a593Smuzhiyun "clusters per group (%lu) inconsistent",
4586*4882a593Smuzhiyun sbi->s_blocks_per_group,
4587*4882a593Smuzhiyun sbi->s_clusters_per_group);
4588*4882a593Smuzhiyun goto failed_mount;
4589*4882a593Smuzhiyun }
4590*4882a593Smuzhiyun } else {
4591*4882a593Smuzhiyun if (clustersize != blocksize) {
4592*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4593*4882a593Smuzhiyun "fragment/cluster size (%d) != "
4594*4882a593Smuzhiyun "block size (%d)", clustersize, blocksize);
4595*4882a593Smuzhiyun goto failed_mount;
4596*4882a593Smuzhiyun }
4597*4882a593Smuzhiyun if (sbi->s_blocks_per_group > blocksize * 8) {
4598*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4599*4882a593Smuzhiyun "#blocks per group too big: %lu",
4600*4882a593Smuzhiyun sbi->s_blocks_per_group);
4601*4882a593Smuzhiyun goto failed_mount;
4602*4882a593Smuzhiyun }
4603*4882a593Smuzhiyun sbi->s_clusters_per_group = sbi->s_blocks_per_group;
4604*4882a593Smuzhiyun sbi->s_cluster_bits = 0;
4605*4882a593Smuzhiyun }
4606*4882a593Smuzhiyun sbi->s_cluster_ratio = clustersize / blocksize;
4607*4882a593Smuzhiyun
4608*4882a593Smuzhiyun /* Do we have standard group size of clustersize * 8 blocks ? */
4609*4882a593Smuzhiyun if (sbi->s_blocks_per_group == clustersize << 3)
4610*4882a593Smuzhiyun set_opt2(sb, STD_GROUP_SIZE);
4611*4882a593Smuzhiyun
4612*4882a593Smuzhiyun /*
4613*4882a593Smuzhiyun * Test whether we have more sectors than will fit in sector_t,
4614*4882a593Smuzhiyun * and whether the max offset is addressable by the page cache.
4615*4882a593Smuzhiyun */
4616*4882a593Smuzhiyun err = generic_check_addressable(sb->s_blocksize_bits,
4617*4882a593Smuzhiyun ext4_blocks_count(es));
4618*4882a593Smuzhiyun if (err) {
4619*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "filesystem"
4620*4882a593Smuzhiyun " too large to mount safely on this system");
4621*4882a593Smuzhiyun goto failed_mount;
4622*4882a593Smuzhiyun }
4623*4882a593Smuzhiyun
4624*4882a593Smuzhiyun if (EXT4_BLOCKS_PER_GROUP(sb) == 0)
4625*4882a593Smuzhiyun goto cantfind_ext4;
4626*4882a593Smuzhiyun
4627*4882a593Smuzhiyun /* check blocks count against device size */
4628*4882a593Smuzhiyun blocks_count = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
4629*4882a593Smuzhiyun if (blocks_count && ext4_blocks_count(es) > blocks_count) {
4630*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "bad geometry: block count %llu "
4631*4882a593Smuzhiyun "exceeds size of device (%llu blocks)",
4632*4882a593Smuzhiyun ext4_blocks_count(es), blocks_count);
4633*4882a593Smuzhiyun goto failed_mount;
4634*4882a593Smuzhiyun }
4635*4882a593Smuzhiyun
4636*4882a593Smuzhiyun /*
4637*4882a593Smuzhiyun * It makes no sense for the first data block to be beyond the end
4638*4882a593Smuzhiyun * of the filesystem.
4639*4882a593Smuzhiyun */
4640*4882a593Smuzhiyun if (le32_to_cpu(es->s_first_data_block) >= ext4_blocks_count(es)) {
4641*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "bad geometry: first data "
4642*4882a593Smuzhiyun "block %u is beyond end of filesystem (%llu)",
4643*4882a593Smuzhiyun le32_to_cpu(es->s_first_data_block),
4644*4882a593Smuzhiyun ext4_blocks_count(es));
4645*4882a593Smuzhiyun goto failed_mount;
4646*4882a593Smuzhiyun }
4647*4882a593Smuzhiyun if ((es->s_first_data_block == 0) && (es->s_log_block_size == 0) &&
4648*4882a593Smuzhiyun (sbi->s_cluster_ratio == 1)) {
4649*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "bad geometry: first data "
4650*4882a593Smuzhiyun "block is 0 with a 1k block and cluster size");
4651*4882a593Smuzhiyun goto failed_mount;
4652*4882a593Smuzhiyun }
4653*4882a593Smuzhiyun
4654*4882a593Smuzhiyun blocks_count = (ext4_blocks_count(es) -
4655*4882a593Smuzhiyun le32_to_cpu(es->s_first_data_block) +
4656*4882a593Smuzhiyun EXT4_BLOCKS_PER_GROUP(sb) - 1);
4657*4882a593Smuzhiyun do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb));
4658*4882a593Smuzhiyun if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
4659*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "groups count too large: %llu "
4660*4882a593Smuzhiyun "(block count %llu, first data block %u, "
4661*4882a593Smuzhiyun "blocks per group %lu)", blocks_count,
4662*4882a593Smuzhiyun ext4_blocks_count(es),
4663*4882a593Smuzhiyun le32_to_cpu(es->s_first_data_block),
4664*4882a593Smuzhiyun EXT4_BLOCKS_PER_GROUP(sb));
4665*4882a593Smuzhiyun goto failed_mount;
4666*4882a593Smuzhiyun }
4667*4882a593Smuzhiyun sbi->s_groups_count = blocks_count;
4668*4882a593Smuzhiyun sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,
4669*4882a593Smuzhiyun (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));
4670*4882a593Smuzhiyun if (((u64)sbi->s_groups_count * sbi->s_inodes_per_group) !=
4671*4882a593Smuzhiyun le32_to_cpu(es->s_inodes_count)) {
4672*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "inodes count not valid: %u vs %llu",
4673*4882a593Smuzhiyun le32_to_cpu(es->s_inodes_count),
4674*4882a593Smuzhiyun ((u64)sbi->s_groups_count * sbi->s_inodes_per_group));
4675*4882a593Smuzhiyun ret = -EINVAL;
4676*4882a593Smuzhiyun goto failed_mount;
4677*4882a593Smuzhiyun }
4678*4882a593Smuzhiyun db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
4679*4882a593Smuzhiyun EXT4_DESC_PER_BLOCK(sb);
4680*4882a593Smuzhiyun if (ext4_has_feature_meta_bg(sb)) {
4681*4882a593Smuzhiyun if (le32_to_cpu(es->s_first_meta_bg) > db_count) {
4682*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
4683*4882a593Smuzhiyun "first meta block group too large: %u "
4684*4882a593Smuzhiyun "(group descriptor block count %u)",
4685*4882a593Smuzhiyun le32_to_cpu(es->s_first_meta_bg), db_count);
4686*4882a593Smuzhiyun goto failed_mount;
4687*4882a593Smuzhiyun }
4688*4882a593Smuzhiyun }
4689*4882a593Smuzhiyun rcu_assign_pointer(sbi->s_group_desc,
4690*4882a593Smuzhiyun kvmalloc_array(db_count,
4691*4882a593Smuzhiyun sizeof(struct buffer_head *),
4692*4882a593Smuzhiyun GFP_KERNEL));
4693*4882a593Smuzhiyun if (sbi->s_group_desc == NULL) {
4694*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "not enough memory");
4695*4882a593Smuzhiyun ret = -ENOMEM;
4696*4882a593Smuzhiyun goto failed_mount;
4697*4882a593Smuzhiyun }
4698*4882a593Smuzhiyun
4699*4882a593Smuzhiyun bgl_lock_init(sbi->s_blockgroup_lock);
4700*4882a593Smuzhiyun
4701*4882a593Smuzhiyun /* Pre-read the descriptors into the buffer cache */
4702*4882a593Smuzhiyun for (i = 0; i < db_count; i++) {
4703*4882a593Smuzhiyun block = descriptor_loc(sb, logical_sb_block, i);
4704*4882a593Smuzhiyun ext4_sb_breadahead_unmovable(sb, block);
4705*4882a593Smuzhiyun }
4706*4882a593Smuzhiyun
4707*4882a593Smuzhiyun for (i = 0; i < db_count; i++) {
4708*4882a593Smuzhiyun struct buffer_head *bh;
4709*4882a593Smuzhiyun
4710*4882a593Smuzhiyun block = descriptor_loc(sb, logical_sb_block, i);
4711*4882a593Smuzhiyun bh = ext4_sb_bread_unmovable(sb, block);
4712*4882a593Smuzhiyun if (IS_ERR(bh)) {
4713*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4714*4882a593Smuzhiyun "can't read group descriptor %d", i);
4715*4882a593Smuzhiyun db_count = i;
4716*4882a593Smuzhiyun ret = PTR_ERR(bh);
4717*4882a593Smuzhiyun bh = NULL;
4718*4882a593Smuzhiyun goto failed_mount2;
4719*4882a593Smuzhiyun }
4720*4882a593Smuzhiyun rcu_read_lock();
4721*4882a593Smuzhiyun rcu_dereference(sbi->s_group_desc)[i] = bh;
4722*4882a593Smuzhiyun rcu_read_unlock();
4723*4882a593Smuzhiyun }
4724*4882a593Smuzhiyun sbi->s_gdb_count = db_count;
4725*4882a593Smuzhiyun if (!ext4_check_descriptors(sb, logical_sb_block, &first_not_zeroed)) {
4726*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "group descriptors corrupted!");
4727*4882a593Smuzhiyun ret = -EFSCORRUPTED;
4728*4882a593Smuzhiyun goto failed_mount2;
4729*4882a593Smuzhiyun }
4730*4882a593Smuzhiyun
4731*4882a593Smuzhiyun timer_setup(&sbi->s_err_report, print_daily_error_info, 0);
4732*4882a593Smuzhiyun
4733*4882a593Smuzhiyun /* Register extent status tree shrinker */
4734*4882a593Smuzhiyun if (ext4_es_register_shrinker(sbi))
4735*4882a593Smuzhiyun goto failed_mount3;
4736*4882a593Smuzhiyun
4737*4882a593Smuzhiyun sbi->s_stripe = ext4_get_stripe_size(sbi);
4738*4882a593Smuzhiyun sbi->s_extent_max_zeroout_kb = 32;
4739*4882a593Smuzhiyun
4740*4882a593Smuzhiyun /*
4741*4882a593Smuzhiyun * set up enough so that it can read an inode
4742*4882a593Smuzhiyun */
4743*4882a593Smuzhiyun sb->s_op = &ext4_sops;
4744*4882a593Smuzhiyun sb->s_export_op = &ext4_export_ops;
4745*4882a593Smuzhiyun sb->s_xattr = ext4_xattr_handlers;
4746*4882a593Smuzhiyun #ifdef CONFIG_FS_ENCRYPTION
4747*4882a593Smuzhiyun sb->s_cop = &ext4_cryptops;
4748*4882a593Smuzhiyun #endif
4749*4882a593Smuzhiyun #ifdef CONFIG_FS_VERITY
4750*4882a593Smuzhiyun sb->s_vop = &ext4_verityops;
4751*4882a593Smuzhiyun #endif
4752*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
4753*4882a593Smuzhiyun sb->dq_op = &ext4_quota_operations;
4754*4882a593Smuzhiyun if (ext4_has_feature_quota(sb))
4755*4882a593Smuzhiyun sb->s_qcop = &dquot_quotactl_sysfile_ops;
4756*4882a593Smuzhiyun else
4757*4882a593Smuzhiyun sb->s_qcop = &ext4_qctl_operations;
4758*4882a593Smuzhiyun sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
4759*4882a593Smuzhiyun #endif
4760*4882a593Smuzhiyun memcpy(&sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
4761*4882a593Smuzhiyun
4762*4882a593Smuzhiyun INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
4763*4882a593Smuzhiyun mutex_init(&sbi->s_orphan_lock);
4764*4882a593Smuzhiyun
4765*4882a593Smuzhiyun /* Initialize fast commit stuff */
4766*4882a593Smuzhiyun atomic_set(&sbi->s_fc_subtid, 0);
4767*4882a593Smuzhiyun atomic_set(&sbi->s_fc_ineligible_updates, 0);
4768*4882a593Smuzhiyun INIT_LIST_HEAD(&sbi->s_fc_q[FC_Q_MAIN]);
4769*4882a593Smuzhiyun INIT_LIST_HEAD(&sbi->s_fc_q[FC_Q_STAGING]);
4770*4882a593Smuzhiyun INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_MAIN]);
4771*4882a593Smuzhiyun INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_STAGING]);
4772*4882a593Smuzhiyun sbi->s_fc_bytes = 0;
4773*4882a593Smuzhiyun ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
4774*4882a593Smuzhiyun ext4_clear_mount_flag(sb, EXT4_MF_FC_COMMITTING);
4775*4882a593Smuzhiyun spin_lock_init(&sbi->s_fc_lock);
4776*4882a593Smuzhiyun memset(&sbi->s_fc_stats, 0, sizeof(sbi->s_fc_stats));
4777*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_regions = NULL;
4778*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_regions_size = 0;
4779*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_regions_used = 0;
4780*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_regions_valid = 0;
4781*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_modified_inodes = NULL;
4782*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_modified_inodes_size = 0;
4783*4882a593Smuzhiyun sbi->s_fc_replay_state.fc_modified_inodes_used = 0;
4784*4882a593Smuzhiyun
4785*4882a593Smuzhiyun sb->s_root = NULL;
4786*4882a593Smuzhiyun
4787*4882a593Smuzhiyun needs_recovery = (es->s_last_orphan != 0 ||
4788*4882a593Smuzhiyun ext4_has_feature_journal_needs_recovery(sb));
4789*4882a593Smuzhiyun
4790*4882a593Smuzhiyun if (ext4_has_feature_mmp(sb) && !sb_rdonly(sb))
4791*4882a593Smuzhiyun if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block)))
4792*4882a593Smuzhiyun goto failed_mount3a;
4793*4882a593Smuzhiyun
4794*4882a593Smuzhiyun /*
4795*4882a593Smuzhiyun * The first inode we look at is the journal inode. Don't try
4796*4882a593Smuzhiyun * root first: it may be modified in the journal!
4797*4882a593Smuzhiyun */
4798*4882a593Smuzhiyun if (!test_opt(sb, NOLOAD) && ext4_has_feature_journal(sb)) {
4799*4882a593Smuzhiyun err = ext4_load_journal(sb, es, journal_devnum);
4800*4882a593Smuzhiyun if (err)
4801*4882a593Smuzhiyun goto failed_mount3a;
4802*4882a593Smuzhiyun } else if (test_opt(sb, NOLOAD) && !sb_rdonly(sb) &&
4803*4882a593Smuzhiyun ext4_has_feature_journal_needs_recovery(sb)) {
4804*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "required journal recovery "
4805*4882a593Smuzhiyun "suppressed and not mounted read-only");
4806*4882a593Smuzhiyun goto failed_mount_wq;
4807*4882a593Smuzhiyun } else {
4808*4882a593Smuzhiyun /* Nojournal mode, all journal mount options are illegal */
4809*4882a593Smuzhiyun if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) {
4810*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4811*4882a593Smuzhiyun "journal_checksum, fs mounted w/o journal");
4812*4882a593Smuzhiyun goto failed_mount_wq;
4813*4882a593Smuzhiyun }
4814*4882a593Smuzhiyun if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
4815*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4816*4882a593Smuzhiyun "journal_async_commit, fs mounted w/o journal");
4817*4882a593Smuzhiyun goto failed_mount_wq;
4818*4882a593Smuzhiyun }
4819*4882a593Smuzhiyun if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) {
4820*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4821*4882a593Smuzhiyun "commit=%lu, fs mounted w/o journal",
4822*4882a593Smuzhiyun sbi->s_commit_interval / HZ);
4823*4882a593Smuzhiyun goto failed_mount_wq;
4824*4882a593Smuzhiyun }
4825*4882a593Smuzhiyun if (EXT4_MOUNT_DATA_FLAGS &
4826*4882a593Smuzhiyun (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) {
4827*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4828*4882a593Smuzhiyun "data=, fs mounted w/o journal");
4829*4882a593Smuzhiyun goto failed_mount_wq;
4830*4882a593Smuzhiyun }
4831*4882a593Smuzhiyun sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM;
4832*4882a593Smuzhiyun clear_opt(sb, JOURNAL_CHECKSUM);
4833*4882a593Smuzhiyun clear_opt(sb, DATA_FLAGS);
4834*4882a593Smuzhiyun clear_opt2(sb, JOURNAL_FAST_COMMIT);
4835*4882a593Smuzhiyun sbi->s_journal = NULL;
4836*4882a593Smuzhiyun needs_recovery = 0;
4837*4882a593Smuzhiyun goto no_journal;
4838*4882a593Smuzhiyun }
4839*4882a593Smuzhiyun
4840*4882a593Smuzhiyun if (ext4_has_feature_64bit(sb) &&
4841*4882a593Smuzhiyun !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
4842*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_64BIT)) {
4843*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature");
4844*4882a593Smuzhiyun goto failed_mount_wq;
4845*4882a593Smuzhiyun }
4846*4882a593Smuzhiyun
4847*4882a593Smuzhiyun if (!set_journal_csum_feature_set(sb)) {
4848*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Failed to set journal checksum "
4849*4882a593Smuzhiyun "feature set");
4850*4882a593Smuzhiyun goto failed_mount_wq;
4851*4882a593Smuzhiyun }
4852*4882a593Smuzhiyun
4853*4882a593Smuzhiyun if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&
4854*4882a593Smuzhiyun !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
4855*4882a593Smuzhiyun JBD2_FEATURE_INCOMPAT_FAST_COMMIT)) {
4856*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4857*4882a593Smuzhiyun "Failed to set fast commit journal feature");
4858*4882a593Smuzhiyun goto failed_mount_wq;
4859*4882a593Smuzhiyun }
4860*4882a593Smuzhiyun
4861*4882a593Smuzhiyun /* We have now updated the journal if required, so we can
4862*4882a593Smuzhiyun * validate the data journaling mode. */
4863*4882a593Smuzhiyun switch (test_opt(sb, DATA_FLAGS)) {
4864*4882a593Smuzhiyun case 0:
4865*4882a593Smuzhiyun /* No mode set, assume a default based on the journal
4866*4882a593Smuzhiyun * capabilities: ORDERED_DATA if the journal can
4867*4882a593Smuzhiyun * cope, else JOURNAL_DATA
4868*4882a593Smuzhiyun */
4869*4882a593Smuzhiyun if (jbd2_journal_check_available_features
4870*4882a593Smuzhiyun (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
4871*4882a593Smuzhiyun set_opt(sb, ORDERED_DATA);
4872*4882a593Smuzhiyun sbi->s_def_mount_opt |= EXT4_MOUNT_ORDERED_DATA;
4873*4882a593Smuzhiyun } else {
4874*4882a593Smuzhiyun set_opt(sb, JOURNAL_DATA);
4875*4882a593Smuzhiyun sbi->s_def_mount_opt |= EXT4_MOUNT_JOURNAL_DATA;
4876*4882a593Smuzhiyun }
4877*4882a593Smuzhiyun break;
4878*4882a593Smuzhiyun
4879*4882a593Smuzhiyun case EXT4_MOUNT_ORDERED_DATA:
4880*4882a593Smuzhiyun case EXT4_MOUNT_WRITEBACK_DATA:
4881*4882a593Smuzhiyun if (!jbd2_journal_check_available_features
4882*4882a593Smuzhiyun (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
4883*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Journal does not support "
4884*4882a593Smuzhiyun "requested data journaling mode");
4885*4882a593Smuzhiyun goto failed_mount_wq;
4886*4882a593Smuzhiyun }
4887*4882a593Smuzhiyun default:
4888*4882a593Smuzhiyun break;
4889*4882a593Smuzhiyun }
4890*4882a593Smuzhiyun
4891*4882a593Smuzhiyun if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA &&
4892*4882a593Smuzhiyun test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
4893*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
4894*4882a593Smuzhiyun "journal_async_commit in data=ordered mode");
4895*4882a593Smuzhiyun goto failed_mount_wq;
4896*4882a593Smuzhiyun }
4897*4882a593Smuzhiyun
4898*4882a593Smuzhiyun set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);
4899*4882a593Smuzhiyun
4900*4882a593Smuzhiyun sbi->s_journal->j_submit_inode_data_buffers =
4901*4882a593Smuzhiyun ext4_journal_submit_inode_data_buffers;
4902*4882a593Smuzhiyun sbi->s_journal->j_finish_inode_data_buffers =
4903*4882a593Smuzhiyun ext4_journal_finish_inode_data_buffers;
4904*4882a593Smuzhiyun
4905*4882a593Smuzhiyun no_journal:
4906*4882a593Smuzhiyun if (!test_opt(sb, NO_MBCACHE)) {
4907*4882a593Smuzhiyun sbi->s_ea_block_cache = ext4_xattr_create_cache();
4908*4882a593Smuzhiyun if (!sbi->s_ea_block_cache) {
4909*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4910*4882a593Smuzhiyun "Failed to create ea_block_cache");
4911*4882a593Smuzhiyun goto failed_mount_wq;
4912*4882a593Smuzhiyun }
4913*4882a593Smuzhiyun
4914*4882a593Smuzhiyun if (ext4_has_feature_ea_inode(sb)) {
4915*4882a593Smuzhiyun sbi->s_ea_inode_cache = ext4_xattr_create_cache();
4916*4882a593Smuzhiyun if (!sbi->s_ea_inode_cache) {
4917*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
4918*4882a593Smuzhiyun "Failed to create ea_inode_cache");
4919*4882a593Smuzhiyun goto failed_mount_wq;
4920*4882a593Smuzhiyun }
4921*4882a593Smuzhiyun }
4922*4882a593Smuzhiyun }
4923*4882a593Smuzhiyun
4924*4882a593Smuzhiyun if (ext4_has_feature_verity(sb) && blocksize != PAGE_SIZE) {
4925*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Unsupported blocksize for fs-verity");
4926*4882a593Smuzhiyun goto failed_mount_wq;
4927*4882a593Smuzhiyun }
4928*4882a593Smuzhiyun
4929*4882a593Smuzhiyun /*
4930*4882a593Smuzhiyun * Get the # of file system overhead blocks from the
4931*4882a593Smuzhiyun * superblock if present.
4932*4882a593Smuzhiyun */
4933*4882a593Smuzhiyun sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters);
4934*4882a593Smuzhiyun /* ignore the precalculated value if it is ridiculous */
4935*4882a593Smuzhiyun if (sbi->s_overhead > ext4_blocks_count(es))
4936*4882a593Smuzhiyun sbi->s_overhead = 0;
4937*4882a593Smuzhiyun /*
4938*4882a593Smuzhiyun * If the bigalloc feature is not enabled recalculating the
4939*4882a593Smuzhiyun * overhead doesn't take long, so we might as well just redo
4940*4882a593Smuzhiyun * it to make sure we are using the correct value.
4941*4882a593Smuzhiyun */
4942*4882a593Smuzhiyun if (!ext4_has_feature_bigalloc(sb))
4943*4882a593Smuzhiyun sbi->s_overhead = 0;
4944*4882a593Smuzhiyun if (sbi->s_overhead == 0) {
4945*4882a593Smuzhiyun err = ext4_calculate_overhead(sb);
4946*4882a593Smuzhiyun if (err)
4947*4882a593Smuzhiyun goto failed_mount_wq;
4948*4882a593Smuzhiyun }
4949*4882a593Smuzhiyun
4950*4882a593Smuzhiyun /*
4951*4882a593Smuzhiyun * The maximum number of concurrent works can be high and
4952*4882a593Smuzhiyun * concurrency isn't really necessary. Limit it to 1.
4953*4882a593Smuzhiyun */
4954*4882a593Smuzhiyun EXT4_SB(sb)->rsv_conversion_wq =
4955*4882a593Smuzhiyun alloc_workqueue("ext4-rsv-conversion", WQ_MEM_RECLAIM | WQ_UNBOUND, 1);
4956*4882a593Smuzhiyun if (!EXT4_SB(sb)->rsv_conversion_wq) {
4957*4882a593Smuzhiyun printk(KERN_ERR "EXT4-fs: failed to create workqueue\n");
4958*4882a593Smuzhiyun ret = -ENOMEM;
4959*4882a593Smuzhiyun goto failed_mount4;
4960*4882a593Smuzhiyun }
4961*4882a593Smuzhiyun
4962*4882a593Smuzhiyun /*
4963*4882a593Smuzhiyun * The jbd2_journal_load will have done any necessary log recovery,
4964*4882a593Smuzhiyun * so we can safely mount the rest of the filesystem now.
4965*4882a593Smuzhiyun */
4966*4882a593Smuzhiyun
4967*4882a593Smuzhiyun root = ext4_iget(sb, EXT4_ROOT_INO, EXT4_IGET_SPECIAL);
4968*4882a593Smuzhiyun if (IS_ERR(root)) {
4969*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "get root inode failed");
4970*4882a593Smuzhiyun ret = PTR_ERR(root);
4971*4882a593Smuzhiyun root = NULL;
4972*4882a593Smuzhiyun goto failed_mount4;
4973*4882a593Smuzhiyun }
4974*4882a593Smuzhiyun if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
4975*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");
4976*4882a593Smuzhiyun iput(root);
4977*4882a593Smuzhiyun goto failed_mount4;
4978*4882a593Smuzhiyun }
4979*4882a593Smuzhiyun
4980*4882a593Smuzhiyun sb->s_root = d_make_root(root);
4981*4882a593Smuzhiyun if (!sb->s_root) {
4982*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "get root dentry failed");
4983*4882a593Smuzhiyun ret = -ENOMEM;
4984*4882a593Smuzhiyun goto failed_mount4;
4985*4882a593Smuzhiyun }
4986*4882a593Smuzhiyun
4987*4882a593Smuzhiyun ret = ext4_setup_super(sb, es, sb_rdonly(sb));
4988*4882a593Smuzhiyun if (ret == -EROFS) {
4989*4882a593Smuzhiyun sb->s_flags |= SB_RDONLY;
4990*4882a593Smuzhiyun ret = 0;
4991*4882a593Smuzhiyun } else if (ret)
4992*4882a593Smuzhiyun goto failed_mount4a;
4993*4882a593Smuzhiyun
4994*4882a593Smuzhiyun ext4_set_resv_clusters(sb);
4995*4882a593Smuzhiyun
4996*4882a593Smuzhiyun if (test_opt(sb, BLOCK_VALIDITY)) {
4997*4882a593Smuzhiyun err = ext4_setup_system_zone(sb);
4998*4882a593Smuzhiyun if (err) {
4999*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "failed to initialize system "
5000*4882a593Smuzhiyun "zone (%d)", err);
5001*4882a593Smuzhiyun goto failed_mount4a;
5002*4882a593Smuzhiyun }
5003*4882a593Smuzhiyun }
5004*4882a593Smuzhiyun ext4_fc_replay_cleanup(sb);
5005*4882a593Smuzhiyun
5006*4882a593Smuzhiyun ext4_ext_init(sb);
5007*4882a593Smuzhiyun err = ext4_mb_init(sb);
5008*4882a593Smuzhiyun if (err) {
5009*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)",
5010*4882a593Smuzhiyun err);
5011*4882a593Smuzhiyun goto failed_mount5;
5012*4882a593Smuzhiyun }
5013*4882a593Smuzhiyun
5014*4882a593Smuzhiyun /*
5015*4882a593Smuzhiyun * We can only set up the journal commit callback once
5016*4882a593Smuzhiyun * mballoc is initialized
5017*4882a593Smuzhiyun */
5018*4882a593Smuzhiyun if (sbi->s_journal)
5019*4882a593Smuzhiyun sbi->s_journal->j_commit_callback =
5020*4882a593Smuzhiyun ext4_journal_commit_callback;
5021*4882a593Smuzhiyun
5022*4882a593Smuzhiyun block = ext4_count_free_clusters(sb);
5023*4882a593Smuzhiyun ext4_free_blocks_count_set(sbi->s_es,
5024*4882a593Smuzhiyun EXT4_C2B(sbi, block));
5025*4882a593Smuzhiyun ext4_superblock_csum_set(sb);
5026*4882a593Smuzhiyun err = percpu_counter_init(&sbi->s_freeclusters_counter, block,
5027*4882a593Smuzhiyun GFP_KERNEL);
5028*4882a593Smuzhiyun if (!err) {
5029*4882a593Smuzhiyun unsigned long freei = ext4_count_free_inodes(sb);
5030*4882a593Smuzhiyun sbi->s_es->s_free_inodes_count = cpu_to_le32(freei);
5031*4882a593Smuzhiyun ext4_superblock_csum_set(sb);
5032*4882a593Smuzhiyun err = percpu_counter_init(&sbi->s_freeinodes_counter, freei,
5033*4882a593Smuzhiyun GFP_KERNEL);
5034*4882a593Smuzhiyun }
5035*4882a593Smuzhiyun if (!err)
5036*4882a593Smuzhiyun err = percpu_counter_init(&sbi->s_dirs_counter,
5037*4882a593Smuzhiyun ext4_count_dirs(sb), GFP_KERNEL);
5038*4882a593Smuzhiyun if (!err)
5039*4882a593Smuzhiyun err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0,
5040*4882a593Smuzhiyun GFP_KERNEL);
5041*4882a593Smuzhiyun if (!err)
5042*4882a593Smuzhiyun err = percpu_counter_init(&sbi->s_sra_exceeded_retry_limit, 0,
5043*4882a593Smuzhiyun GFP_KERNEL);
5044*4882a593Smuzhiyun if (!err)
5045*4882a593Smuzhiyun err = percpu_init_rwsem(&sbi->s_writepages_rwsem);
5046*4882a593Smuzhiyun
5047*4882a593Smuzhiyun if (err) {
5048*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "insufficient memory");
5049*4882a593Smuzhiyun goto failed_mount6;
5050*4882a593Smuzhiyun }
5051*4882a593Smuzhiyun
5052*4882a593Smuzhiyun if (ext4_has_feature_flex_bg(sb))
5053*4882a593Smuzhiyun if (!ext4_fill_flex_info(sb)) {
5054*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
5055*4882a593Smuzhiyun "unable to initialize "
5056*4882a593Smuzhiyun "flex_bg meta info!");
5057*4882a593Smuzhiyun ret = -ENOMEM;
5058*4882a593Smuzhiyun goto failed_mount6;
5059*4882a593Smuzhiyun }
5060*4882a593Smuzhiyun
5061*4882a593Smuzhiyun err = ext4_register_li_request(sb, first_not_zeroed);
5062*4882a593Smuzhiyun if (err)
5063*4882a593Smuzhiyun goto failed_mount6;
5064*4882a593Smuzhiyun
5065*4882a593Smuzhiyun err = ext4_register_sysfs(sb);
5066*4882a593Smuzhiyun if (err)
5067*4882a593Smuzhiyun goto failed_mount7;
5068*4882a593Smuzhiyun
5069*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
5070*4882a593Smuzhiyun /* Enable quota usage during mount. */
5071*4882a593Smuzhiyun if (ext4_has_feature_quota(sb) && !sb_rdonly(sb)) {
5072*4882a593Smuzhiyun err = ext4_enable_quotas(sb);
5073*4882a593Smuzhiyun if (err)
5074*4882a593Smuzhiyun goto failed_mount8;
5075*4882a593Smuzhiyun }
5076*4882a593Smuzhiyun #endif /* CONFIG_QUOTA */
5077*4882a593Smuzhiyun
5078*4882a593Smuzhiyun /*
5079*4882a593Smuzhiyun * Save the original bdev mapping's wb_err value which could be
5080*4882a593Smuzhiyun * used to detect the metadata async write error.
5081*4882a593Smuzhiyun */
5082*4882a593Smuzhiyun spin_lock_init(&sbi->s_bdev_wb_lock);
5083*4882a593Smuzhiyun errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
5084*4882a593Smuzhiyun &sbi->s_bdev_wb_err);
5085*4882a593Smuzhiyun sb->s_bdev->bd_super = sb;
5086*4882a593Smuzhiyun EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
5087*4882a593Smuzhiyun ext4_orphan_cleanup(sb, es);
5088*4882a593Smuzhiyun EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
5089*4882a593Smuzhiyun if (needs_recovery) {
5090*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "recovery complete");
5091*4882a593Smuzhiyun err = ext4_mark_recovery_complete(sb, es);
5092*4882a593Smuzhiyun if (err)
5093*4882a593Smuzhiyun goto failed_mount8;
5094*4882a593Smuzhiyun }
5095*4882a593Smuzhiyun if (EXT4_SB(sb)->s_journal) {
5096*4882a593Smuzhiyun if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
5097*4882a593Smuzhiyun descr = " journalled data mode";
5098*4882a593Smuzhiyun else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA)
5099*4882a593Smuzhiyun descr = " ordered data mode";
5100*4882a593Smuzhiyun else
5101*4882a593Smuzhiyun descr = " writeback data mode";
5102*4882a593Smuzhiyun } else
5103*4882a593Smuzhiyun descr = "out journal";
5104*4882a593Smuzhiyun
5105*4882a593Smuzhiyun if (test_opt(sb, DISCARD)) {
5106*4882a593Smuzhiyun struct request_queue *q = bdev_get_queue(sb->s_bdev);
5107*4882a593Smuzhiyun if (!blk_queue_discard(q))
5108*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
5109*4882a593Smuzhiyun "mounting with \"discard\" option, but "
5110*4882a593Smuzhiyun "the device does not support discard");
5111*4882a593Smuzhiyun }
5112*4882a593Smuzhiyun
5113*4882a593Smuzhiyun if (___ratelimit(&ext4_mount_msg_ratelimit, "EXT4-fs mount"))
5114*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "mounted filesystem with%s. "
5115*4882a593Smuzhiyun "Opts: %.*s%s%s", descr,
5116*4882a593Smuzhiyun (int) sizeof(sbi->s_es->s_mount_opts),
5117*4882a593Smuzhiyun sbi->s_es->s_mount_opts,
5118*4882a593Smuzhiyun *sbi->s_es->s_mount_opts ? "; " : "", orig_data);
5119*4882a593Smuzhiyun
5120*4882a593Smuzhiyun if (es->s_error_count)
5121*4882a593Smuzhiyun mod_timer(&sbi->s_err_report, jiffies + 300*HZ); /* 5 minutes */
5122*4882a593Smuzhiyun
5123*4882a593Smuzhiyun /* Enable message ratelimiting. Default is 10 messages per 5 secs. */
5124*4882a593Smuzhiyun ratelimit_state_init(&sbi->s_err_ratelimit_state, 5 * HZ, 10);
5125*4882a593Smuzhiyun ratelimit_state_init(&sbi->s_warning_ratelimit_state, 5 * HZ, 10);
5126*4882a593Smuzhiyun ratelimit_state_init(&sbi->s_msg_ratelimit_state, 5 * HZ, 10);
5127*4882a593Smuzhiyun atomic_set(&sbi->s_warning_count, 0);
5128*4882a593Smuzhiyun atomic_set(&sbi->s_msg_count, 0);
5129*4882a593Smuzhiyun
5130*4882a593Smuzhiyun kfree(orig_data);
5131*4882a593Smuzhiyun return 0;
5132*4882a593Smuzhiyun
5133*4882a593Smuzhiyun cantfind_ext4:
5134*4882a593Smuzhiyun if (!silent)
5135*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "VFS: Can't find ext4 filesystem");
5136*4882a593Smuzhiyun goto failed_mount;
5137*4882a593Smuzhiyun
5138*4882a593Smuzhiyun failed_mount8:
5139*4882a593Smuzhiyun ext4_unregister_sysfs(sb);
5140*4882a593Smuzhiyun kobject_put(&sbi->s_kobj);
5141*4882a593Smuzhiyun failed_mount7:
5142*4882a593Smuzhiyun ext4_unregister_li_request(sb);
5143*4882a593Smuzhiyun failed_mount6:
5144*4882a593Smuzhiyun ext4_mb_release(sb);
5145*4882a593Smuzhiyun rcu_read_lock();
5146*4882a593Smuzhiyun flex_groups = rcu_dereference(sbi->s_flex_groups);
5147*4882a593Smuzhiyun if (flex_groups) {
5148*4882a593Smuzhiyun for (i = 0; i < sbi->s_flex_groups_allocated; i++)
5149*4882a593Smuzhiyun kvfree(flex_groups[i]);
5150*4882a593Smuzhiyun kvfree(flex_groups);
5151*4882a593Smuzhiyun }
5152*4882a593Smuzhiyun rcu_read_unlock();
5153*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_freeclusters_counter);
5154*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_freeinodes_counter);
5155*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_dirs_counter);
5156*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_dirtyclusters_counter);
5157*4882a593Smuzhiyun percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit);
5158*4882a593Smuzhiyun percpu_free_rwsem(&sbi->s_writepages_rwsem);
5159*4882a593Smuzhiyun failed_mount5:
5160*4882a593Smuzhiyun ext4_ext_release(sb);
5161*4882a593Smuzhiyun ext4_release_system_zone(sb);
5162*4882a593Smuzhiyun failed_mount4a:
5163*4882a593Smuzhiyun dput(sb->s_root);
5164*4882a593Smuzhiyun sb->s_root = NULL;
5165*4882a593Smuzhiyun failed_mount4:
5166*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "mount failed");
5167*4882a593Smuzhiyun if (EXT4_SB(sb)->rsv_conversion_wq)
5168*4882a593Smuzhiyun destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq);
5169*4882a593Smuzhiyun failed_mount_wq:
5170*4882a593Smuzhiyun ext4_xattr_destroy_cache(sbi->s_ea_inode_cache);
5171*4882a593Smuzhiyun sbi->s_ea_inode_cache = NULL;
5172*4882a593Smuzhiyun
5173*4882a593Smuzhiyun ext4_xattr_destroy_cache(sbi->s_ea_block_cache);
5174*4882a593Smuzhiyun sbi->s_ea_block_cache = NULL;
5175*4882a593Smuzhiyun
5176*4882a593Smuzhiyun if (sbi->s_journal) {
5177*4882a593Smuzhiyun jbd2_journal_destroy(sbi->s_journal);
5178*4882a593Smuzhiyun sbi->s_journal = NULL;
5179*4882a593Smuzhiyun }
5180*4882a593Smuzhiyun failed_mount3a:
5181*4882a593Smuzhiyun ext4_es_unregister_shrinker(sbi);
5182*4882a593Smuzhiyun failed_mount3:
5183*4882a593Smuzhiyun del_timer_sync(&sbi->s_err_report);
5184*4882a593Smuzhiyun ext4_stop_mmpd(sbi);
5185*4882a593Smuzhiyun failed_mount2:
5186*4882a593Smuzhiyun rcu_read_lock();
5187*4882a593Smuzhiyun group_desc = rcu_dereference(sbi->s_group_desc);
5188*4882a593Smuzhiyun for (i = 0; i < db_count; i++)
5189*4882a593Smuzhiyun brelse(group_desc[i]);
5190*4882a593Smuzhiyun kvfree(group_desc);
5191*4882a593Smuzhiyun rcu_read_unlock();
5192*4882a593Smuzhiyun failed_mount:
5193*4882a593Smuzhiyun if (sbi->s_chksum_driver)
5194*4882a593Smuzhiyun crypto_free_shash(sbi->s_chksum_driver);
5195*4882a593Smuzhiyun
5196*4882a593Smuzhiyun #ifdef CONFIG_UNICODE
5197*4882a593Smuzhiyun utf8_unload(sb->s_encoding);
5198*4882a593Smuzhiyun #endif
5199*4882a593Smuzhiyun
5200*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
5201*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++)
5202*4882a593Smuzhiyun kfree(get_qf_name(sb, sbi, i));
5203*4882a593Smuzhiyun #endif
5204*4882a593Smuzhiyun fscrypt_free_dummy_policy(&sbi->s_dummy_enc_policy);
5205*4882a593Smuzhiyun /* ext4_blkdev_remove() calls kill_bdev(), release bh before it. */
5206*4882a593Smuzhiyun brelse(bh);
5207*4882a593Smuzhiyun ext4_blkdev_remove(sbi);
5208*4882a593Smuzhiyun out_fail:
5209*4882a593Smuzhiyun sb->s_fs_info = NULL;
5210*4882a593Smuzhiyun kfree(sbi->s_blockgroup_lock);
5211*4882a593Smuzhiyun out_free_base:
5212*4882a593Smuzhiyun kfree(sbi);
5213*4882a593Smuzhiyun kfree(orig_data);
5214*4882a593Smuzhiyun fs_put_dax(dax_dev);
5215*4882a593Smuzhiyun return err ? err : ret;
5216*4882a593Smuzhiyun }
5217*4882a593Smuzhiyun
5218*4882a593Smuzhiyun /*
5219*4882a593Smuzhiyun * Setup any per-fs journal parameters now. We'll do this both on
5220*4882a593Smuzhiyun * initial mount, once the journal has been initialised but before we've
5221*4882a593Smuzhiyun * done any recovery; and again on any subsequent remount.
5222*4882a593Smuzhiyun */
ext4_init_journal_params(struct super_block * sb,journal_t * journal)5223*4882a593Smuzhiyun static void ext4_init_journal_params(struct super_block *sb, journal_t *journal)
5224*4882a593Smuzhiyun {
5225*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
5226*4882a593Smuzhiyun
5227*4882a593Smuzhiyun journal->j_commit_interval = sbi->s_commit_interval;
5228*4882a593Smuzhiyun journal->j_min_batch_time = sbi->s_min_batch_time;
5229*4882a593Smuzhiyun journal->j_max_batch_time = sbi->s_max_batch_time;
5230*4882a593Smuzhiyun ext4_fc_init(sb, journal);
5231*4882a593Smuzhiyun
5232*4882a593Smuzhiyun write_lock(&journal->j_state_lock);
5233*4882a593Smuzhiyun if (test_opt(sb, BARRIER))
5234*4882a593Smuzhiyun journal->j_flags |= JBD2_BARRIER;
5235*4882a593Smuzhiyun else
5236*4882a593Smuzhiyun journal->j_flags &= ~JBD2_BARRIER;
5237*4882a593Smuzhiyun if (test_opt(sb, DATA_ERR_ABORT))
5238*4882a593Smuzhiyun journal->j_flags |= JBD2_ABORT_ON_SYNCDATA_ERR;
5239*4882a593Smuzhiyun else
5240*4882a593Smuzhiyun journal->j_flags &= ~JBD2_ABORT_ON_SYNCDATA_ERR;
5241*4882a593Smuzhiyun write_unlock(&journal->j_state_lock);
5242*4882a593Smuzhiyun }
5243*4882a593Smuzhiyun
ext4_get_journal_inode(struct super_block * sb,unsigned int journal_inum)5244*4882a593Smuzhiyun static struct inode *ext4_get_journal_inode(struct super_block *sb,
5245*4882a593Smuzhiyun unsigned int journal_inum)
5246*4882a593Smuzhiyun {
5247*4882a593Smuzhiyun struct inode *journal_inode;
5248*4882a593Smuzhiyun
5249*4882a593Smuzhiyun /*
5250*4882a593Smuzhiyun * Test for the existence of a valid inode on disk. Bad things
5251*4882a593Smuzhiyun * happen if we iget() an unused inode, as the subsequent iput()
5252*4882a593Smuzhiyun * will try to delete it.
5253*4882a593Smuzhiyun */
5254*4882a593Smuzhiyun journal_inode = ext4_iget(sb, journal_inum, EXT4_IGET_SPECIAL);
5255*4882a593Smuzhiyun if (IS_ERR(journal_inode)) {
5256*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "no journal found");
5257*4882a593Smuzhiyun return NULL;
5258*4882a593Smuzhiyun }
5259*4882a593Smuzhiyun if (!journal_inode->i_nlink) {
5260*4882a593Smuzhiyun make_bad_inode(journal_inode);
5261*4882a593Smuzhiyun iput(journal_inode);
5262*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "journal inode is deleted");
5263*4882a593Smuzhiyun return NULL;
5264*4882a593Smuzhiyun }
5265*4882a593Smuzhiyun
5266*4882a593Smuzhiyun jbd_debug(2, "Journal inode found at %p: %lld bytes\n",
5267*4882a593Smuzhiyun journal_inode, journal_inode->i_size);
5268*4882a593Smuzhiyun if (!S_ISREG(journal_inode->i_mode)) {
5269*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "invalid journal inode");
5270*4882a593Smuzhiyun iput(journal_inode);
5271*4882a593Smuzhiyun return NULL;
5272*4882a593Smuzhiyun }
5273*4882a593Smuzhiyun return journal_inode;
5274*4882a593Smuzhiyun }
5275*4882a593Smuzhiyun
ext4_get_journal(struct super_block * sb,unsigned int journal_inum)5276*4882a593Smuzhiyun static journal_t *ext4_get_journal(struct super_block *sb,
5277*4882a593Smuzhiyun unsigned int journal_inum)
5278*4882a593Smuzhiyun {
5279*4882a593Smuzhiyun struct inode *journal_inode;
5280*4882a593Smuzhiyun journal_t *journal;
5281*4882a593Smuzhiyun
5282*4882a593Smuzhiyun if (WARN_ON_ONCE(!ext4_has_feature_journal(sb)))
5283*4882a593Smuzhiyun return NULL;
5284*4882a593Smuzhiyun
5285*4882a593Smuzhiyun journal_inode = ext4_get_journal_inode(sb, journal_inum);
5286*4882a593Smuzhiyun if (!journal_inode)
5287*4882a593Smuzhiyun return NULL;
5288*4882a593Smuzhiyun
5289*4882a593Smuzhiyun journal = jbd2_journal_init_inode(journal_inode);
5290*4882a593Smuzhiyun if (!journal) {
5291*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "Could not load journal inode");
5292*4882a593Smuzhiyun iput(journal_inode);
5293*4882a593Smuzhiyun return NULL;
5294*4882a593Smuzhiyun }
5295*4882a593Smuzhiyun journal->j_private = sb;
5296*4882a593Smuzhiyun ext4_init_journal_params(sb, journal);
5297*4882a593Smuzhiyun return journal;
5298*4882a593Smuzhiyun }
5299*4882a593Smuzhiyun
ext4_get_dev_journal(struct super_block * sb,dev_t j_dev)5300*4882a593Smuzhiyun static journal_t *ext4_get_dev_journal(struct super_block *sb,
5301*4882a593Smuzhiyun dev_t j_dev)
5302*4882a593Smuzhiyun {
5303*4882a593Smuzhiyun struct buffer_head *bh;
5304*4882a593Smuzhiyun journal_t *journal;
5305*4882a593Smuzhiyun ext4_fsblk_t start;
5306*4882a593Smuzhiyun ext4_fsblk_t len;
5307*4882a593Smuzhiyun int hblock, blocksize;
5308*4882a593Smuzhiyun ext4_fsblk_t sb_block;
5309*4882a593Smuzhiyun unsigned long offset;
5310*4882a593Smuzhiyun struct ext4_super_block *es;
5311*4882a593Smuzhiyun struct block_device *bdev;
5312*4882a593Smuzhiyun
5313*4882a593Smuzhiyun if (WARN_ON_ONCE(!ext4_has_feature_journal(sb)))
5314*4882a593Smuzhiyun return NULL;
5315*4882a593Smuzhiyun
5316*4882a593Smuzhiyun bdev = ext4_blkdev_get(j_dev, sb);
5317*4882a593Smuzhiyun if (bdev == NULL)
5318*4882a593Smuzhiyun return NULL;
5319*4882a593Smuzhiyun
5320*4882a593Smuzhiyun blocksize = sb->s_blocksize;
5321*4882a593Smuzhiyun hblock = bdev_logical_block_size(bdev);
5322*4882a593Smuzhiyun if (blocksize < hblock) {
5323*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
5324*4882a593Smuzhiyun "blocksize too small for journal device");
5325*4882a593Smuzhiyun goto out_bdev;
5326*4882a593Smuzhiyun }
5327*4882a593Smuzhiyun
5328*4882a593Smuzhiyun sb_block = EXT4_MIN_BLOCK_SIZE / blocksize;
5329*4882a593Smuzhiyun offset = EXT4_MIN_BLOCK_SIZE % blocksize;
5330*4882a593Smuzhiyun set_blocksize(bdev, blocksize);
5331*4882a593Smuzhiyun if (!(bh = __bread(bdev, sb_block, blocksize))) {
5332*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "couldn't read superblock of "
5333*4882a593Smuzhiyun "external journal");
5334*4882a593Smuzhiyun goto out_bdev;
5335*4882a593Smuzhiyun }
5336*4882a593Smuzhiyun
5337*4882a593Smuzhiyun es = (struct ext4_super_block *) (bh->b_data + offset);
5338*4882a593Smuzhiyun if ((le16_to_cpu(es->s_magic) != EXT4_SUPER_MAGIC) ||
5339*4882a593Smuzhiyun !(le32_to_cpu(es->s_feature_incompat) &
5340*4882a593Smuzhiyun EXT4_FEATURE_INCOMPAT_JOURNAL_DEV)) {
5341*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "external journal has "
5342*4882a593Smuzhiyun "bad superblock");
5343*4882a593Smuzhiyun brelse(bh);
5344*4882a593Smuzhiyun goto out_bdev;
5345*4882a593Smuzhiyun }
5346*4882a593Smuzhiyun
5347*4882a593Smuzhiyun if ((le32_to_cpu(es->s_feature_ro_compat) &
5348*4882a593Smuzhiyun EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) &&
5349*4882a593Smuzhiyun es->s_checksum != ext4_superblock_csum(sb, es)) {
5350*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "external journal has "
5351*4882a593Smuzhiyun "corrupt superblock");
5352*4882a593Smuzhiyun brelse(bh);
5353*4882a593Smuzhiyun goto out_bdev;
5354*4882a593Smuzhiyun }
5355*4882a593Smuzhiyun
5356*4882a593Smuzhiyun if (memcmp(EXT4_SB(sb)->s_es->s_journal_uuid, es->s_uuid, 16)) {
5357*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "journal UUID does not match");
5358*4882a593Smuzhiyun brelse(bh);
5359*4882a593Smuzhiyun goto out_bdev;
5360*4882a593Smuzhiyun }
5361*4882a593Smuzhiyun
5362*4882a593Smuzhiyun len = ext4_blocks_count(es);
5363*4882a593Smuzhiyun start = sb_block + 1;
5364*4882a593Smuzhiyun brelse(bh); /* we're done with the superblock */
5365*4882a593Smuzhiyun
5366*4882a593Smuzhiyun journal = jbd2_journal_init_dev(bdev, sb->s_bdev,
5367*4882a593Smuzhiyun start, len, blocksize);
5368*4882a593Smuzhiyun if (!journal) {
5369*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "failed to create device journal");
5370*4882a593Smuzhiyun goto out_bdev;
5371*4882a593Smuzhiyun }
5372*4882a593Smuzhiyun journal->j_private = sb;
5373*4882a593Smuzhiyun if (ext4_read_bh_lock(journal->j_sb_buffer, REQ_META | REQ_PRIO, true)) {
5374*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "I/O error on journal device");
5375*4882a593Smuzhiyun goto out_journal;
5376*4882a593Smuzhiyun }
5377*4882a593Smuzhiyun if (be32_to_cpu(journal->j_superblock->s_nr_users) != 1) {
5378*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "External journal has more than one "
5379*4882a593Smuzhiyun "user (unsupported) - %d",
5380*4882a593Smuzhiyun be32_to_cpu(journal->j_superblock->s_nr_users));
5381*4882a593Smuzhiyun goto out_journal;
5382*4882a593Smuzhiyun }
5383*4882a593Smuzhiyun EXT4_SB(sb)->s_journal_bdev = bdev;
5384*4882a593Smuzhiyun ext4_init_journal_params(sb, journal);
5385*4882a593Smuzhiyun return journal;
5386*4882a593Smuzhiyun
5387*4882a593Smuzhiyun out_journal:
5388*4882a593Smuzhiyun jbd2_journal_destroy(journal);
5389*4882a593Smuzhiyun out_bdev:
5390*4882a593Smuzhiyun ext4_blkdev_put(bdev);
5391*4882a593Smuzhiyun return NULL;
5392*4882a593Smuzhiyun }
5393*4882a593Smuzhiyun
ext4_load_journal(struct super_block * sb,struct ext4_super_block * es,unsigned long journal_devnum)5394*4882a593Smuzhiyun static int ext4_load_journal(struct super_block *sb,
5395*4882a593Smuzhiyun struct ext4_super_block *es,
5396*4882a593Smuzhiyun unsigned long journal_devnum)
5397*4882a593Smuzhiyun {
5398*4882a593Smuzhiyun journal_t *journal;
5399*4882a593Smuzhiyun unsigned int journal_inum = le32_to_cpu(es->s_journal_inum);
5400*4882a593Smuzhiyun dev_t journal_dev;
5401*4882a593Smuzhiyun int err = 0;
5402*4882a593Smuzhiyun int really_read_only;
5403*4882a593Smuzhiyun int journal_dev_ro;
5404*4882a593Smuzhiyun
5405*4882a593Smuzhiyun if (WARN_ON_ONCE(!ext4_has_feature_journal(sb)))
5406*4882a593Smuzhiyun return -EFSCORRUPTED;
5407*4882a593Smuzhiyun
5408*4882a593Smuzhiyun if (journal_devnum &&
5409*4882a593Smuzhiyun journal_devnum != le32_to_cpu(es->s_journal_dev)) {
5410*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "external journal device major/minor "
5411*4882a593Smuzhiyun "numbers have changed");
5412*4882a593Smuzhiyun journal_dev = new_decode_dev(journal_devnum);
5413*4882a593Smuzhiyun } else
5414*4882a593Smuzhiyun journal_dev = new_decode_dev(le32_to_cpu(es->s_journal_dev));
5415*4882a593Smuzhiyun
5416*4882a593Smuzhiyun if (journal_inum && journal_dev) {
5417*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
5418*4882a593Smuzhiyun "filesystem has both journal inode and journal device!");
5419*4882a593Smuzhiyun return -EINVAL;
5420*4882a593Smuzhiyun }
5421*4882a593Smuzhiyun
5422*4882a593Smuzhiyun if (journal_inum) {
5423*4882a593Smuzhiyun journal = ext4_get_journal(sb, journal_inum);
5424*4882a593Smuzhiyun if (!journal)
5425*4882a593Smuzhiyun return -EINVAL;
5426*4882a593Smuzhiyun } else {
5427*4882a593Smuzhiyun journal = ext4_get_dev_journal(sb, journal_dev);
5428*4882a593Smuzhiyun if (!journal)
5429*4882a593Smuzhiyun return -EINVAL;
5430*4882a593Smuzhiyun }
5431*4882a593Smuzhiyun
5432*4882a593Smuzhiyun journal_dev_ro = bdev_read_only(journal->j_dev);
5433*4882a593Smuzhiyun really_read_only = bdev_read_only(sb->s_bdev) | journal_dev_ro;
5434*4882a593Smuzhiyun
5435*4882a593Smuzhiyun if (journal_dev_ro && !sb_rdonly(sb)) {
5436*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
5437*4882a593Smuzhiyun "journal device read-only, try mounting with '-o ro'");
5438*4882a593Smuzhiyun err = -EROFS;
5439*4882a593Smuzhiyun goto err_out;
5440*4882a593Smuzhiyun }
5441*4882a593Smuzhiyun
5442*4882a593Smuzhiyun /*
5443*4882a593Smuzhiyun * Are we loading a blank journal or performing recovery after a
5444*4882a593Smuzhiyun * crash? For recovery, we need to check in advance whether we
5445*4882a593Smuzhiyun * can get read-write access to the device.
5446*4882a593Smuzhiyun */
5447*4882a593Smuzhiyun if (ext4_has_feature_journal_needs_recovery(sb)) {
5448*4882a593Smuzhiyun if (sb_rdonly(sb)) {
5449*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "INFO: recovery "
5450*4882a593Smuzhiyun "required on readonly filesystem");
5451*4882a593Smuzhiyun if (really_read_only) {
5452*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "write access "
5453*4882a593Smuzhiyun "unavailable, cannot proceed "
5454*4882a593Smuzhiyun "(try mounting with noload)");
5455*4882a593Smuzhiyun err = -EROFS;
5456*4882a593Smuzhiyun goto err_out;
5457*4882a593Smuzhiyun }
5458*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "write access will "
5459*4882a593Smuzhiyun "be enabled during recovery");
5460*4882a593Smuzhiyun }
5461*4882a593Smuzhiyun }
5462*4882a593Smuzhiyun
5463*4882a593Smuzhiyun if (!(journal->j_flags & JBD2_BARRIER))
5464*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "barriers disabled");
5465*4882a593Smuzhiyun
5466*4882a593Smuzhiyun if (!ext4_has_feature_journal_needs_recovery(sb))
5467*4882a593Smuzhiyun err = jbd2_journal_wipe(journal, !really_read_only);
5468*4882a593Smuzhiyun if (!err) {
5469*4882a593Smuzhiyun char *save = kmalloc(EXT4_S_ERR_LEN, GFP_KERNEL);
5470*4882a593Smuzhiyun if (save)
5471*4882a593Smuzhiyun memcpy(save, ((char *) es) +
5472*4882a593Smuzhiyun EXT4_S_ERR_START, EXT4_S_ERR_LEN);
5473*4882a593Smuzhiyun err = jbd2_journal_load(journal);
5474*4882a593Smuzhiyun if (save)
5475*4882a593Smuzhiyun memcpy(((char *) es) + EXT4_S_ERR_START,
5476*4882a593Smuzhiyun save, EXT4_S_ERR_LEN);
5477*4882a593Smuzhiyun kfree(save);
5478*4882a593Smuzhiyun }
5479*4882a593Smuzhiyun
5480*4882a593Smuzhiyun if (err) {
5481*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "error loading journal");
5482*4882a593Smuzhiyun goto err_out;
5483*4882a593Smuzhiyun }
5484*4882a593Smuzhiyun
5485*4882a593Smuzhiyun EXT4_SB(sb)->s_journal = journal;
5486*4882a593Smuzhiyun err = ext4_clear_journal_err(sb, es);
5487*4882a593Smuzhiyun if (err) {
5488*4882a593Smuzhiyun EXT4_SB(sb)->s_journal = NULL;
5489*4882a593Smuzhiyun jbd2_journal_destroy(journal);
5490*4882a593Smuzhiyun return err;
5491*4882a593Smuzhiyun }
5492*4882a593Smuzhiyun
5493*4882a593Smuzhiyun if (!really_read_only && journal_devnum &&
5494*4882a593Smuzhiyun journal_devnum != le32_to_cpu(es->s_journal_dev)) {
5495*4882a593Smuzhiyun es->s_journal_dev = cpu_to_le32(journal_devnum);
5496*4882a593Smuzhiyun
5497*4882a593Smuzhiyun /* Make sure we flush the recovery flag to disk. */
5498*4882a593Smuzhiyun ext4_commit_super(sb, 1);
5499*4882a593Smuzhiyun }
5500*4882a593Smuzhiyun
5501*4882a593Smuzhiyun return 0;
5502*4882a593Smuzhiyun
5503*4882a593Smuzhiyun err_out:
5504*4882a593Smuzhiyun jbd2_journal_destroy(journal);
5505*4882a593Smuzhiyun return err;
5506*4882a593Smuzhiyun }
5507*4882a593Smuzhiyun
ext4_commit_super(struct super_block * sb,int sync)5508*4882a593Smuzhiyun static int ext4_commit_super(struct super_block *sb, int sync)
5509*4882a593Smuzhiyun {
5510*4882a593Smuzhiyun struct ext4_super_block *es = EXT4_SB(sb)->s_es;
5511*4882a593Smuzhiyun struct buffer_head *sbh = EXT4_SB(sb)->s_sbh;
5512*4882a593Smuzhiyun int error = 0;
5513*4882a593Smuzhiyun
5514*4882a593Smuzhiyun if (!sbh)
5515*4882a593Smuzhiyun return -EINVAL;
5516*4882a593Smuzhiyun if (block_device_ejected(sb))
5517*4882a593Smuzhiyun return -ENODEV;
5518*4882a593Smuzhiyun
5519*4882a593Smuzhiyun /*
5520*4882a593Smuzhiyun * If the file system is mounted read-only, don't update the
5521*4882a593Smuzhiyun * superblock write time. This avoids updating the superblock
5522*4882a593Smuzhiyun * write time when we are mounting the root file system
5523*4882a593Smuzhiyun * read/only but we need to replay the journal; at that point,
5524*4882a593Smuzhiyun * for people who are east of GMT and who make their clock
5525*4882a593Smuzhiyun * tick in localtime for Windows bug-for-bug compatibility,
5526*4882a593Smuzhiyun * the clock is set in the future, and this will cause e2fsck
5527*4882a593Smuzhiyun * to complain and force a full file system check.
5528*4882a593Smuzhiyun */
5529*4882a593Smuzhiyun if (!(sb->s_flags & SB_RDONLY))
5530*4882a593Smuzhiyun ext4_update_tstamp(es, s_wtime);
5531*4882a593Smuzhiyun if (sb->s_bdev->bd_part)
5532*4882a593Smuzhiyun es->s_kbytes_written =
5533*4882a593Smuzhiyun cpu_to_le64(EXT4_SB(sb)->s_kbytes_written +
5534*4882a593Smuzhiyun ((part_stat_read(sb->s_bdev->bd_part,
5535*4882a593Smuzhiyun sectors[STAT_WRITE]) -
5536*4882a593Smuzhiyun EXT4_SB(sb)->s_sectors_written_start) >> 1));
5537*4882a593Smuzhiyun else
5538*4882a593Smuzhiyun es->s_kbytes_written =
5539*4882a593Smuzhiyun cpu_to_le64(EXT4_SB(sb)->s_kbytes_written);
5540*4882a593Smuzhiyun if (percpu_counter_initialized(&EXT4_SB(sb)->s_freeclusters_counter))
5541*4882a593Smuzhiyun ext4_free_blocks_count_set(es,
5542*4882a593Smuzhiyun EXT4_C2B(EXT4_SB(sb), percpu_counter_sum_positive(
5543*4882a593Smuzhiyun &EXT4_SB(sb)->s_freeclusters_counter)));
5544*4882a593Smuzhiyun if (percpu_counter_initialized(&EXT4_SB(sb)->s_freeinodes_counter))
5545*4882a593Smuzhiyun es->s_free_inodes_count =
5546*4882a593Smuzhiyun cpu_to_le32(percpu_counter_sum_positive(
5547*4882a593Smuzhiyun &EXT4_SB(sb)->s_freeinodes_counter));
5548*4882a593Smuzhiyun BUFFER_TRACE(sbh, "marking dirty");
5549*4882a593Smuzhiyun ext4_superblock_csum_set(sb);
5550*4882a593Smuzhiyun if (sync)
5551*4882a593Smuzhiyun lock_buffer(sbh);
5552*4882a593Smuzhiyun if (buffer_write_io_error(sbh) || !buffer_uptodate(sbh)) {
5553*4882a593Smuzhiyun /*
5554*4882a593Smuzhiyun * Oh, dear. A previous attempt to write the
5555*4882a593Smuzhiyun * superblock failed. This could happen because the
5556*4882a593Smuzhiyun * USB device was yanked out. Or it could happen to
5557*4882a593Smuzhiyun * be a transient write error and maybe the block will
5558*4882a593Smuzhiyun * be remapped. Nothing we can do but to retry the
5559*4882a593Smuzhiyun * write and hope for the best.
5560*4882a593Smuzhiyun */
5561*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "previous I/O error to "
5562*4882a593Smuzhiyun "superblock detected");
5563*4882a593Smuzhiyun clear_buffer_write_io_error(sbh);
5564*4882a593Smuzhiyun set_buffer_uptodate(sbh);
5565*4882a593Smuzhiyun }
5566*4882a593Smuzhiyun mark_buffer_dirty(sbh);
5567*4882a593Smuzhiyun if (sync) {
5568*4882a593Smuzhiyun unlock_buffer(sbh);
5569*4882a593Smuzhiyun error = __sync_dirty_buffer(sbh,
5570*4882a593Smuzhiyun REQ_SYNC | (test_opt(sb, BARRIER) ? REQ_FUA : 0));
5571*4882a593Smuzhiyun if (buffer_write_io_error(sbh)) {
5572*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "I/O error while writing "
5573*4882a593Smuzhiyun "superblock");
5574*4882a593Smuzhiyun clear_buffer_write_io_error(sbh);
5575*4882a593Smuzhiyun set_buffer_uptodate(sbh);
5576*4882a593Smuzhiyun }
5577*4882a593Smuzhiyun }
5578*4882a593Smuzhiyun return error;
5579*4882a593Smuzhiyun }
5580*4882a593Smuzhiyun
5581*4882a593Smuzhiyun /*
5582*4882a593Smuzhiyun * Have we just finished recovery? If so, and if we are mounting (or
5583*4882a593Smuzhiyun * remounting) the filesystem readonly, then we will end up with a
5584*4882a593Smuzhiyun * consistent fs on disk. Record that fact.
5585*4882a593Smuzhiyun */
ext4_mark_recovery_complete(struct super_block * sb,struct ext4_super_block * es)5586*4882a593Smuzhiyun static int ext4_mark_recovery_complete(struct super_block *sb,
5587*4882a593Smuzhiyun struct ext4_super_block *es)
5588*4882a593Smuzhiyun {
5589*4882a593Smuzhiyun int err;
5590*4882a593Smuzhiyun journal_t *journal = EXT4_SB(sb)->s_journal;
5591*4882a593Smuzhiyun
5592*4882a593Smuzhiyun if (!ext4_has_feature_journal(sb)) {
5593*4882a593Smuzhiyun if (journal != NULL) {
5594*4882a593Smuzhiyun ext4_error(sb, "Journal got removed while the fs was "
5595*4882a593Smuzhiyun "mounted!");
5596*4882a593Smuzhiyun return -EFSCORRUPTED;
5597*4882a593Smuzhiyun }
5598*4882a593Smuzhiyun return 0;
5599*4882a593Smuzhiyun }
5600*4882a593Smuzhiyun jbd2_journal_lock_updates(journal);
5601*4882a593Smuzhiyun err = jbd2_journal_flush(journal);
5602*4882a593Smuzhiyun if (err < 0)
5603*4882a593Smuzhiyun goto out;
5604*4882a593Smuzhiyun
5605*4882a593Smuzhiyun if (ext4_has_feature_journal_needs_recovery(sb) && sb_rdonly(sb)) {
5606*4882a593Smuzhiyun ext4_clear_feature_journal_needs_recovery(sb);
5607*4882a593Smuzhiyun ext4_commit_super(sb, 1);
5608*4882a593Smuzhiyun }
5609*4882a593Smuzhiyun out:
5610*4882a593Smuzhiyun jbd2_journal_unlock_updates(journal);
5611*4882a593Smuzhiyun return err;
5612*4882a593Smuzhiyun }
5613*4882a593Smuzhiyun
5614*4882a593Smuzhiyun /*
5615*4882a593Smuzhiyun * If we are mounting (or read-write remounting) a filesystem whose journal
5616*4882a593Smuzhiyun * has recorded an error from a previous lifetime, move that error to the
5617*4882a593Smuzhiyun * main filesystem now.
5618*4882a593Smuzhiyun */
ext4_clear_journal_err(struct super_block * sb,struct ext4_super_block * es)5619*4882a593Smuzhiyun static int ext4_clear_journal_err(struct super_block *sb,
5620*4882a593Smuzhiyun struct ext4_super_block *es)
5621*4882a593Smuzhiyun {
5622*4882a593Smuzhiyun journal_t *journal;
5623*4882a593Smuzhiyun int j_errno;
5624*4882a593Smuzhiyun const char *errstr;
5625*4882a593Smuzhiyun
5626*4882a593Smuzhiyun if (!ext4_has_feature_journal(sb)) {
5627*4882a593Smuzhiyun ext4_error(sb, "Journal got removed while the fs was mounted!");
5628*4882a593Smuzhiyun return -EFSCORRUPTED;
5629*4882a593Smuzhiyun }
5630*4882a593Smuzhiyun
5631*4882a593Smuzhiyun journal = EXT4_SB(sb)->s_journal;
5632*4882a593Smuzhiyun
5633*4882a593Smuzhiyun /*
5634*4882a593Smuzhiyun * Now check for any error status which may have been recorded in the
5635*4882a593Smuzhiyun * journal by a prior ext4_error() or ext4_abort()
5636*4882a593Smuzhiyun */
5637*4882a593Smuzhiyun
5638*4882a593Smuzhiyun j_errno = jbd2_journal_errno(journal);
5639*4882a593Smuzhiyun if (j_errno) {
5640*4882a593Smuzhiyun char nbuf[16];
5641*4882a593Smuzhiyun
5642*4882a593Smuzhiyun errstr = ext4_decode_error(sb, j_errno, nbuf);
5643*4882a593Smuzhiyun ext4_warning(sb, "Filesystem error recorded "
5644*4882a593Smuzhiyun "from previous mount: %s", errstr);
5645*4882a593Smuzhiyun ext4_warning(sb, "Marking fs in need of filesystem check.");
5646*4882a593Smuzhiyun
5647*4882a593Smuzhiyun EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
5648*4882a593Smuzhiyun es->s_state |= cpu_to_le16(EXT4_ERROR_FS);
5649*4882a593Smuzhiyun ext4_commit_super(sb, 1);
5650*4882a593Smuzhiyun
5651*4882a593Smuzhiyun jbd2_journal_clear_err(journal);
5652*4882a593Smuzhiyun jbd2_journal_update_sb_errno(journal);
5653*4882a593Smuzhiyun }
5654*4882a593Smuzhiyun return 0;
5655*4882a593Smuzhiyun }
5656*4882a593Smuzhiyun
5657*4882a593Smuzhiyun /*
5658*4882a593Smuzhiyun * Force the running and committing transactions to commit,
5659*4882a593Smuzhiyun * and wait on the commit.
5660*4882a593Smuzhiyun */
ext4_force_commit(struct super_block * sb)5661*4882a593Smuzhiyun int ext4_force_commit(struct super_block *sb)
5662*4882a593Smuzhiyun {
5663*4882a593Smuzhiyun journal_t *journal;
5664*4882a593Smuzhiyun
5665*4882a593Smuzhiyun if (sb_rdonly(sb))
5666*4882a593Smuzhiyun return 0;
5667*4882a593Smuzhiyun
5668*4882a593Smuzhiyun journal = EXT4_SB(sb)->s_journal;
5669*4882a593Smuzhiyun return ext4_journal_force_commit(journal);
5670*4882a593Smuzhiyun }
5671*4882a593Smuzhiyun
ext4_sync_fs(struct super_block * sb,int wait)5672*4882a593Smuzhiyun static int ext4_sync_fs(struct super_block *sb, int wait)
5673*4882a593Smuzhiyun {
5674*4882a593Smuzhiyun int ret = 0;
5675*4882a593Smuzhiyun tid_t target;
5676*4882a593Smuzhiyun bool needs_barrier = false;
5677*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
5678*4882a593Smuzhiyun
5679*4882a593Smuzhiyun if (unlikely(ext4_forced_shutdown(sbi)))
5680*4882a593Smuzhiyun return 0;
5681*4882a593Smuzhiyun
5682*4882a593Smuzhiyun trace_ext4_sync_fs(sb, wait);
5683*4882a593Smuzhiyun flush_workqueue(sbi->rsv_conversion_wq);
5684*4882a593Smuzhiyun /*
5685*4882a593Smuzhiyun * Writeback quota in non-journalled quota case - journalled quota has
5686*4882a593Smuzhiyun * no dirty dquots
5687*4882a593Smuzhiyun */
5688*4882a593Smuzhiyun dquot_writeback_dquots(sb, -1);
5689*4882a593Smuzhiyun /*
5690*4882a593Smuzhiyun * Data writeback is possible w/o journal transaction, so barrier must
5691*4882a593Smuzhiyun * being sent at the end of the function. But we can skip it if
5692*4882a593Smuzhiyun * transaction_commit will do it for us.
5693*4882a593Smuzhiyun */
5694*4882a593Smuzhiyun if (sbi->s_journal) {
5695*4882a593Smuzhiyun target = jbd2_get_latest_transaction(sbi->s_journal);
5696*4882a593Smuzhiyun if (wait && sbi->s_journal->j_flags & JBD2_BARRIER &&
5697*4882a593Smuzhiyun !jbd2_trans_will_send_data_barrier(sbi->s_journal, target))
5698*4882a593Smuzhiyun needs_barrier = true;
5699*4882a593Smuzhiyun
5700*4882a593Smuzhiyun if (jbd2_journal_start_commit(sbi->s_journal, &target)) {
5701*4882a593Smuzhiyun if (wait)
5702*4882a593Smuzhiyun ret = jbd2_log_wait_commit(sbi->s_journal,
5703*4882a593Smuzhiyun target);
5704*4882a593Smuzhiyun }
5705*4882a593Smuzhiyun } else if (wait && test_opt(sb, BARRIER))
5706*4882a593Smuzhiyun needs_barrier = true;
5707*4882a593Smuzhiyun if (needs_barrier) {
5708*4882a593Smuzhiyun int err;
5709*4882a593Smuzhiyun err = blkdev_issue_flush(sb->s_bdev, GFP_KERNEL);
5710*4882a593Smuzhiyun if (!ret)
5711*4882a593Smuzhiyun ret = err;
5712*4882a593Smuzhiyun }
5713*4882a593Smuzhiyun
5714*4882a593Smuzhiyun return ret;
5715*4882a593Smuzhiyun }
5716*4882a593Smuzhiyun
5717*4882a593Smuzhiyun /*
5718*4882a593Smuzhiyun * LVM calls this function before a (read-only) snapshot is created. This
5719*4882a593Smuzhiyun * gives us a chance to flush the journal completely and mark the fs clean.
5720*4882a593Smuzhiyun *
5721*4882a593Smuzhiyun * Note that only this function cannot bring a filesystem to be in a clean
5722*4882a593Smuzhiyun * state independently. It relies on upper layer to stop all data & metadata
5723*4882a593Smuzhiyun * modifications.
5724*4882a593Smuzhiyun */
ext4_freeze(struct super_block * sb)5725*4882a593Smuzhiyun static int ext4_freeze(struct super_block *sb)
5726*4882a593Smuzhiyun {
5727*4882a593Smuzhiyun int error = 0;
5728*4882a593Smuzhiyun journal_t *journal;
5729*4882a593Smuzhiyun
5730*4882a593Smuzhiyun if (sb_rdonly(sb))
5731*4882a593Smuzhiyun return 0;
5732*4882a593Smuzhiyun
5733*4882a593Smuzhiyun journal = EXT4_SB(sb)->s_journal;
5734*4882a593Smuzhiyun
5735*4882a593Smuzhiyun if (journal) {
5736*4882a593Smuzhiyun /* Now we set up the journal barrier. */
5737*4882a593Smuzhiyun jbd2_journal_lock_updates(journal);
5738*4882a593Smuzhiyun
5739*4882a593Smuzhiyun /*
5740*4882a593Smuzhiyun * Don't clear the needs_recovery flag if we failed to
5741*4882a593Smuzhiyun * flush the journal.
5742*4882a593Smuzhiyun */
5743*4882a593Smuzhiyun error = jbd2_journal_flush(journal);
5744*4882a593Smuzhiyun if (error < 0)
5745*4882a593Smuzhiyun goto out;
5746*4882a593Smuzhiyun
5747*4882a593Smuzhiyun /* Journal blocked and flushed, clear needs_recovery flag. */
5748*4882a593Smuzhiyun ext4_clear_feature_journal_needs_recovery(sb);
5749*4882a593Smuzhiyun }
5750*4882a593Smuzhiyun
5751*4882a593Smuzhiyun error = ext4_commit_super(sb, 1);
5752*4882a593Smuzhiyun out:
5753*4882a593Smuzhiyun if (journal)
5754*4882a593Smuzhiyun /* we rely on upper layer to stop further updates */
5755*4882a593Smuzhiyun jbd2_journal_unlock_updates(journal);
5756*4882a593Smuzhiyun return error;
5757*4882a593Smuzhiyun }
5758*4882a593Smuzhiyun
5759*4882a593Smuzhiyun /*
5760*4882a593Smuzhiyun * Called by LVM after the snapshot is done. We need to reset the RECOVER
5761*4882a593Smuzhiyun * flag here, even though the filesystem is not technically dirty yet.
5762*4882a593Smuzhiyun */
ext4_unfreeze(struct super_block * sb)5763*4882a593Smuzhiyun static int ext4_unfreeze(struct super_block *sb)
5764*4882a593Smuzhiyun {
5765*4882a593Smuzhiyun if (sb_rdonly(sb) || ext4_forced_shutdown(EXT4_SB(sb)))
5766*4882a593Smuzhiyun return 0;
5767*4882a593Smuzhiyun
5768*4882a593Smuzhiyun if (EXT4_SB(sb)->s_journal) {
5769*4882a593Smuzhiyun /* Reset the needs_recovery flag before the fs is unlocked. */
5770*4882a593Smuzhiyun ext4_set_feature_journal_needs_recovery(sb);
5771*4882a593Smuzhiyun }
5772*4882a593Smuzhiyun
5773*4882a593Smuzhiyun ext4_commit_super(sb, 1);
5774*4882a593Smuzhiyun return 0;
5775*4882a593Smuzhiyun }
5776*4882a593Smuzhiyun
5777*4882a593Smuzhiyun /*
5778*4882a593Smuzhiyun * Structure to save mount options for ext4_remount's benefit
5779*4882a593Smuzhiyun */
5780*4882a593Smuzhiyun struct ext4_mount_options {
5781*4882a593Smuzhiyun unsigned long s_mount_opt;
5782*4882a593Smuzhiyun unsigned long s_mount_opt2;
5783*4882a593Smuzhiyun kuid_t s_resuid;
5784*4882a593Smuzhiyun kgid_t s_resgid;
5785*4882a593Smuzhiyun unsigned long s_commit_interval;
5786*4882a593Smuzhiyun u32 s_min_batch_time, s_max_batch_time;
5787*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
5788*4882a593Smuzhiyun int s_jquota_fmt;
5789*4882a593Smuzhiyun char *s_qf_names[EXT4_MAXQUOTAS];
5790*4882a593Smuzhiyun #endif
5791*4882a593Smuzhiyun };
5792*4882a593Smuzhiyun
ext4_remount(struct super_block * sb,int * flags,char * data)5793*4882a593Smuzhiyun static int ext4_remount(struct super_block *sb, int *flags, char *data)
5794*4882a593Smuzhiyun {
5795*4882a593Smuzhiyun struct ext4_super_block *es;
5796*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
5797*4882a593Smuzhiyun unsigned long old_sb_flags, vfs_flags;
5798*4882a593Smuzhiyun struct ext4_mount_options old_opts;
5799*4882a593Smuzhiyun int enable_quota = 0;
5800*4882a593Smuzhiyun ext4_group_t g;
5801*4882a593Smuzhiyun unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
5802*4882a593Smuzhiyun int err = 0;
5803*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
5804*4882a593Smuzhiyun int i, j;
5805*4882a593Smuzhiyun char *to_free[EXT4_MAXQUOTAS];
5806*4882a593Smuzhiyun #endif
5807*4882a593Smuzhiyun char *orig_data = kstrdup(data, GFP_KERNEL);
5808*4882a593Smuzhiyun
5809*4882a593Smuzhiyun if (data && !orig_data)
5810*4882a593Smuzhiyun return -ENOMEM;
5811*4882a593Smuzhiyun
5812*4882a593Smuzhiyun /* Store the original options */
5813*4882a593Smuzhiyun old_sb_flags = sb->s_flags;
5814*4882a593Smuzhiyun old_opts.s_mount_opt = sbi->s_mount_opt;
5815*4882a593Smuzhiyun old_opts.s_mount_opt2 = sbi->s_mount_opt2;
5816*4882a593Smuzhiyun old_opts.s_resuid = sbi->s_resuid;
5817*4882a593Smuzhiyun old_opts.s_resgid = sbi->s_resgid;
5818*4882a593Smuzhiyun old_opts.s_commit_interval = sbi->s_commit_interval;
5819*4882a593Smuzhiyun old_opts.s_min_batch_time = sbi->s_min_batch_time;
5820*4882a593Smuzhiyun old_opts.s_max_batch_time = sbi->s_max_batch_time;
5821*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
5822*4882a593Smuzhiyun old_opts.s_jquota_fmt = sbi->s_jquota_fmt;
5823*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++)
5824*4882a593Smuzhiyun if (sbi->s_qf_names[i]) {
5825*4882a593Smuzhiyun char *qf_name = get_qf_name(sb, sbi, i);
5826*4882a593Smuzhiyun
5827*4882a593Smuzhiyun old_opts.s_qf_names[i] = kstrdup(qf_name, GFP_KERNEL);
5828*4882a593Smuzhiyun if (!old_opts.s_qf_names[i]) {
5829*4882a593Smuzhiyun for (j = 0; j < i; j++)
5830*4882a593Smuzhiyun kfree(old_opts.s_qf_names[j]);
5831*4882a593Smuzhiyun kfree(orig_data);
5832*4882a593Smuzhiyun return -ENOMEM;
5833*4882a593Smuzhiyun }
5834*4882a593Smuzhiyun } else
5835*4882a593Smuzhiyun old_opts.s_qf_names[i] = NULL;
5836*4882a593Smuzhiyun #endif
5837*4882a593Smuzhiyun if (sbi->s_journal && sbi->s_journal->j_task->io_context)
5838*4882a593Smuzhiyun journal_ioprio = sbi->s_journal->j_task->io_context->ioprio;
5839*4882a593Smuzhiyun
5840*4882a593Smuzhiyun /*
5841*4882a593Smuzhiyun * Some options can be enabled by ext4 and/or by VFS mount flag
5842*4882a593Smuzhiyun * either way we need to make sure it matches in both *flags and
5843*4882a593Smuzhiyun * s_flags. Copy those selected flags from *flags to s_flags
5844*4882a593Smuzhiyun */
5845*4882a593Smuzhiyun vfs_flags = SB_LAZYTIME | SB_I_VERSION;
5846*4882a593Smuzhiyun sb->s_flags = (sb->s_flags & ~vfs_flags) | (*flags & vfs_flags);
5847*4882a593Smuzhiyun
5848*4882a593Smuzhiyun if (!parse_options(data, sb, NULL, &journal_ioprio, 1)) {
5849*4882a593Smuzhiyun err = -EINVAL;
5850*4882a593Smuzhiyun goto restore_opts;
5851*4882a593Smuzhiyun }
5852*4882a593Smuzhiyun
5853*4882a593Smuzhiyun if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^
5854*4882a593Smuzhiyun test_opt(sb, JOURNAL_CHECKSUM)) {
5855*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "changing journal_checksum "
5856*4882a593Smuzhiyun "during remount not supported; ignoring");
5857*4882a593Smuzhiyun sbi->s_mount_opt ^= EXT4_MOUNT_JOURNAL_CHECKSUM;
5858*4882a593Smuzhiyun }
5859*4882a593Smuzhiyun
5860*4882a593Smuzhiyun if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
5861*4882a593Smuzhiyun if (test_opt2(sb, EXPLICIT_DELALLOC)) {
5862*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
5863*4882a593Smuzhiyun "both data=journal and delalloc");
5864*4882a593Smuzhiyun err = -EINVAL;
5865*4882a593Smuzhiyun goto restore_opts;
5866*4882a593Smuzhiyun }
5867*4882a593Smuzhiyun if (test_opt(sb, DIOREAD_NOLOCK)) {
5868*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
5869*4882a593Smuzhiyun "both data=journal and dioread_nolock");
5870*4882a593Smuzhiyun err = -EINVAL;
5871*4882a593Smuzhiyun goto restore_opts;
5872*4882a593Smuzhiyun }
5873*4882a593Smuzhiyun } else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) {
5874*4882a593Smuzhiyun if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
5875*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't mount with "
5876*4882a593Smuzhiyun "journal_async_commit in data=ordered mode");
5877*4882a593Smuzhiyun err = -EINVAL;
5878*4882a593Smuzhiyun goto restore_opts;
5879*4882a593Smuzhiyun }
5880*4882a593Smuzhiyun }
5881*4882a593Smuzhiyun
5882*4882a593Smuzhiyun if ((sbi->s_mount_opt ^ old_opts.s_mount_opt) & EXT4_MOUNT_NO_MBCACHE) {
5883*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR, "can't enable nombcache during remount");
5884*4882a593Smuzhiyun err = -EINVAL;
5885*4882a593Smuzhiyun goto restore_opts;
5886*4882a593Smuzhiyun }
5887*4882a593Smuzhiyun
5888*4882a593Smuzhiyun if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
5889*4882a593Smuzhiyun ext4_abort(sb, EXT4_ERR_ESHUTDOWN, "Abort forced by user");
5890*4882a593Smuzhiyun
5891*4882a593Smuzhiyun sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
5892*4882a593Smuzhiyun (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0);
5893*4882a593Smuzhiyun
5894*4882a593Smuzhiyun es = sbi->s_es;
5895*4882a593Smuzhiyun
5896*4882a593Smuzhiyun if (sbi->s_journal) {
5897*4882a593Smuzhiyun ext4_init_journal_params(sb, sbi->s_journal);
5898*4882a593Smuzhiyun set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);
5899*4882a593Smuzhiyun }
5900*4882a593Smuzhiyun
5901*4882a593Smuzhiyun if ((bool)(*flags & SB_RDONLY) != sb_rdonly(sb)) {
5902*4882a593Smuzhiyun if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED)) {
5903*4882a593Smuzhiyun err = -EROFS;
5904*4882a593Smuzhiyun goto restore_opts;
5905*4882a593Smuzhiyun }
5906*4882a593Smuzhiyun
5907*4882a593Smuzhiyun if (*flags & SB_RDONLY) {
5908*4882a593Smuzhiyun err = sync_filesystem(sb);
5909*4882a593Smuzhiyun if (err < 0)
5910*4882a593Smuzhiyun goto restore_opts;
5911*4882a593Smuzhiyun err = dquot_suspend(sb, -1);
5912*4882a593Smuzhiyun if (err < 0)
5913*4882a593Smuzhiyun goto restore_opts;
5914*4882a593Smuzhiyun
5915*4882a593Smuzhiyun /*
5916*4882a593Smuzhiyun * First of all, the unconditional stuff we have to do
5917*4882a593Smuzhiyun * to disable replay of the journal when we next remount
5918*4882a593Smuzhiyun */
5919*4882a593Smuzhiyun sb->s_flags |= SB_RDONLY;
5920*4882a593Smuzhiyun
5921*4882a593Smuzhiyun /*
5922*4882a593Smuzhiyun * OK, test if we are remounting a valid rw partition
5923*4882a593Smuzhiyun * readonly, and if so set the rdonly flag and then
5924*4882a593Smuzhiyun * mark the partition as valid again.
5925*4882a593Smuzhiyun */
5926*4882a593Smuzhiyun if (!(es->s_state & cpu_to_le16(EXT4_VALID_FS)) &&
5927*4882a593Smuzhiyun (sbi->s_mount_state & EXT4_VALID_FS))
5928*4882a593Smuzhiyun es->s_state = cpu_to_le16(sbi->s_mount_state);
5929*4882a593Smuzhiyun
5930*4882a593Smuzhiyun if (sbi->s_journal) {
5931*4882a593Smuzhiyun /*
5932*4882a593Smuzhiyun * We let remount-ro finish even if marking fs
5933*4882a593Smuzhiyun * as clean failed...
5934*4882a593Smuzhiyun */
5935*4882a593Smuzhiyun ext4_mark_recovery_complete(sb, es);
5936*4882a593Smuzhiyun }
5937*4882a593Smuzhiyun } else {
5938*4882a593Smuzhiyun /* Make sure we can mount this feature set readwrite */
5939*4882a593Smuzhiyun if (ext4_has_feature_readonly(sb) ||
5940*4882a593Smuzhiyun !ext4_feature_set_ok(sb, 0)) {
5941*4882a593Smuzhiyun err = -EROFS;
5942*4882a593Smuzhiyun goto restore_opts;
5943*4882a593Smuzhiyun }
5944*4882a593Smuzhiyun /*
5945*4882a593Smuzhiyun * Make sure the group descriptor checksums
5946*4882a593Smuzhiyun * are sane. If they aren't, refuse to remount r/w.
5947*4882a593Smuzhiyun */
5948*4882a593Smuzhiyun for (g = 0; g < sbi->s_groups_count; g++) {
5949*4882a593Smuzhiyun struct ext4_group_desc *gdp =
5950*4882a593Smuzhiyun ext4_get_group_desc(sb, g, NULL);
5951*4882a593Smuzhiyun
5952*4882a593Smuzhiyun if (!ext4_group_desc_csum_verify(sb, g, gdp)) {
5953*4882a593Smuzhiyun ext4_msg(sb, KERN_ERR,
5954*4882a593Smuzhiyun "ext4_remount: Checksum for group %u failed (%u!=%u)",
5955*4882a593Smuzhiyun g, le16_to_cpu(ext4_group_desc_csum(sb, g, gdp)),
5956*4882a593Smuzhiyun le16_to_cpu(gdp->bg_checksum));
5957*4882a593Smuzhiyun err = -EFSBADCRC;
5958*4882a593Smuzhiyun goto restore_opts;
5959*4882a593Smuzhiyun }
5960*4882a593Smuzhiyun }
5961*4882a593Smuzhiyun
5962*4882a593Smuzhiyun /*
5963*4882a593Smuzhiyun * If we have an unprocessed orphan list hanging
5964*4882a593Smuzhiyun * around from a previously readonly bdev mount,
5965*4882a593Smuzhiyun * require a full umount/remount for now.
5966*4882a593Smuzhiyun */
5967*4882a593Smuzhiyun if (es->s_last_orphan) {
5968*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Couldn't "
5969*4882a593Smuzhiyun "remount RDWR because of unprocessed "
5970*4882a593Smuzhiyun "orphan inode list. Please "
5971*4882a593Smuzhiyun "umount/remount instead");
5972*4882a593Smuzhiyun err = -EINVAL;
5973*4882a593Smuzhiyun goto restore_opts;
5974*4882a593Smuzhiyun }
5975*4882a593Smuzhiyun
5976*4882a593Smuzhiyun /*
5977*4882a593Smuzhiyun * Mounting a RDONLY partition read-write, so reread
5978*4882a593Smuzhiyun * and store the current valid flag. (It may have
5979*4882a593Smuzhiyun * been changed by e2fsck since we originally mounted
5980*4882a593Smuzhiyun * the partition.)
5981*4882a593Smuzhiyun */
5982*4882a593Smuzhiyun if (sbi->s_journal) {
5983*4882a593Smuzhiyun err = ext4_clear_journal_err(sb, es);
5984*4882a593Smuzhiyun if (err)
5985*4882a593Smuzhiyun goto restore_opts;
5986*4882a593Smuzhiyun }
5987*4882a593Smuzhiyun sbi->s_mount_state = (le16_to_cpu(es->s_state) &
5988*4882a593Smuzhiyun ~EXT4_FC_REPLAY);
5989*4882a593Smuzhiyun
5990*4882a593Smuzhiyun err = ext4_setup_super(sb, es, 0);
5991*4882a593Smuzhiyun if (err)
5992*4882a593Smuzhiyun goto restore_opts;
5993*4882a593Smuzhiyun
5994*4882a593Smuzhiyun sb->s_flags &= ~SB_RDONLY;
5995*4882a593Smuzhiyun if (ext4_has_feature_mmp(sb))
5996*4882a593Smuzhiyun if (ext4_multi_mount_protect(sb,
5997*4882a593Smuzhiyun le64_to_cpu(es->s_mmp_block))) {
5998*4882a593Smuzhiyun err = -EROFS;
5999*4882a593Smuzhiyun goto restore_opts;
6000*4882a593Smuzhiyun }
6001*4882a593Smuzhiyun enable_quota = 1;
6002*4882a593Smuzhiyun }
6003*4882a593Smuzhiyun }
6004*4882a593Smuzhiyun
6005*4882a593Smuzhiyun /*
6006*4882a593Smuzhiyun * Reinitialize lazy itable initialization thread based on
6007*4882a593Smuzhiyun * current settings
6008*4882a593Smuzhiyun */
6009*4882a593Smuzhiyun if (sb_rdonly(sb) || !test_opt(sb, INIT_INODE_TABLE))
6010*4882a593Smuzhiyun ext4_unregister_li_request(sb);
6011*4882a593Smuzhiyun else {
6012*4882a593Smuzhiyun ext4_group_t first_not_zeroed;
6013*4882a593Smuzhiyun first_not_zeroed = ext4_has_uninit_itable(sb);
6014*4882a593Smuzhiyun ext4_register_li_request(sb, first_not_zeroed);
6015*4882a593Smuzhiyun }
6016*4882a593Smuzhiyun
6017*4882a593Smuzhiyun /*
6018*4882a593Smuzhiyun * Handle creation of system zone data early because it can fail.
6019*4882a593Smuzhiyun * Releasing of existing data is done when we are sure remount will
6020*4882a593Smuzhiyun * succeed.
6021*4882a593Smuzhiyun */
6022*4882a593Smuzhiyun if (test_opt(sb, BLOCK_VALIDITY) && !sbi->s_system_blks) {
6023*4882a593Smuzhiyun err = ext4_setup_system_zone(sb);
6024*4882a593Smuzhiyun if (err)
6025*4882a593Smuzhiyun goto restore_opts;
6026*4882a593Smuzhiyun }
6027*4882a593Smuzhiyun
6028*4882a593Smuzhiyun if (sbi->s_journal == NULL && !(old_sb_flags & SB_RDONLY)) {
6029*4882a593Smuzhiyun err = ext4_commit_super(sb, 1);
6030*4882a593Smuzhiyun if (err)
6031*4882a593Smuzhiyun goto restore_opts;
6032*4882a593Smuzhiyun }
6033*4882a593Smuzhiyun
6034*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
6035*4882a593Smuzhiyun /* Release old quota file names */
6036*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++)
6037*4882a593Smuzhiyun kfree(old_opts.s_qf_names[i]);
6038*4882a593Smuzhiyun if (enable_quota) {
6039*4882a593Smuzhiyun if (sb_any_quota_suspended(sb))
6040*4882a593Smuzhiyun dquot_resume(sb, -1);
6041*4882a593Smuzhiyun else if (ext4_has_feature_quota(sb)) {
6042*4882a593Smuzhiyun err = ext4_enable_quotas(sb);
6043*4882a593Smuzhiyun if (err)
6044*4882a593Smuzhiyun goto restore_opts;
6045*4882a593Smuzhiyun }
6046*4882a593Smuzhiyun }
6047*4882a593Smuzhiyun #endif
6048*4882a593Smuzhiyun if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks)
6049*4882a593Smuzhiyun ext4_release_system_zone(sb);
6050*4882a593Smuzhiyun
6051*4882a593Smuzhiyun if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb))
6052*4882a593Smuzhiyun ext4_stop_mmpd(sbi);
6053*4882a593Smuzhiyun
6054*4882a593Smuzhiyun /*
6055*4882a593Smuzhiyun * Some options can be enabled by ext4 and/or by VFS mount flag
6056*4882a593Smuzhiyun * either way we need to make sure it matches in both *flags and
6057*4882a593Smuzhiyun * s_flags. Copy those selected flags from s_flags to *flags
6058*4882a593Smuzhiyun */
6059*4882a593Smuzhiyun *flags = (*flags & ~vfs_flags) | (sb->s_flags & vfs_flags);
6060*4882a593Smuzhiyun
6061*4882a593Smuzhiyun ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data);
6062*4882a593Smuzhiyun kfree(orig_data);
6063*4882a593Smuzhiyun return 0;
6064*4882a593Smuzhiyun
6065*4882a593Smuzhiyun restore_opts:
6066*4882a593Smuzhiyun sb->s_flags = old_sb_flags;
6067*4882a593Smuzhiyun sbi->s_mount_opt = old_opts.s_mount_opt;
6068*4882a593Smuzhiyun sbi->s_mount_opt2 = old_opts.s_mount_opt2;
6069*4882a593Smuzhiyun sbi->s_resuid = old_opts.s_resuid;
6070*4882a593Smuzhiyun sbi->s_resgid = old_opts.s_resgid;
6071*4882a593Smuzhiyun sbi->s_commit_interval = old_opts.s_commit_interval;
6072*4882a593Smuzhiyun sbi->s_min_batch_time = old_opts.s_min_batch_time;
6073*4882a593Smuzhiyun sbi->s_max_batch_time = old_opts.s_max_batch_time;
6074*4882a593Smuzhiyun if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks)
6075*4882a593Smuzhiyun ext4_release_system_zone(sb);
6076*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
6077*4882a593Smuzhiyun sbi->s_jquota_fmt = old_opts.s_jquota_fmt;
6078*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++) {
6079*4882a593Smuzhiyun to_free[i] = get_qf_name(sb, sbi, i);
6080*4882a593Smuzhiyun rcu_assign_pointer(sbi->s_qf_names[i], old_opts.s_qf_names[i]);
6081*4882a593Smuzhiyun }
6082*4882a593Smuzhiyun synchronize_rcu();
6083*4882a593Smuzhiyun for (i = 0; i < EXT4_MAXQUOTAS; i++)
6084*4882a593Smuzhiyun kfree(to_free[i]);
6085*4882a593Smuzhiyun #endif
6086*4882a593Smuzhiyun if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb))
6087*4882a593Smuzhiyun ext4_stop_mmpd(sbi);
6088*4882a593Smuzhiyun kfree(orig_data);
6089*4882a593Smuzhiyun return err;
6090*4882a593Smuzhiyun }
6091*4882a593Smuzhiyun
6092*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
ext4_statfs_project(struct super_block * sb,kprojid_t projid,struct kstatfs * buf)6093*4882a593Smuzhiyun static int ext4_statfs_project(struct super_block *sb,
6094*4882a593Smuzhiyun kprojid_t projid, struct kstatfs *buf)
6095*4882a593Smuzhiyun {
6096*4882a593Smuzhiyun struct kqid qid;
6097*4882a593Smuzhiyun struct dquot *dquot;
6098*4882a593Smuzhiyun u64 limit;
6099*4882a593Smuzhiyun u64 curblock;
6100*4882a593Smuzhiyun
6101*4882a593Smuzhiyun qid = make_kqid_projid(projid);
6102*4882a593Smuzhiyun dquot = dqget(sb, qid);
6103*4882a593Smuzhiyun if (IS_ERR(dquot))
6104*4882a593Smuzhiyun return PTR_ERR(dquot);
6105*4882a593Smuzhiyun spin_lock(&dquot->dq_dqb_lock);
6106*4882a593Smuzhiyun
6107*4882a593Smuzhiyun limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit,
6108*4882a593Smuzhiyun dquot->dq_dqb.dqb_bhardlimit);
6109*4882a593Smuzhiyun limit >>= sb->s_blocksize_bits;
6110*4882a593Smuzhiyun
6111*4882a593Smuzhiyun if (limit && buf->f_blocks > limit) {
6112*4882a593Smuzhiyun curblock = (dquot->dq_dqb.dqb_curspace +
6113*4882a593Smuzhiyun dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits;
6114*4882a593Smuzhiyun buf->f_blocks = limit;
6115*4882a593Smuzhiyun buf->f_bfree = buf->f_bavail =
6116*4882a593Smuzhiyun (buf->f_blocks > curblock) ?
6117*4882a593Smuzhiyun (buf->f_blocks - curblock) : 0;
6118*4882a593Smuzhiyun }
6119*4882a593Smuzhiyun
6120*4882a593Smuzhiyun limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit,
6121*4882a593Smuzhiyun dquot->dq_dqb.dqb_ihardlimit);
6122*4882a593Smuzhiyun if (limit && buf->f_files > limit) {
6123*4882a593Smuzhiyun buf->f_files = limit;
6124*4882a593Smuzhiyun buf->f_ffree =
6125*4882a593Smuzhiyun (buf->f_files > dquot->dq_dqb.dqb_curinodes) ?
6126*4882a593Smuzhiyun (buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0;
6127*4882a593Smuzhiyun }
6128*4882a593Smuzhiyun
6129*4882a593Smuzhiyun spin_unlock(&dquot->dq_dqb_lock);
6130*4882a593Smuzhiyun dqput(dquot);
6131*4882a593Smuzhiyun return 0;
6132*4882a593Smuzhiyun }
6133*4882a593Smuzhiyun #endif
6134*4882a593Smuzhiyun
ext4_statfs(struct dentry * dentry,struct kstatfs * buf)6135*4882a593Smuzhiyun static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
6136*4882a593Smuzhiyun {
6137*4882a593Smuzhiyun struct super_block *sb = dentry->d_sb;
6138*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
6139*4882a593Smuzhiyun struct ext4_super_block *es = sbi->s_es;
6140*4882a593Smuzhiyun ext4_fsblk_t overhead = 0, resv_blocks;
6141*4882a593Smuzhiyun u64 fsid;
6142*4882a593Smuzhiyun s64 bfree;
6143*4882a593Smuzhiyun resv_blocks = EXT4_C2B(sbi, atomic64_read(&sbi->s_resv_clusters));
6144*4882a593Smuzhiyun
6145*4882a593Smuzhiyun if (!test_opt(sb, MINIX_DF))
6146*4882a593Smuzhiyun overhead = sbi->s_overhead;
6147*4882a593Smuzhiyun
6148*4882a593Smuzhiyun buf->f_type = EXT4_SUPER_MAGIC;
6149*4882a593Smuzhiyun buf->f_bsize = sb->s_blocksize;
6150*4882a593Smuzhiyun buf->f_blocks = ext4_blocks_count(es) - EXT4_C2B(sbi, overhead);
6151*4882a593Smuzhiyun bfree = percpu_counter_sum_positive(&sbi->s_freeclusters_counter) -
6152*4882a593Smuzhiyun percpu_counter_sum_positive(&sbi->s_dirtyclusters_counter);
6153*4882a593Smuzhiyun /* prevent underflow in case that few free space is available */
6154*4882a593Smuzhiyun buf->f_bfree = EXT4_C2B(sbi, max_t(s64, bfree, 0));
6155*4882a593Smuzhiyun buf->f_bavail = buf->f_bfree -
6156*4882a593Smuzhiyun (ext4_r_blocks_count(es) + resv_blocks);
6157*4882a593Smuzhiyun if (buf->f_bfree < (ext4_r_blocks_count(es) + resv_blocks))
6158*4882a593Smuzhiyun buf->f_bavail = 0;
6159*4882a593Smuzhiyun buf->f_files = le32_to_cpu(es->s_inodes_count);
6160*4882a593Smuzhiyun buf->f_ffree = percpu_counter_sum_positive(&sbi->s_freeinodes_counter);
6161*4882a593Smuzhiyun buf->f_namelen = EXT4_NAME_LEN;
6162*4882a593Smuzhiyun fsid = le64_to_cpup((void *)es->s_uuid) ^
6163*4882a593Smuzhiyun le64_to_cpup((void *)es->s_uuid + sizeof(u64));
6164*4882a593Smuzhiyun buf->f_fsid = u64_to_fsid(fsid);
6165*4882a593Smuzhiyun
6166*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
6167*4882a593Smuzhiyun if (ext4_test_inode_flag(dentry->d_inode, EXT4_INODE_PROJINHERIT) &&
6168*4882a593Smuzhiyun sb_has_quota_limits_enabled(sb, PRJQUOTA))
6169*4882a593Smuzhiyun ext4_statfs_project(sb, EXT4_I(dentry->d_inode)->i_projid, buf);
6170*4882a593Smuzhiyun #endif
6171*4882a593Smuzhiyun return 0;
6172*4882a593Smuzhiyun }
6173*4882a593Smuzhiyun
6174*4882a593Smuzhiyun
6175*4882a593Smuzhiyun #ifdef CONFIG_QUOTA
6176*4882a593Smuzhiyun
6177*4882a593Smuzhiyun /*
6178*4882a593Smuzhiyun * Helper functions so that transaction is started before we acquire dqio_sem
6179*4882a593Smuzhiyun * to keep correct lock ordering of transaction > dqio_sem
6180*4882a593Smuzhiyun */
dquot_to_inode(struct dquot * dquot)6181*4882a593Smuzhiyun static inline struct inode *dquot_to_inode(struct dquot *dquot)
6182*4882a593Smuzhiyun {
6183*4882a593Smuzhiyun return sb_dqopt(dquot->dq_sb)->files[dquot->dq_id.type];
6184*4882a593Smuzhiyun }
6185*4882a593Smuzhiyun
ext4_write_dquot(struct dquot * dquot)6186*4882a593Smuzhiyun static int ext4_write_dquot(struct dquot *dquot)
6187*4882a593Smuzhiyun {
6188*4882a593Smuzhiyun int ret, err;
6189*4882a593Smuzhiyun handle_t *handle;
6190*4882a593Smuzhiyun struct inode *inode;
6191*4882a593Smuzhiyun
6192*4882a593Smuzhiyun inode = dquot_to_inode(dquot);
6193*4882a593Smuzhiyun handle = ext4_journal_start(inode, EXT4_HT_QUOTA,
6194*4882a593Smuzhiyun EXT4_QUOTA_TRANS_BLOCKS(dquot->dq_sb));
6195*4882a593Smuzhiyun if (IS_ERR(handle))
6196*4882a593Smuzhiyun return PTR_ERR(handle);
6197*4882a593Smuzhiyun ret = dquot_commit(dquot);
6198*4882a593Smuzhiyun err = ext4_journal_stop(handle);
6199*4882a593Smuzhiyun if (!ret)
6200*4882a593Smuzhiyun ret = err;
6201*4882a593Smuzhiyun return ret;
6202*4882a593Smuzhiyun }
6203*4882a593Smuzhiyun
ext4_acquire_dquot(struct dquot * dquot)6204*4882a593Smuzhiyun static int ext4_acquire_dquot(struct dquot *dquot)
6205*4882a593Smuzhiyun {
6206*4882a593Smuzhiyun int ret, err;
6207*4882a593Smuzhiyun handle_t *handle;
6208*4882a593Smuzhiyun
6209*4882a593Smuzhiyun handle = ext4_journal_start(dquot_to_inode(dquot), EXT4_HT_QUOTA,
6210*4882a593Smuzhiyun EXT4_QUOTA_INIT_BLOCKS(dquot->dq_sb));
6211*4882a593Smuzhiyun if (IS_ERR(handle))
6212*4882a593Smuzhiyun return PTR_ERR(handle);
6213*4882a593Smuzhiyun ret = dquot_acquire(dquot);
6214*4882a593Smuzhiyun err = ext4_journal_stop(handle);
6215*4882a593Smuzhiyun if (!ret)
6216*4882a593Smuzhiyun ret = err;
6217*4882a593Smuzhiyun return ret;
6218*4882a593Smuzhiyun }
6219*4882a593Smuzhiyun
ext4_release_dquot(struct dquot * dquot)6220*4882a593Smuzhiyun static int ext4_release_dquot(struct dquot *dquot)
6221*4882a593Smuzhiyun {
6222*4882a593Smuzhiyun int ret, err;
6223*4882a593Smuzhiyun handle_t *handle;
6224*4882a593Smuzhiyun
6225*4882a593Smuzhiyun handle = ext4_journal_start(dquot_to_inode(dquot), EXT4_HT_QUOTA,
6226*4882a593Smuzhiyun EXT4_QUOTA_DEL_BLOCKS(dquot->dq_sb));
6227*4882a593Smuzhiyun if (IS_ERR(handle)) {
6228*4882a593Smuzhiyun /* Release dquot anyway to avoid endless cycle in dqput() */
6229*4882a593Smuzhiyun dquot_release(dquot);
6230*4882a593Smuzhiyun return PTR_ERR(handle);
6231*4882a593Smuzhiyun }
6232*4882a593Smuzhiyun ret = dquot_release(dquot);
6233*4882a593Smuzhiyun err = ext4_journal_stop(handle);
6234*4882a593Smuzhiyun if (!ret)
6235*4882a593Smuzhiyun ret = err;
6236*4882a593Smuzhiyun return ret;
6237*4882a593Smuzhiyun }
6238*4882a593Smuzhiyun
ext4_mark_dquot_dirty(struct dquot * dquot)6239*4882a593Smuzhiyun static int ext4_mark_dquot_dirty(struct dquot *dquot)
6240*4882a593Smuzhiyun {
6241*4882a593Smuzhiyun struct super_block *sb = dquot->dq_sb;
6242*4882a593Smuzhiyun struct ext4_sb_info *sbi = EXT4_SB(sb);
6243*4882a593Smuzhiyun
6244*4882a593Smuzhiyun /* Are we journaling quotas? */
6245*4882a593Smuzhiyun if (ext4_has_feature_quota(sb) ||
6246*4882a593Smuzhiyun sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) {
6247*4882a593Smuzhiyun dquot_mark_dquot_dirty(dquot);
6248*4882a593Smuzhiyun return ext4_write_dquot(dquot);
6249*4882a593Smuzhiyun } else {
6250*4882a593Smuzhiyun return dquot_mark_dquot_dirty(dquot);
6251*4882a593Smuzhiyun }
6252*4882a593Smuzhiyun }
6253*4882a593Smuzhiyun
ext4_write_info(struct super_block * sb,int type)6254*4882a593Smuzhiyun static int ext4_write_info(struct super_block *sb, int type)
6255*4882a593Smuzhiyun {
6256*4882a593Smuzhiyun int ret, err;
6257*4882a593Smuzhiyun handle_t *handle;
6258*4882a593Smuzhiyun
6259*4882a593Smuzhiyun /* Data block + inode block */
6260*4882a593Smuzhiyun handle = ext4_journal_start_sb(sb, EXT4_HT_QUOTA, 2);
6261*4882a593Smuzhiyun if (IS_ERR(handle))
6262*4882a593Smuzhiyun return PTR_ERR(handle);
6263*4882a593Smuzhiyun ret = dquot_commit_info(sb, type);
6264*4882a593Smuzhiyun err = ext4_journal_stop(handle);
6265*4882a593Smuzhiyun if (!ret)
6266*4882a593Smuzhiyun ret = err;
6267*4882a593Smuzhiyun return ret;
6268*4882a593Smuzhiyun }
6269*4882a593Smuzhiyun
6270*4882a593Smuzhiyun /*
6271*4882a593Smuzhiyun * Turn on quotas during mount time - we need to find
6272*4882a593Smuzhiyun * the quota file and such...
6273*4882a593Smuzhiyun */
ext4_quota_on_mount(struct super_block * sb,int type)6274*4882a593Smuzhiyun static int ext4_quota_on_mount(struct super_block *sb, int type)
6275*4882a593Smuzhiyun {
6276*4882a593Smuzhiyun return dquot_quota_on_mount(sb, get_qf_name(sb, EXT4_SB(sb), type),
6277*4882a593Smuzhiyun EXT4_SB(sb)->s_jquota_fmt, type);
6278*4882a593Smuzhiyun }
6279*4882a593Smuzhiyun
lockdep_set_quota_inode(struct inode * inode,int subclass)6280*4882a593Smuzhiyun static void lockdep_set_quota_inode(struct inode *inode, int subclass)
6281*4882a593Smuzhiyun {
6282*4882a593Smuzhiyun struct ext4_inode_info *ei = EXT4_I(inode);
6283*4882a593Smuzhiyun
6284*4882a593Smuzhiyun /* The first argument of lockdep_set_subclass has to be
6285*4882a593Smuzhiyun * *exactly* the same as the argument to init_rwsem() --- in
6286*4882a593Smuzhiyun * this case, in init_once() --- or lockdep gets unhappy
6287*4882a593Smuzhiyun * because the name of the lock is set using the
6288*4882a593Smuzhiyun * stringification of the argument to init_rwsem().
6289*4882a593Smuzhiyun */
6290*4882a593Smuzhiyun (void) ei; /* shut up clang warning if !CONFIG_LOCKDEP */
6291*4882a593Smuzhiyun lockdep_set_subclass(&ei->i_data_sem, subclass);
6292*4882a593Smuzhiyun }
6293*4882a593Smuzhiyun
6294*4882a593Smuzhiyun /*
6295*4882a593Smuzhiyun * Standard function to be called on quota_on
6296*4882a593Smuzhiyun */
ext4_quota_on(struct super_block * sb,int type,int format_id,const struct path * path)6297*4882a593Smuzhiyun static int ext4_quota_on(struct super_block *sb, int type, int format_id,
6298*4882a593Smuzhiyun const struct path *path)
6299*4882a593Smuzhiyun {
6300*4882a593Smuzhiyun int err;
6301*4882a593Smuzhiyun
6302*4882a593Smuzhiyun if (!test_opt(sb, QUOTA))
6303*4882a593Smuzhiyun return -EINVAL;
6304*4882a593Smuzhiyun
6305*4882a593Smuzhiyun /* Quotafile not on the same filesystem? */
6306*4882a593Smuzhiyun if (path->dentry->d_sb != sb)
6307*4882a593Smuzhiyun return -EXDEV;
6308*4882a593Smuzhiyun
6309*4882a593Smuzhiyun /* Quota already enabled for this file? */
6310*4882a593Smuzhiyun if (IS_NOQUOTA(d_inode(path->dentry)))
6311*4882a593Smuzhiyun return -EBUSY;
6312*4882a593Smuzhiyun
6313*4882a593Smuzhiyun /* Journaling quota? */
6314*4882a593Smuzhiyun if (EXT4_SB(sb)->s_qf_names[type]) {
6315*4882a593Smuzhiyun /* Quotafile not in fs root? */
6316*4882a593Smuzhiyun if (path->dentry->d_parent != sb->s_root)
6317*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING,
6318*4882a593Smuzhiyun "Quota file not on filesystem root. "
6319*4882a593Smuzhiyun "Journaled quota will not work");
6320*4882a593Smuzhiyun sb_dqopt(sb)->flags |= DQUOT_NOLIST_DIRTY;
6321*4882a593Smuzhiyun } else {
6322*4882a593Smuzhiyun /*
6323*4882a593Smuzhiyun * Clear the flag just in case mount options changed since
6324*4882a593Smuzhiyun * last time.
6325*4882a593Smuzhiyun */
6326*4882a593Smuzhiyun sb_dqopt(sb)->flags &= ~DQUOT_NOLIST_DIRTY;
6327*4882a593Smuzhiyun }
6328*4882a593Smuzhiyun
6329*4882a593Smuzhiyun /*
6330*4882a593Smuzhiyun * When we journal data on quota file, we have to flush journal to see
6331*4882a593Smuzhiyun * all updates to the file when we bypass pagecache...
6332*4882a593Smuzhiyun */
6333*4882a593Smuzhiyun if (EXT4_SB(sb)->s_journal &&
6334*4882a593Smuzhiyun ext4_should_journal_data(d_inode(path->dentry))) {
6335*4882a593Smuzhiyun /*
6336*4882a593Smuzhiyun * We don't need to lock updates but journal_flush() could
6337*4882a593Smuzhiyun * otherwise be livelocked...
6338*4882a593Smuzhiyun */
6339*4882a593Smuzhiyun jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
6340*4882a593Smuzhiyun err = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
6341*4882a593Smuzhiyun jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
6342*4882a593Smuzhiyun if (err)
6343*4882a593Smuzhiyun return err;
6344*4882a593Smuzhiyun }
6345*4882a593Smuzhiyun
6346*4882a593Smuzhiyun lockdep_set_quota_inode(path->dentry->d_inode, I_DATA_SEM_QUOTA);
6347*4882a593Smuzhiyun err = dquot_quota_on(sb, type, format_id, path);
6348*4882a593Smuzhiyun if (!err) {
6349*4882a593Smuzhiyun struct inode *inode = d_inode(path->dentry);
6350*4882a593Smuzhiyun handle_t *handle;
6351*4882a593Smuzhiyun
6352*4882a593Smuzhiyun /*
6353*4882a593Smuzhiyun * Set inode flags to prevent userspace from messing with quota
6354*4882a593Smuzhiyun * files. If this fails, we return success anyway since quotas
6355*4882a593Smuzhiyun * are already enabled and this is not a hard failure.
6356*4882a593Smuzhiyun */
6357*4882a593Smuzhiyun inode_lock(inode);
6358*4882a593Smuzhiyun handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1);
6359*4882a593Smuzhiyun if (IS_ERR(handle))
6360*4882a593Smuzhiyun goto unlock_inode;
6361*4882a593Smuzhiyun EXT4_I(inode)->i_flags |= EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL;
6362*4882a593Smuzhiyun inode_set_flags(inode, S_NOATIME | S_IMMUTABLE,
6363*4882a593Smuzhiyun S_NOATIME | S_IMMUTABLE);
6364*4882a593Smuzhiyun err = ext4_mark_inode_dirty(handle, inode);
6365*4882a593Smuzhiyun ext4_journal_stop(handle);
6366*4882a593Smuzhiyun unlock_inode:
6367*4882a593Smuzhiyun inode_unlock(inode);
6368*4882a593Smuzhiyun if (err)
6369*4882a593Smuzhiyun dquot_quota_off(sb, type);
6370*4882a593Smuzhiyun }
6371*4882a593Smuzhiyun if (err)
6372*4882a593Smuzhiyun lockdep_set_quota_inode(path->dentry->d_inode,
6373*4882a593Smuzhiyun I_DATA_SEM_NORMAL);
6374*4882a593Smuzhiyun return err;
6375*4882a593Smuzhiyun }
6376*4882a593Smuzhiyun
ext4_quota_enable(struct super_block * sb,int type,int format_id,unsigned int flags)6377*4882a593Smuzhiyun static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
6378*4882a593Smuzhiyun unsigned int flags)
6379*4882a593Smuzhiyun {
6380*4882a593Smuzhiyun int err;
6381*4882a593Smuzhiyun struct inode *qf_inode;
6382*4882a593Smuzhiyun unsigned long qf_inums[EXT4_MAXQUOTAS] = {
6383*4882a593Smuzhiyun le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum),
6384*4882a593Smuzhiyun le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum),
6385*4882a593Smuzhiyun le32_to_cpu(EXT4_SB(sb)->s_es->s_prj_quota_inum)
6386*4882a593Smuzhiyun };
6387*4882a593Smuzhiyun
6388*4882a593Smuzhiyun BUG_ON(!ext4_has_feature_quota(sb));
6389*4882a593Smuzhiyun
6390*4882a593Smuzhiyun if (!qf_inums[type])
6391*4882a593Smuzhiyun return -EPERM;
6392*4882a593Smuzhiyun
6393*4882a593Smuzhiyun qf_inode = ext4_iget(sb, qf_inums[type], EXT4_IGET_SPECIAL);
6394*4882a593Smuzhiyun if (IS_ERR(qf_inode)) {
6395*4882a593Smuzhiyun ext4_error(sb, "Bad quota inode # %lu", qf_inums[type]);
6396*4882a593Smuzhiyun return PTR_ERR(qf_inode);
6397*4882a593Smuzhiyun }
6398*4882a593Smuzhiyun
6399*4882a593Smuzhiyun /* Don't account quota for quota files to avoid recursion */
6400*4882a593Smuzhiyun qf_inode->i_flags |= S_NOQUOTA;
6401*4882a593Smuzhiyun lockdep_set_quota_inode(qf_inode, I_DATA_SEM_QUOTA);
6402*4882a593Smuzhiyun err = dquot_load_quota_inode(qf_inode, type, format_id, flags);
6403*4882a593Smuzhiyun if (err)
6404*4882a593Smuzhiyun lockdep_set_quota_inode(qf_inode, I_DATA_SEM_NORMAL);
6405*4882a593Smuzhiyun iput(qf_inode);
6406*4882a593Smuzhiyun
6407*4882a593Smuzhiyun return err;
6408*4882a593Smuzhiyun }
6409*4882a593Smuzhiyun
6410*4882a593Smuzhiyun /* Enable usage tracking for all quota types. */
ext4_enable_quotas(struct super_block * sb)6411*4882a593Smuzhiyun static int ext4_enable_quotas(struct super_block *sb)
6412*4882a593Smuzhiyun {
6413*4882a593Smuzhiyun int type, err = 0;
6414*4882a593Smuzhiyun unsigned long qf_inums[EXT4_MAXQUOTAS] = {
6415*4882a593Smuzhiyun le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum),
6416*4882a593Smuzhiyun le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum),
6417*4882a593Smuzhiyun le32_to_cpu(EXT4_SB(sb)->s_es->s_prj_quota_inum)
6418*4882a593Smuzhiyun };
6419*4882a593Smuzhiyun bool quota_mopt[EXT4_MAXQUOTAS] = {
6420*4882a593Smuzhiyun test_opt(sb, USRQUOTA),
6421*4882a593Smuzhiyun test_opt(sb, GRPQUOTA),
6422*4882a593Smuzhiyun test_opt(sb, PRJQUOTA),
6423*4882a593Smuzhiyun };
6424*4882a593Smuzhiyun
6425*4882a593Smuzhiyun sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE | DQUOT_NOLIST_DIRTY;
6426*4882a593Smuzhiyun for (type = 0; type < EXT4_MAXQUOTAS; type++) {
6427*4882a593Smuzhiyun if (qf_inums[type]) {
6428*4882a593Smuzhiyun err = ext4_quota_enable(sb, type, QFMT_VFS_V1,
6429*4882a593Smuzhiyun DQUOT_USAGE_ENABLED |
6430*4882a593Smuzhiyun (quota_mopt[type] ? DQUOT_LIMITS_ENABLED : 0));
6431*4882a593Smuzhiyun if (err) {
6432*4882a593Smuzhiyun ext4_warning(sb,
6433*4882a593Smuzhiyun "Failed to enable quota tracking "
6434*4882a593Smuzhiyun "(type=%d, err=%d). Please run "
6435*4882a593Smuzhiyun "e2fsck to fix.", type, err);
6436*4882a593Smuzhiyun for (type--; type >= 0; type--) {
6437*4882a593Smuzhiyun struct inode *inode;
6438*4882a593Smuzhiyun
6439*4882a593Smuzhiyun inode = sb_dqopt(sb)->files[type];
6440*4882a593Smuzhiyun if (inode)
6441*4882a593Smuzhiyun inode = igrab(inode);
6442*4882a593Smuzhiyun dquot_quota_off(sb, type);
6443*4882a593Smuzhiyun if (inode) {
6444*4882a593Smuzhiyun lockdep_set_quota_inode(inode,
6445*4882a593Smuzhiyun I_DATA_SEM_NORMAL);
6446*4882a593Smuzhiyun iput(inode);
6447*4882a593Smuzhiyun }
6448*4882a593Smuzhiyun }
6449*4882a593Smuzhiyun
6450*4882a593Smuzhiyun return err;
6451*4882a593Smuzhiyun }
6452*4882a593Smuzhiyun }
6453*4882a593Smuzhiyun }
6454*4882a593Smuzhiyun return 0;
6455*4882a593Smuzhiyun }
6456*4882a593Smuzhiyun
ext4_quota_off(struct super_block * sb,int type)6457*4882a593Smuzhiyun static int ext4_quota_off(struct super_block *sb, int type)
6458*4882a593Smuzhiyun {
6459*4882a593Smuzhiyun struct inode *inode = sb_dqopt(sb)->files[type];
6460*4882a593Smuzhiyun handle_t *handle;
6461*4882a593Smuzhiyun int err;
6462*4882a593Smuzhiyun
6463*4882a593Smuzhiyun /* Force all delayed allocation blocks to be allocated.
6464*4882a593Smuzhiyun * Caller already holds s_umount sem */
6465*4882a593Smuzhiyun if (test_opt(sb, DELALLOC))
6466*4882a593Smuzhiyun sync_filesystem(sb);
6467*4882a593Smuzhiyun
6468*4882a593Smuzhiyun if (!inode || !igrab(inode))
6469*4882a593Smuzhiyun goto out;
6470*4882a593Smuzhiyun
6471*4882a593Smuzhiyun err = dquot_quota_off(sb, type);
6472*4882a593Smuzhiyun if (err || ext4_has_feature_quota(sb))
6473*4882a593Smuzhiyun goto out_put;
6474*4882a593Smuzhiyun
6475*4882a593Smuzhiyun inode_lock(inode);
6476*4882a593Smuzhiyun /*
6477*4882a593Smuzhiyun * Update modification times of quota files when userspace can
6478*4882a593Smuzhiyun * start looking at them. If we fail, we return success anyway since
6479*4882a593Smuzhiyun * this is not a hard failure and quotas are already disabled.
6480*4882a593Smuzhiyun */
6481*4882a593Smuzhiyun handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1);
6482*4882a593Smuzhiyun if (IS_ERR(handle)) {
6483*4882a593Smuzhiyun err = PTR_ERR(handle);
6484*4882a593Smuzhiyun goto out_unlock;
6485*4882a593Smuzhiyun }
6486*4882a593Smuzhiyun EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL);
6487*4882a593Smuzhiyun inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
6488*4882a593Smuzhiyun inode->i_mtime = inode->i_ctime = current_time(inode);
6489*4882a593Smuzhiyun err = ext4_mark_inode_dirty(handle, inode);
6490*4882a593Smuzhiyun ext4_journal_stop(handle);
6491*4882a593Smuzhiyun out_unlock:
6492*4882a593Smuzhiyun inode_unlock(inode);
6493*4882a593Smuzhiyun out_put:
6494*4882a593Smuzhiyun lockdep_set_quota_inode(inode, I_DATA_SEM_NORMAL);
6495*4882a593Smuzhiyun iput(inode);
6496*4882a593Smuzhiyun return err;
6497*4882a593Smuzhiyun out:
6498*4882a593Smuzhiyun return dquot_quota_off(sb, type);
6499*4882a593Smuzhiyun }
6500*4882a593Smuzhiyun
6501*4882a593Smuzhiyun /* Read data from quotafile - avoid pagecache and such because we cannot afford
6502*4882a593Smuzhiyun * acquiring the locks... As quota files are never truncated and quota code
6503*4882a593Smuzhiyun * itself serializes the operations (and no one else should touch the files)
6504*4882a593Smuzhiyun * we don't have to be afraid of races */
ext4_quota_read(struct super_block * sb,int type,char * data,size_t len,loff_t off)6505*4882a593Smuzhiyun static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
6506*4882a593Smuzhiyun size_t len, loff_t off)
6507*4882a593Smuzhiyun {
6508*4882a593Smuzhiyun struct inode *inode = sb_dqopt(sb)->files[type];
6509*4882a593Smuzhiyun ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb);
6510*4882a593Smuzhiyun int offset = off & (sb->s_blocksize - 1);
6511*4882a593Smuzhiyun int tocopy;
6512*4882a593Smuzhiyun size_t toread;
6513*4882a593Smuzhiyun struct buffer_head *bh;
6514*4882a593Smuzhiyun loff_t i_size = i_size_read(inode);
6515*4882a593Smuzhiyun
6516*4882a593Smuzhiyun if (off > i_size)
6517*4882a593Smuzhiyun return 0;
6518*4882a593Smuzhiyun if (off+len > i_size)
6519*4882a593Smuzhiyun len = i_size-off;
6520*4882a593Smuzhiyun toread = len;
6521*4882a593Smuzhiyun while (toread > 0) {
6522*4882a593Smuzhiyun tocopy = sb->s_blocksize - offset < toread ?
6523*4882a593Smuzhiyun sb->s_blocksize - offset : toread;
6524*4882a593Smuzhiyun bh = ext4_bread(NULL, inode, blk, 0);
6525*4882a593Smuzhiyun if (IS_ERR(bh))
6526*4882a593Smuzhiyun return PTR_ERR(bh);
6527*4882a593Smuzhiyun if (!bh) /* A hole? */
6528*4882a593Smuzhiyun memset(data, 0, tocopy);
6529*4882a593Smuzhiyun else
6530*4882a593Smuzhiyun memcpy(data, bh->b_data+offset, tocopy);
6531*4882a593Smuzhiyun brelse(bh);
6532*4882a593Smuzhiyun offset = 0;
6533*4882a593Smuzhiyun toread -= tocopy;
6534*4882a593Smuzhiyun data += tocopy;
6535*4882a593Smuzhiyun blk++;
6536*4882a593Smuzhiyun }
6537*4882a593Smuzhiyun return len;
6538*4882a593Smuzhiyun }
6539*4882a593Smuzhiyun
6540*4882a593Smuzhiyun /* Write to quotafile (we know the transaction is already started and has
6541*4882a593Smuzhiyun * enough credits) */
ext4_quota_write(struct super_block * sb,int type,const char * data,size_t len,loff_t off)6542*4882a593Smuzhiyun static ssize_t ext4_quota_write(struct super_block *sb, int type,
6543*4882a593Smuzhiyun const char *data, size_t len, loff_t off)
6544*4882a593Smuzhiyun {
6545*4882a593Smuzhiyun struct inode *inode = sb_dqopt(sb)->files[type];
6546*4882a593Smuzhiyun ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb);
6547*4882a593Smuzhiyun int err = 0, err2 = 0, offset = off & (sb->s_blocksize - 1);
6548*4882a593Smuzhiyun int retries = 0;
6549*4882a593Smuzhiyun struct buffer_head *bh;
6550*4882a593Smuzhiyun handle_t *handle = journal_current_handle();
6551*4882a593Smuzhiyun
6552*4882a593Smuzhiyun if (!handle) {
6553*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Quota write (off=%llu, len=%llu)"
6554*4882a593Smuzhiyun " cancelled because transaction is not started",
6555*4882a593Smuzhiyun (unsigned long long)off, (unsigned long long)len);
6556*4882a593Smuzhiyun return -EIO;
6557*4882a593Smuzhiyun }
6558*4882a593Smuzhiyun /*
6559*4882a593Smuzhiyun * Since we account only one data block in transaction credits,
6560*4882a593Smuzhiyun * then it is impossible to cross a block boundary.
6561*4882a593Smuzhiyun */
6562*4882a593Smuzhiyun if (sb->s_blocksize - offset < len) {
6563*4882a593Smuzhiyun ext4_msg(sb, KERN_WARNING, "Quota write (off=%llu, len=%llu)"
6564*4882a593Smuzhiyun " cancelled because not block aligned",
6565*4882a593Smuzhiyun (unsigned long long)off, (unsigned long long)len);
6566*4882a593Smuzhiyun return -EIO;
6567*4882a593Smuzhiyun }
6568*4882a593Smuzhiyun
6569*4882a593Smuzhiyun do {
6570*4882a593Smuzhiyun bh = ext4_bread(handle, inode, blk,
6571*4882a593Smuzhiyun EXT4_GET_BLOCKS_CREATE |
6572*4882a593Smuzhiyun EXT4_GET_BLOCKS_METADATA_NOFAIL);
6573*4882a593Smuzhiyun } while (PTR_ERR(bh) == -ENOSPC &&
6574*4882a593Smuzhiyun ext4_should_retry_alloc(inode->i_sb, &retries));
6575*4882a593Smuzhiyun if (IS_ERR(bh))
6576*4882a593Smuzhiyun return PTR_ERR(bh);
6577*4882a593Smuzhiyun if (!bh)
6578*4882a593Smuzhiyun goto out;
6579*4882a593Smuzhiyun BUFFER_TRACE(bh, "get write access");
6580*4882a593Smuzhiyun err = ext4_journal_get_write_access(handle, bh);
6581*4882a593Smuzhiyun if (err) {
6582*4882a593Smuzhiyun brelse(bh);
6583*4882a593Smuzhiyun return err;
6584*4882a593Smuzhiyun }
6585*4882a593Smuzhiyun lock_buffer(bh);
6586*4882a593Smuzhiyun memcpy(bh->b_data+offset, data, len);
6587*4882a593Smuzhiyun flush_dcache_page(bh->b_page);
6588*4882a593Smuzhiyun unlock_buffer(bh);
6589*4882a593Smuzhiyun err = ext4_handle_dirty_metadata(handle, NULL, bh);
6590*4882a593Smuzhiyun brelse(bh);
6591*4882a593Smuzhiyun out:
6592*4882a593Smuzhiyun if (inode->i_size < off + len) {
6593*4882a593Smuzhiyun i_size_write(inode, off + len);
6594*4882a593Smuzhiyun EXT4_I(inode)->i_disksize = inode->i_size;
6595*4882a593Smuzhiyun err2 = ext4_mark_inode_dirty(handle, inode);
6596*4882a593Smuzhiyun if (unlikely(err2 && !err))
6597*4882a593Smuzhiyun err = err2;
6598*4882a593Smuzhiyun }
6599*4882a593Smuzhiyun return err ? err : len;
6600*4882a593Smuzhiyun }
6601*4882a593Smuzhiyun #endif
6602*4882a593Smuzhiyun
ext4_mount(struct file_system_type * fs_type,int flags,const char * dev_name,void * data)6603*4882a593Smuzhiyun static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
6604*4882a593Smuzhiyun const char *dev_name, void *data)
6605*4882a593Smuzhiyun {
6606*4882a593Smuzhiyun return mount_bdev(fs_type, flags, dev_name, data, ext4_fill_super);
6607*4882a593Smuzhiyun }
6608*4882a593Smuzhiyun
6609*4882a593Smuzhiyun #if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT2)
register_as_ext2(void)6610*4882a593Smuzhiyun static inline void register_as_ext2(void)
6611*4882a593Smuzhiyun {
6612*4882a593Smuzhiyun int err = register_filesystem(&ext2_fs_type);
6613*4882a593Smuzhiyun if (err)
6614*4882a593Smuzhiyun printk(KERN_WARNING
6615*4882a593Smuzhiyun "EXT4-fs: Unable to register as ext2 (%d)\n", err);
6616*4882a593Smuzhiyun }
6617*4882a593Smuzhiyun
unregister_as_ext2(void)6618*4882a593Smuzhiyun static inline void unregister_as_ext2(void)
6619*4882a593Smuzhiyun {
6620*4882a593Smuzhiyun unregister_filesystem(&ext2_fs_type);
6621*4882a593Smuzhiyun }
6622*4882a593Smuzhiyun
ext2_feature_set_ok(struct super_block * sb)6623*4882a593Smuzhiyun static inline int ext2_feature_set_ok(struct super_block *sb)
6624*4882a593Smuzhiyun {
6625*4882a593Smuzhiyun if (ext4_has_unknown_ext2_incompat_features(sb))
6626*4882a593Smuzhiyun return 0;
6627*4882a593Smuzhiyun if (sb_rdonly(sb))
6628*4882a593Smuzhiyun return 1;
6629*4882a593Smuzhiyun if (ext4_has_unknown_ext2_ro_compat_features(sb))
6630*4882a593Smuzhiyun return 0;
6631*4882a593Smuzhiyun return 1;
6632*4882a593Smuzhiyun }
6633*4882a593Smuzhiyun #else
register_as_ext2(void)6634*4882a593Smuzhiyun static inline void register_as_ext2(void) { }
unregister_as_ext2(void)6635*4882a593Smuzhiyun static inline void unregister_as_ext2(void) { }
ext2_feature_set_ok(struct super_block * sb)6636*4882a593Smuzhiyun static inline int ext2_feature_set_ok(struct super_block *sb) { return 0; }
6637*4882a593Smuzhiyun #endif
6638*4882a593Smuzhiyun
register_as_ext3(void)6639*4882a593Smuzhiyun static inline void register_as_ext3(void)
6640*4882a593Smuzhiyun {
6641*4882a593Smuzhiyun int err = register_filesystem(&ext3_fs_type);
6642*4882a593Smuzhiyun if (err)
6643*4882a593Smuzhiyun printk(KERN_WARNING
6644*4882a593Smuzhiyun "EXT4-fs: Unable to register as ext3 (%d)\n", err);
6645*4882a593Smuzhiyun }
6646*4882a593Smuzhiyun
unregister_as_ext3(void)6647*4882a593Smuzhiyun static inline void unregister_as_ext3(void)
6648*4882a593Smuzhiyun {
6649*4882a593Smuzhiyun unregister_filesystem(&ext3_fs_type);
6650*4882a593Smuzhiyun }
6651*4882a593Smuzhiyun
ext3_feature_set_ok(struct super_block * sb)6652*4882a593Smuzhiyun static inline int ext3_feature_set_ok(struct super_block *sb)
6653*4882a593Smuzhiyun {
6654*4882a593Smuzhiyun if (ext4_has_unknown_ext3_incompat_features(sb))
6655*4882a593Smuzhiyun return 0;
6656*4882a593Smuzhiyun if (!ext4_has_feature_journal(sb))
6657*4882a593Smuzhiyun return 0;
6658*4882a593Smuzhiyun if (sb_rdonly(sb))
6659*4882a593Smuzhiyun return 1;
6660*4882a593Smuzhiyun if (ext4_has_unknown_ext3_ro_compat_features(sb))
6661*4882a593Smuzhiyun return 0;
6662*4882a593Smuzhiyun return 1;
6663*4882a593Smuzhiyun }
6664*4882a593Smuzhiyun
6665*4882a593Smuzhiyun static struct file_system_type ext4_fs_type = {
6666*4882a593Smuzhiyun .owner = THIS_MODULE,
6667*4882a593Smuzhiyun .name = "ext4",
6668*4882a593Smuzhiyun .mount = ext4_mount,
6669*4882a593Smuzhiyun .kill_sb = kill_block_super,
6670*4882a593Smuzhiyun .fs_flags = FS_REQUIRES_DEV,
6671*4882a593Smuzhiyun };
6672*4882a593Smuzhiyun MODULE_ALIAS_FS("ext4");
6673*4882a593Smuzhiyun
6674*4882a593Smuzhiyun /* Shared across all ext4 file systems */
6675*4882a593Smuzhiyun wait_queue_head_t ext4__ioend_wq[EXT4_WQ_HASH_SZ];
6676*4882a593Smuzhiyun
ext4_init_fs(void)6677*4882a593Smuzhiyun static int __init ext4_init_fs(void)
6678*4882a593Smuzhiyun {
6679*4882a593Smuzhiyun int i, err;
6680*4882a593Smuzhiyun
6681*4882a593Smuzhiyun ratelimit_state_init(&ext4_mount_msg_ratelimit, 30 * HZ, 64);
6682*4882a593Smuzhiyun ext4_li_info = NULL;
6683*4882a593Smuzhiyun mutex_init(&ext4_li_mtx);
6684*4882a593Smuzhiyun
6685*4882a593Smuzhiyun /* Build-time check for flags consistency */
6686*4882a593Smuzhiyun ext4_check_flag_values();
6687*4882a593Smuzhiyun
6688*4882a593Smuzhiyun for (i = 0; i < EXT4_WQ_HASH_SZ; i++)
6689*4882a593Smuzhiyun init_waitqueue_head(&ext4__ioend_wq[i]);
6690*4882a593Smuzhiyun
6691*4882a593Smuzhiyun err = ext4_init_es();
6692*4882a593Smuzhiyun if (err)
6693*4882a593Smuzhiyun return err;
6694*4882a593Smuzhiyun
6695*4882a593Smuzhiyun err = ext4_init_pending();
6696*4882a593Smuzhiyun if (err)
6697*4882a593Smuzhiyun goto out7;
6698*4882a593Smuzhiyun
6699*4882a593Smuzhiyun err = ext4_init_post_read_processing();
6700*4882a593Smuzhiyun if (err)
6701*4882a593Smuzhiyun goto out6;
6702*4882a593Smuzhiyun
6703*4882a593Smuzhiyun err = ext4_init_pageio();
6704*4882a593Smuzhiyun if (err)
6705*4882a593Smuzhiyun goto out5;
6706*4882a593Smuzhiyun
6707*4882a593Smuzhiyun err = ext4_init_system_zone();
6708*4882a593Smuzhiyun if (err)
6709*4882a593Smuzhiyun goto out4;
6710*4882a593Smuzhiyun
6711*4882a593Smuzhiyun err = ext4_init_sysfs();
6712*4882a593Smuzhiyun if (err)
6713*4882a593Smuzhiyun goto out3;
6714*4882a593Smuzhiyun
6715*4882a593Smuzhiyun err = ext4_init_mballoc();
6716*4882a593Smuzhiyun if (err)
6717*4882a593Smuzhiyun goto out2;
6718*4882a593Smuzhiyun err = init_inodecache();
6719*4882a593Smuzhiyun if (err)
6720*4882a593Smuzhiyun goto out1;
6721*4882a593Smuzhiyun
6722*4882a593Smuzhiyun err = ext4_fc_init_dentry_cache();
6723*4882a593Smuzhiyun if (err)
6724*4882a593Smuzhiyun goto out05;
6725*4882a593Smuzhiyun
6726*4882a593Smuzhiyun register_as_ext3();
6727*4882a593Smuzhiyun register_as_ext2();
6728*4882a593Smuzhiyun err = register_filesystem(&ext4_fs_type);
6729*4882a593Smuzhiyun if (err)
6730*4882a593Smuzhiyun goto out;
6731*4882a593Smuzhiyun
6732*4882a593Smuzhiyun return 0;
6733*4882a593Smuzhiyun out:
6734*4882a593Smuzhiyun unregister_as_ext2();
6735*4882a593Smuzhiyun unregister_as_ext3();
6736*4882a593Smuzhiyun ext4_fc_destroy_dentry_cache();
6737*4882a593Smuzhiyun out05:
6738*4882a593Smuzhiyun destroy_inodecache();
6739*4882a593Smuzhiyun out1:
6740*4882a593Smuzhiyun ext4_exit_mballoc();
6741*4882a593Smuzhiyun out2:
6742*4882a593Smuzhiyun ext4_exit_sysfs();
6743*4882a593Smuzhiyun out3:
6744*4882a593Smuzhiyun ext4_exit_system_zone();
6745*4882a593Smuzhiyun out4:
6746*4882a593Smuzhiyun ext4_exit_pageio();
6747*4882a593Smuzhiyun out5:
6748*4882a593Smuzhiyun ext4_exit_post_read_processing();
6749*4882a593Smuzhiyun out6:
6750*4882a593Smuzhiyun ext4_exit_pending();
6751*4882a593Smuzhiyun out7:
6752*4882a593Smuzhiyun ext4_exit_es();
6753*4882a593Smuzhiyun
6754*4882a593Smuzhiyun return err;
6755*4882a593Smuzhiyun }
6756*4882a593Smuzhiyun
ext4_exit_fs(void)6757*4882a593Smuzhiyun static void __exit ext4_exit_fs(void)
6758*4882a593Smuzhiyun {
6759*4882a593Smuzhiyun ext4_destroy_lazyinit_thread();
6760*4882a593Smuzhiyun unregister_as_ext2();
6761*4882a593Smuzhiyun unregister_as_ext3();
6762*4882a593Smuzhiyun unregister_filesystem(&ext4_fs_type);
6763*4882a593Smuzhiyun ext4_fc_destroy_dentry_cache();
6764*4882a593Smuzhiyun destroy_inodecache();
6765*4882a593Smuzhiyun ext4_exit_mballoc();
6766*4882a593Smuzhiyun ext4_exit_sysfs();
6767*4882a593Smuzhiyun ext4_exit_system_zone();
6768*4882a593Smuzhiyun ext4_exit_pageio();
6769*4882a593Smuzhiyun ext4_exit_post_read_processing();
6770*4882a593Smuzhiyun ext4_exit_es();
6771*4882a593Smuzhiyun ext4_exit_pending();
6772*4882a593Smuzhiyun }
6773*4882a593Smuzhiyun
6774*4882a593Smuzhiyun MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");
6775*4882a593Smuzhiyun MODULE_DESCRIPTION("Fourth Extended Filesystem");
6776*4882a593Smuzhiyun MODULE_LICENSE("GPL");
6777*4882a593Smuzhiyun MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);
6778*4882a593Smuzhiyun MODULE_SOFTDEP("pre: crc32c");
6779*4882a593Smuzhiyun module_init(ext4_init_fs)
6780*4882a593Smuzhiyun module_exit(ext4_exit_fs)
6781