Lines Matching refs:sb
66 static int ext4_commit_super(struct super_block *sb, int sync);
67 static void ext4_mark_recovery_complete(struct super_block *sb,
69 static void ext4_clear_journal_err(struct super_block *sb,
71 static int ext4_sync_fs(struct super_block *sb, int wait);
72 static int ext4_remount(struct super_block *sb, int *flags, char *data);
74 static int ext4_unfreeze(struct super_block *sb);
75 static int ext4_freeze(struct super_block *sb);
78 static inline int ext2_feature_set_ok(struct super_block *sb);
79 static inline int ext3_feature_set_ok(struct super_block *sb);
80 static int ext4_feature_set_ok(struct super_block *sb, int readonly);
82 static void ext4_unregister_li_request(struct super_block *sb);
96 #define IS_EXT2_SB(sb) ((sb)->s_bdev->bd_holder == &ext2_fs_type) argument
98 #define IS_EXT2_SB(sb) (0) argument
112 #define IS_EXT3_SB(sb) ((sb)->s_bdev->bd_holder == &ext3_fs_type) argument
114 #define IS_EXT3_SB(sb) (0) argument
117 static int ext4_verify_csum_type(struct super_block *sb, in ext4_verify_csum_type() argument
120 if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_verify_csum_type()
127 static __le32 ext4_superblock_csum(struct super_block *sb, in ext4_superblock_csum() argument
130 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_superblock_csum()
139 static int ext4_superblock_csum_verify(struct super_block *sb, in ext4_superblock_csum_verify() argument
142 if (!ext4_has_metadata_csum(sb)) in ext4_superblock_csum_verify()
145 return es->s_checksum == ext4_superblock_csum(sb, es); in ext4_superblock_csum_verify()
148 void ext4_superblock_csum_set(struct super_block *sb) in ext4_superblock_csum_set() argument
150 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_superblock_csum_set()
152 if (!ext4_has_metadata_csum(sb)) in ext4_superblock_csum_set()
155 es->s_checksum = ext4_superblock_csum(sb, es); in ext4_superblock_csum_set()
178 ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, in ext4_block_bitmap() argument
182 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_block_bitmap()
186 ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb, in ext4_inode_bitmap() argument
190 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_inode_bitmap()
194 ext4_fsblk_t ext4_inode_table(struct super_block *sb, in ext4_inode_table() argument
198 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_inode_table()
202 __u32 ext4_free_group_clusters(struct super_block *sb, in ext4_free_group_clusters() argument
206 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_free_group_clusters()
210 __u32 ext4_free_inodes_count(struct super_block *sb, in ext4_free_inodes_count() argument
214 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_free_inodes_count()
218 __u32 ext4_used_dirs_count(struct super_block *sb, in ext4_used_dirs_count() argument
222 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_used_dirs_count()
226 __u32 ext4_itable_unused_count(struct super_block *sb, in ext4_itable_unused_count() argument
230 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_itable_unused_count()
234 void ext4_block_bitmap_set(struct super_block *sb, in ext4_block_bitmap_set() argument
238 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_block_bitmap_set()
242 void ext4_inode_bitmap_set(struct super_block *sb, in ext4_inode_bitmap_set() argument
246 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_inode_bitmap_set()
250 void ext4_inode_table_set(struct super_block *sb, in ext4_inode_table_set() argument
254 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_inode_table_set()
258 void ext4_free_group_clusters_set(struct super_block *sb, in ext4_free_group_clusters_set() argument
262 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_free_group_clusters_set()
266 void ext4_free_inodes_set(struct super_block *sb, in ext4_free_inodes_set() argument
270 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_free_inodes_set()
274 void ext4_used_dirs_set(struct super_block *sb, in ext4_used_dirs_set() argument
278 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_used_dirs_set()
282 void ext4_itable_unused_set(struct super_block *sb, in ext4_itable_unused_set() argument
286 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_itable_unused_set()
291 static void __save_error_info(struct super_block *sb, const char *func, in __save_error_info() argument
294 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in __save_error_info()
296 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in __save_error_info()
297 if (bdev_read_only(sb->s_bdev)) in __save_error_info()
316 mod_timer(&EXT4_SB(sb)->s_err_report, jiffies + 24*60*60*HZ); in __save_error_info()
320 static void save_error_info(struct super_block *sb, const char *func, in save_error_info() argument
323 __save_error_info(sb, func, line); in save_error_info()
324 ext4_commit_super(sb, 1); in save_error_info()
335 static int block_device_ejected(struct super_block *sb) in block_device_ejected() argument
337 struct inode *bd_inode = sb->s_bdev->bd_inode; in block_device_ejected()
345 struct super_block *sb = journal->j_private; in ext4_journal_commit_callback() local
346 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_journal_commit_callback()
357 jce->jce_func(sb, jce, error); in ext4_journal_commit_callback()
378 static void ext4_handle_error(struct super_block *sb) in ext4_handle_error() argument
380 if (sb->s_flags & MS_RDONLY) in ext4_handle_error()
383 if (!test_opt(sb, ERRORS_CONT)) { in ext4_handle_error()
384 journal_t *journal = EXT4_SB(sb)->s_journal; in ext4_handle_error()
386 EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED; in ext4_handle_error()
390 if (test_opt(sb, ERRORS_RO)) { in ext4_handle_error()
391 ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only"); in ext4_handle_error()
397 sb->s_flags |= MS_RDONLY; in ext4_handle_error()
399 if (test_opt(sb, ERRORS_PANIC)) { in ext4_handle_error()
400 if (EXT4_SB(sb)->s_journal && in ext4_handle_error()
401 !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR)) in ext4_handle_error()
404 sb->s_id); in ext4_handle_error()
408 #define ext4_error_ratelimit(sb) \ argument
409 ___ratelimit(&(EXT4_SB(sb)->s_err_ratelimit_state), \
412 void __ext4_error(struct super_block *sb, const char *function, in __ext4_error() argument
418 if (ext4_error_ratelimit(sb)) { in __ext4_error()
424 sb->s_id, function, line, current->comm, &vaf); in __ext4_error()
427 save_error_info(sb, function, line); in __ext4_error()
428 ext4_handle_error(sb); in __ext4_error()
498 const char *ext4_decode_error(struct super_block *sb, int errno, in ext4_decode_error() argument
511 if (!sb || (EXT4_SB(sb)->s_journal && in ext4_decode_error()
512 EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT)) in ext4_decode_error()
535 void __ext4_std_error(struct super_block *sb, const char *function, in __ext4_std_error() argument
545 (sb->s_flags & MS_RDONLY)) in __ext4_std_error()
548 if (ext4_error_ratelimit(sb)) { in __ext4_std_error()
549 errstr = ext4_decode_error(sb, errno, nbuf); in __ext4_std_error()
551 sb->s_id, function, line, errstr); in __ext4_std_error()
554 save_error_info(sb, function, line); in __ext4_std_error()
555 ext4_handle_error(sb); in __ext4_std_error()
568 void __ext4_abort(struct super_block *sb, const char *function, in __ext4_abort() argument
573 save_error_info(sb, function, line); in __ext4_abort()
575 printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: ", sb->s_id, in __ext4_abort()
581 if ((sb->s_flags & MS_RDONLY) == 0) { in __ext4_abort()
582 ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only"); in __ext4_abort()
583 EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED; in __ext4_abort()
589 sb->s_flags |= MS_RDONLY; in __ext4_abort()
590 if (EXT4_SB(sb)->s_journal) in __ext4_abort()
591 jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); in __ext4_abort()
592 save_error_info(sb, function, line); in __ext4_abort()
594 if (test_opt(sb, ERRORS_PANIC)) { in __ext4_abort()
595 if (EXT4_SB(sb)->s_journal && in __ext4_abort()
596 !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR)) in __ext4_abort()
602 void __ext4_msg(struct super_block *sb, in __ext4_msg() argument
608 if (!___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs")) in __ext4_msg()
614 printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf); in __ext4_msg()
618 void __ext4_warning(struct super_block *sb, const char *function, in __ext4_warning() argument
624 if (!___ratelimit(&(EXT4_SB(sb)->s_warning_ratelimit_state), in __ext4_warning()
632 sb->s_id, function, line, &vaf); in __ext4_warning()
637 struct super_block *sb, ext4_group_t grp, in __ext4_grp_locked_error() argument
645 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in __ext4_grp_locked_error()
649 __save_error_info(sb, function, line); in __ext4_grp_locked_error()
651 if (ext4_error_ratelimit(sb)) { in __ext4_grp_locked_error()
656 sb->s_id, function, line, grp); in __ext4_grp_locked_error()
666 if (test_opt(sb, ERRORS_CONT)) { in __ext4_grp_locked_error()
667 ext4_commit_super(sb, 0); in __ext4_grp_locked_error()
671 ext4_unlock_group(sb, grp); in __ext4_grp_locked_error()
672 ext4_handle_error(sb); in __ext4_grp_locked_error()
684 ext4_lock_group(sb, grp); in __ext4_grp_locked_error()
688 void ext4_update_dynamic_rev(struct super_block *sb) in ext4_update_dynamic_rev() argument
690 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_update_dynamic_rev()
695 ext4_warning(sb, in ext4_update_dynamic_rev()
716 static struct block_device *ext4_blkdev_get(dev_t dev, struct super_block *sb) in ext4_blkdev_get() argument
721 bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); in ext4_blkdev_get()
727 ext4_msg(sb, KERN_ERR, "failed to open journal device %s: %ld", in ext4_blkdev_get()
755 static void dump_orphan_list(struct super_block *sb, struct ext4_sb_info *sbi) in dump_orphan_list() argument
759 ext4_msg(sb, KERN_ERR, "sb orphan head is %d", in dump_orphan_list()
773 static void ext4_put_super(struct super_block *sb) in ext4_put_super() argument
775 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_put_super()
779 ext4_unregister_li_request(sb); in ext4_put_super()
780 dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); in ext4_put_super()
789 ext4_abort(sb, "Couldn't clean up the journal"); in ext4_put_super()
794 ext4_release_system_zone(sb); in ext4_put_super()
795 ext4_mb_release(sb); in ext4_put_super()
796 ext4_ext_release(sb); in ext4_put_super()
797 ext4_xattr_put_super(sb); in ext4_put_super()
799 if (!(sb->s_flags & MS_RDONLY)) { in ext4_put_super()
800 EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_put_super()
803 if (!(sb->s_flags & MS_RDONLY)) in ext4_put_super()
804 ext4_commit_super(sb, 1); in ext4_put_super()
808 remove_proc_entry(sb->s_id, ext4_proc_root); in ext4_put_super()
831 dump_orphan_list(sb, sbi); in ext4_put_super()
834 sync_blockdev(sb->s_bdev); in ext4_put_super()
835 invalidate_bdev(sb->s_bdev); in ext4_put_super()
836 if (sbi->journal_bdev && sbi->journal_bdev != sb->s_bdev) { in ext4_put_super()
852 sb->s_fs_info = NULL; in ext4_put_super()
870 static struct inode *ext4_alloc_inode(struct super_block *sb) in ext4_alloc_inode() argument
989 static struct inode *ext4_nfs_get_inode(struct super_block *sb, in ext4_nfs_get_inode() argument
994 if (ino < EXT4_FIRST_INO(sb) && ino != EXT4_ROOT_INO) in ext4_nfs_get_inode()
996 if (ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)) in ext4_nfs_get_inode()
1007 inode = ext4_iget_normal(sb, ino); in ext4_nfs_get_inode()
1018 static struct dentry *ext4_fh_to_dentry(struct super_block *sb, struct fid *fid, in ext4_fh_to_dentry() argument
1021 return generic_fh_to_dentry(sb, fid, fh_len, fh_type, in ext4_fh_to_dentry()
1025 static struct dentry *ext4_fh_to_parent(struct super_block *sb, struct fid *fid, in ext4_fh_to_parent() argument
1028 return generic_fh_to_parent(sb, fid, fh_len, fh_type, in ext4_fh_to_parent()
1038 static int bdev_try_to_free_page(struct super_block *sb, struct page *page, in bdev_try_to_free_page() argument
1041 journal_t *journal = EXT4_SB(sb)->s_journal; in bdev_try_to_free_page()
1060 static int ext4_write_info(struct super_block *sb, int type);
1061 static int ext4_quota_on(struct super_block *sb, int type, int format_id,
1063 static int ext4_quota_off(struct super_block *sb, int type);
1064 static int ext4_quota_on_mount(struct super_block *sb, int type);
1065 static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
1067 static ssize_t ext4_quota_write(struct super_block *sb, int type,
1069 static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
1071 static int ext4_enable_quotas(struct super_block *sb);
1265 static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) in set_qf_name() argument
1267 struct ext4_sb_info *sbi = EXT4_SB(sb); in set_qf_name()
1271 if (sb_any_quota_loaded(sb) && in set_qf_name()
1273 ext4_msg(sb, KERN_ERR, in set_qf_name()
1278 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) { in set_qf_name()
1279 ext4_msg(sb, KERN_INFO, "Journaled quota options " in set_qf_name()
1285 ext4_msg(sb, KERN_ERR, in set_qf_name()
1293 ext4_msg(sb, KERN_ERR, in set_qf_name()
1299 ext4_msg(sb, KERN_ERR, in set_qf_name()
1304 set_opt(sb, QUOTA); in set_qf_name()
1311 static int clear_qf_name(struct super_block *sb, int qtype) in clear_qf_name() argument
1314 struct ext4_sb_info *sbi = EXT4_SB(sb); in clear_qf_name()
1316 if (sb_any_quota_loaded(sb) && in clear_qf_name()
1318 ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options" in clear_qf_name()
1434 static int handle_mount_opt(struct super_block *sb, char *opt, int token, in handle_mount_opt() argument
1438 struct ext4_sb_info *sbi = EXT4_SB(sb); in handle_mount_opt()
1446 return set_qf_name(sb, USRQUOTA, &args[0]); in handle_mount_opt()
1448 return set_qf_name(sb, GRPQUOTA, &args[0]); in handle_mount_opt()
1450 return clear_qf_name(sb, USRQUOTA); in handle_mount_opt()
1452 return clear_qf_name(sb, GRPQUOTA); in handle_mount_opt()
1457 ext4_msg(sb, KERN_WARNING, deprecated_msg, opt, "3.5"); in handle_mount_opt()
1462 ext4_msg(sb, KERN_WARNING, "Ignoring removed %s option", opt); in handle_mount_opt()
1468 sb->s_flags |= MS_I_VERSION; in handle_mount_opt()
1471 sb->s_flags |= MS_LAZYTIME; in handle_mount_opt()
1474 sb->s_flags &= ~MS_LAZYTIME; in handle_mount_opt()
1483 ext4_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" " in handle_mount_opt()
1488 if ((m->flags & MOPT_NO_EXT2) && IS_EXT2_SB(sb)) { in handle_mount_opt()
1489 ext4_msg(sb, KERN_ERR, in handle_mount_opt()
1493 if ((m->flags & MOPT_NO_EXT3) && IS_EXT3_SB(sb)) { in handle_mount_opt()
1494 ext4_msg(sb, KERN_ERR, in handle_mount_opt()
1504 set_opt2(sb, EXPLICIT_DELALLOC); in handle_mount_opt()
1506 clear_opt(sb, ERRORS_MASK); in handle_mount_opt()
1507 if (token == Opt_noquota && sb_any_quota_loaded(sb)) { in handle_mount_opt()
1508 ext4_msg(sb, KERN_ERR, "Cannot change quota " in handle_mount_opt()
1514 ext4_msg(sb, KERN_ERR, "%s option not supported", opt); in handle_mount_opt()
1525 ext4_msg(sb, KERN_ERR, in handle_mount_opt()
1532 set_opt(sb, INIT_INODE_TABLE); in handle_mount_opt()
1543 ext4_msg(sb, KERN_ERR, "Invalid uid value %d", arg); in handle_mount_opt()
1550 ext4_msg(sb, KERN_ERR, "Invalid gid value %d", arg); in handle_mount_opt()
1556 ext4_msg(sb, KERN_ERR, in handle_mount_opt()
1568 ext4_msg(sb, KERN_ERR, in handle_mount_opt()
1574 ext4_msg(sb, KERN_ERR, "error: could not dup " in handle_mount_opt()
1581 ext4_msg(sb, KERN_ERR, "error: could not find " in handle_mount_opt()
1589 ext4_msg(sb, KERN_ERR, "error: journal path %s " in handle_mount_opt()
1601 ext4_msg(sb, KERN_ERR, "Invalid journal IO priority" in handle_mount_opt()
1610 ext4_msg(sb, KERN_WARNING, in handle_mount_opt()
1613 ext4_msg(sb, KERN_WARNING, in handle_mount_opt()
1619 …ext4_msg(sb, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data opt… in handle_mount_opt()
1620 else if (test_opt(sb, DATA_FLAGS) != m->mount_opt) { in handle_mount_opt()
1621 ext4_msg(sb, KERN_ERR, in handle_mount_opt()
1626 clear_opt(sb, DATA_FLAGS); in handle_mount_opt()
1631 if (sb_any_quota_loaded(sb) && in handle_mount_opt()
1633 ext4_msg(sb, KERN_ERR, "Cannot change journaled " in handle_mount_opt()
1637 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in handle_mount_opt()
1639 ext4_msg(sb, KERN_INFO, in handle_mount_opt()
1648 ext4_msg(sb, KERN_INFO, "dax option not supported"); in handle_mount_opt()
1657 ext4_msg(sb, KERN_WARNING, in handle_mount_opt()
1670 static int parse_options(char *options, struct super_block *sb, in parse_options() argument
1675 struct ext4_sb_info *sbi = EXT4_SB(sb); in parse_options()
1692 if (handle_mount_opt(sb, p, token, args, journal_devnum, in parse_options()
1697 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) && in parse_options()
1698 (test_opt(sb, USRQUOTA) || test_opt(sb, GRPQUOTA))) { in parse_options()
1699 ext4_msg(sb, KERN_INFO, "Quota feature enabled, usrquota and grpquota " in parse_options()
1701 clear_opt(sb, USRQUOTA); in parse_options()
1702 clear_opt(sb, GRPQUOTA); in parse_options()
1704 if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) in parse_options()
1705 clear_opt(sb, USRQUOTA); in parse_options()
1707 if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) in parse_options()
1708 clear_opt(sb, GRPQUOTA); in parse_options()
1710 if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { in parse_options()
1711 ext4_msg(sb, KERN_ERR, "old and new quota " in parse_options()
1717 ext4_msg(sb, KERN_ERR, "journaled quota format " in parse_options()
1723 if (test_opt(sb, DIOREAD_NOLOCK)) { in parse_options()
1728 ext4_msg(sb, KERN_ERR, "can't mount with " in parse_options()
1733 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA && in parse_options()
1734 test_opt(sb, JOURNAL_ASYNC_COMMIT)) { in parse_options()
1735 ext4_msg(sb, KERN_ERR, "can't mount with journal_async_commit " in parse_options()
1743 struct super_block *sb) in ext4_show_quota_options() argument
1746 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_show_quota_options()
1788 static int _ext4_show_options(struct seq_file *seq, struct super_block *sb, in _ext4_show_options() argument
1791 struct ext4_sb_info *sbi = EXT4_SB(sb); in _ext4_show_options()
1826 if (test_opt(sb, ERRORS_RO) && def_errors != EXT4_ERRORS_RO) in _ext4_show_options()
1828 if (test_opt(sb, ERRORS_CONT) && def_errors != EXT4_ERRORS_CONTINUE) in _ext4_show_options()
1830 if (test_opt(sb, ERRORS_PANIC) && def_errors != EXT4_ERRORS_PANIC) in _ext4_show_options()
1838 if (sb->s_flags & MS_I_VERSION) in _ext4_show_options()
1843 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) in _ext4_show_options()
1845 else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) in _ext4_show_options()
1847 else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) in _ext4_show_options()
1855 if (nodefs || (test_opt(sb, INIT_INODE_TABLE) && in _ext4_show_options()
1861 ext4_show_quota_options(seq, sb); in _ext4_show_options()
1872 struct super_block *sb = seq->private; in options_seq_show() local
1875 seq_puts(seq, (sb->s_flags & MS_RDONLY) ? "ro" : "rw"); in options_seq_show()
1876 rc = _ext4_show_options(seq, sb, 1); in options_seq_show()
1894 static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, in ext4_setup_super() argument
1897 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_setup_super()
1901 ext4_msg(sb, KERN_ERR, "revision level too high, " in ext4_setup_super()
1908 ext4_msg(sb, KERN_WARNING, "warning: mounting unchecked fs, " in ext4_setup_super()
1911 ext4_msg(sb, KERN_WARNING, in ext4_setup_super()
1917 ext4_msg(sb, KERN_WARNING, in ext4_setup_super()
1923 ext4_msg(sb, KERN_WARNING, in ext4_setup_super()
1932 ext4_update_dynamic_rev(sb); in ext4_setup_super()
1934 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_setup_super()
1936 ext4_commit_super(sb, 1); in ext4_setup_super()
1938 if (test_opt(sb, DEBUG)) in ext4_setup_super()
1941 sb->s_blocksize, in ext4_setup_super()
1943 EXT4_BLOCKS_PER_GROUP(sb), in ext4_setup_super()
1944 EXT4_INODES_PER_GROUP(sb), in ext4_setup_super()
1947 cleancache_init_fs(sb); in ext4_setup_super()
1951 int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) in ext4_alloc_flex_bg_array() argument
1953 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_alloc_flex_bg_array()
1967 ext4_msg(sb, KERN_ERR, "not enough memory for %d flex groups", in ext4_alloc_flex_bg_array()
1983 static int ext4_fill_flex_info(struct super_block *sb) in ext4_fill_flex_info() argument
1985 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_fill_flex_info()
1996 err = ext4_alloc_flex_bg_array(sb, sbi->s_groups_count); in ext4_fill_flex_info()
2001 gdp = ext4_get_group_desc(sb, i, NULL); in ext4_fill_flex_info()
2004 atomic_add(ext4_free_inodes_count(sb, gdp), in ext4_fill_flex_info()
2006 atomic64_add(ext4_free_group_clusters(sb, gdp), in ext4_fill_flex_info()
2008 atomic_add(ext4_used_dirs_count(sb, gdp), in ext4_fill_flex_info()
2064 int ext4_group_desc_csum_verify(struct super_block *sb, __u32 block_group, in ext4_group_desc_csum_verify() argument
2067 if (ext4_has_group_desc_csum(sb) && in ext4_group_desc_csum_verify()
2068 (gdp->bg_checksum != ext4_group_desc_csum(EXT4_SB(sb), in ext4_group_desc_csum_verify()
2075 void ext4_group_desc_csum_set(struct super_block *sb, __u32 block_group, in ext4_group_desc_csum_set() argument
2078 if (!ext4_has_group_desc_csum(sb)) in ext4_group_desc_csum_set()
2080 gdp->bg_checksum = ext4_group_desc_csum(EXT4_SB(sb), block_group, gdp); in ext4_group_desc_csum_set()
2084 static int ext4_check_descriptors(struct super_block *sb, in ext4_check_descriptors() argument
2087 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_check_descriptors()
2096 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) in ext4_check_descriptors()
2102 struct ext4_group_desc *gdp = ext4_get_group_desc(sb, i, NULL); in ext4_check_descriptors()
2108 (EXT4_BLOCKS_PER_GROUP(sb) - 1); in ext4_check_descriptors()
2114 block_bitmap = ext4_block_bitmap(sb, gdp); in ext4_check_descriptors()
2116 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " in ext4_check_descriptors()
2121 inode_bitmap = ext4_inode_bitmap(sb, gdp); in ext4_check_descriptors()
2123 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " in ext4_check_descriptors()
2128 inode_table = ext4_inode_table(sb, gdp); in ext4_check_descriptors()
2131 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " in ext4_check_descriptors()
2136 ext4_lock_group(sb, i); in ext4_check_descriptors()
2137 if (!ext4_group_desc_csum_verify(sb, i, gdp)) { in ext4_check_descriptors()
2138 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " in ext4_check_descriptors()
2142 if (!(sb->s_flags & MS_RDONLY)) { in ext4_check_descriptors()
2143 ext4_unlock_group(sb, i); in ext4_check_descriptors()
2147 ext4_unlock_group(sb, i); in ext4_check_descriptors()
2149 first_block += EXT4_BLOCKS_PER_GROUP(sb); in ext4_check_descriptors()
2173 static void ext4_orphan_cleanup(struct super_block *sb, in ext4_orphan_cleanup() argument
2176 unsigned int s_flags = sb->s_flags; in ext4_orphan_cleanup()
2186 if (bdev_read_only(sb->s_bdev)) { in ext4_orphan_cleanup()
2187 ext4_msg(sb, KERN_ERR, "write access " in ext4_orphan_cleanup()
2193 if (!ext4_feature_set_ok(sb, 0)) { in ext4_orphan_cleanup()
2194 ext4_msg(sb, KERN_INFO, "Skipping orphan cleanup due to " in ext4_orphan_cleanup()
2199 if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) { in ext4_orphan_cleanup()
2202 ext4_msg(sb, KERN_INFO, "Errors on filesystem, " in ext4_orphan_cleanup()
2211 ext4_msg(sb, KERN_INFO, "orphan cleanup on readonly fs"); in ext4_orphan_cleanup()
2212 sb->s_flags &= ~MS_RDONLY; in ext4_orphan_cleanup()
2216 sb->s_flags |= MS_ACTIVE; in ext4_orphan_cleanup()
2219 if (EXT4_SB(sb)->s_qf_names[i]) { in ext4_orphan_cleanup()
2220 int ret = ext4_quota_on_mount(sb, i); in ext4_orphan_cleanup()
2222 ext4_msg(sb, KERN_ERR, in ext4_orphan_cleanup()
2232 inode = ext4_orphan_get(sb, le32_to_cpu(es->s_last_orphan)); in ext4_orphan_cleanup()
2238 list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan); in ext4_orphan_cleanup()
2241 if (test_opt(sb, DEBUG)) in ext4_orphan_cleanup()
2242 ext4_msg(sb, KERN_DEBUG, in ext4_orphan_cleanup()
2253 if (test_opt(sb, DEBUG)) in ext4_orphan_cleanup()
2254 ext4_msg(sb, KERN_DEBUG, in ext4_orphan_cleanup()
2267 ext4_msg(sb, KERN_INFO, "%d orphan inode%s deleted", in ext4_orphan_cleanup()
2270 ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up", in ext4_orphan_cleanup()
2275 if (sb_dqopt(sb)->files[i]) in ext4_orphan_cleanup()
2276 dquot_quota_off(sb, i); in ext4_orphan_cleanup()
2279 sb->s_flags = s_flags; /* Restore MS_RDONLY status */ in ext4_orphan_cleanup()
2394 static ext4_fsblk_t descriptor_loc(struct super_block *sb, in descriptor_loc() argument
2397 struct ext4_sb_info *sbi = EXT4_SB(sb); in descriptor_loc()
2403 if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG) || in descriptor_loc()
2407 if (ext4_bg_has_super(sb, bg)) in descriptor_loc()
2416 if (sb->s_blocksize == 1024 && nr == 0 && in descriptor_loc()
2417 le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) == 0) in descriptor_loc()
2420 return (has_super + ext4_group_first_block_no(sb, bg)); in descriptor_loc()
2496 struct super_block *sb = sbi->s_buddy_cache->i_sb; in session_write_kbytes_show() local
2498 if (!sb->s_bdev->bd_part) in session_write_kbytes_show()
2501 (part_stat_read(sb->s_bdev->bd_part, sectors[1]) - in session_write_kbytes_show()
2508 struct super_block *sb = sbi->s_buddy_cache->i_sb; in lifetime_write_kbytes_show() local
2510 if (!sb->s_bdev->bd_part) in lifetime_write_kbytes_show()
2514 ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) - in lifetime_write_kbytes_show()
2515 EXT4_SB(sb)->s_sectors_written_start) >> 1))); in lifetime_write_kbytes_show()
2795 static int ext4_feature_set_ok(struct super_block *sb, int readonly) in ext4_feature_set_ok() argument
2797 if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT4_FEATURE_INCOMPAT_SUPP)) { in ext4_feature_set_ok()
2798 ext4_msg(sb, KERN_ERR, in ext4_feature_set_ok()
2801 (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) & in ext4_feature_set_ok()
2809 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_READONLY)) { in ext4_feature_set_ok()
2810 ext4_msg(sb, KERN_INFO, "filesystem is read-only"); in ext4_feature_set_ok()
2811 sb->s_flags |= MS_RDONLY; in ext4_feature_set_ok()
2816 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT4_FEATURE_RO_COMPAT_SUPP)) { in ext4_feature_set_ok()
2817 ext4_msg(sb, KERN_ERR, "couldn't mount RDWR because of " in ext4_feature_set_ok()
2819 (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) & in ext4_feature_set_ok()
2827 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) { in ext4_feature_set_ok()
2829 ext4_msg(sb, KERN_ERR, "Filesystem with huge files " in ext4_feature_set_ok()
2835 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_BIGALLOC) && in ext4_feature_set_ok()
2836 !EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { in ext4_feature_set_ok()
2837 ext4_msg(sb, KERN_ERR, in ext4_feature_set_ok()
2844 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) && in ext4_feature_set_ok()
2846 ext4_msg(sb, KERN_ERR, in ext4_feature_set_ok()
2861 struct super_block *sb = (struct super_block *) arg; in print_daily_error_info() local
2865 sbi = EXT4_SB(sb); in print_daily_error_info()
2870 ext4_msg(sb, KERN_NOTICE, "error count since last fsck: %u", in print_daily_error_info()
2874 sb->s_id, le32_to_cpu(es->s_first_error_time), in print_daily_error_info()
2888 sb->s_id, le32_to_cpu(es->s_last_error_time), in print_daily_error_info()
2908 struct super_block *sb; in ext4_run_li_request() local
2912 sb = elr->lr_super; in ext4_run_li_request()
2913 ngroups = EXT4_SB(sb)->s_groups_count; in ext4_run_li_request()
2915 sb_start_write(sb); in ext4_run_li_request()
2917 gdp = ext4_get_group_desc(sb, group, NULL); in ext4_run_li_request()
2932 ret = ext4_init_inode_table(sb, group, in ext4_run_li_request()
2942 sb_end_write(sb); in ext4_run_li_request()
2965 static void ext4_unregister_li_request(struct super_block *sb) in ext4_unregister_li_request() argument
2974 ext4_remove_li_request(EXT4_SB(sb)->s_li_request); in ext4_unregister_li_request()
3105 static ext4_group_t ext4_has_uninit_itable(struct super_block *sb) in ext4_has_uninit_itable() argument
3107 ext4_group_t group, ngroups = EXT4_SB(sb)->s_groups_count; in ext4_has_uninit_itable()
3111 gdp = ext4_get_group_desc(sb, group, NULL); in ext4_has_uninit_itable()
3140 static struct ext4_li_request *ext4_li_request_new(struct super_block *sb, in ext4_li_request_new() argument
3143 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_li_request_new()
3150 elr->lr_super = sb; in ext4_li_request_new()
3164 int ext4_register_li_request(struct super_block *sb, in ext4_register_li_request() argument
3167 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_register_li_request()
3169 ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; in ext4_register_li_request()
3183 (sb->s_flags & MS_RDONLY) || in ext4_register_li_request()
3184 !test_opt(sb, INIT_INODE_TABLE)) in ext4_register_li_request()
3187 elr = ext4_li_request_new(sb, first_not_zeroed); in ext4_register_li_request()
3239 static int set_journal_csum_feature_set(struct super_block *sb) in set_journal_csum_feature_set() argument
3243 struct ext4_sb_info *sbi = EXT4_SB(sb); in set_journal_csum_feature_set()
3245 if (ext4_has_metadata_csum(sb)) { in set_journal_csum_feature_set()
3259 if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { in set_journal_csum_feature_set()
3264 } else if (test_opt(sb, JOURNAL_CHECKSUM)) { in set_journal_csum_feature_set()
3293 static int count_overhead(struct super_block *sb, ext4_group_t grp, in count_overhead() argument
3296 struct ext4_sb_info *sbi = EXT4_SB(sb); in count_overhead()
3299 ext4_group_t i, ngroups = ext4_get_groups_count(sb); in count_overhead()
3302 if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_BIGALLOC)) in count_overhead()
3303 return (ext4_bg_has_super(sb, grp) + ext4_bg_num_gdb(sb, grp) + in count_overhead()
3307 (grp * EXT4_BLOCKS_PER_GROUP(sb)); in count_overhead()
3308 last_block = first_block + EXT4_BLOCKS_PER_GROUP(sb) - 1; in count_overhead()
3310 gdp = ext4_get_group_desc(sb, i, NULL); in count_overhead()
3311 b = ext4_block_bitmap(sb, gdp); in count_overhead()
3316 b = ext4_inode_bitmap(sb, gdp); in count_overhead()
3321 b = ext4_inode_table(sb, gdp); in count_overhead()
3331 if (ext4_bg_has_super(sb, grp)) { in count_overhead()
3335 for (j = ext4_bg_num_gdb(sb, grp); j > 0; j--) { in count_overhead()
3342 return EXT4_CLUSTERS_PER_GROUP(sb) - in count_overhead()
3343 ext4_count_free(buf, EXT4_CLUSTERS_PER_GROUP(sb) / 8); in count_overhead()
3349 int ext4_calculate_overhead(struct super_block *sb) in ext4_calculate_overhead() argument
3351 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_calculate_overhead()
3353 ext4_group_t i, ngroups = ext4_get_groups_count(sb); in ext4_calculate_overhead()
3377 blks = count_overhead(sb, i, buf); in ext4_calculate_overhead()
3394 static ext4_fsblk_t ext4_calculate_resv_clusters(struct super_block *sb) in ext4_calculate_resv_clusters() argument
3404 if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) in ext4_calculate_resv_clusters()
3414 resv_clusters = ext4_blocks_count(EXT4_SB(sb)->s_es) >> in ext4_calculate_resv_clusters()
3415 EXT4_SB(sb)->s_cluster_bits; in ext4_calculate_resv_clusters()
3436 static int ext4_fill_super(struct super_block *sb, void *data, int silent) in ext4_fill_super() argument
3471 sb->s_fs_info = sbi; in ext4_fill_super()
3472 sbi->s_sb = sb; in ext4_fill_super()
3475 if (sb->s_bdev->bd_part) in ext4_fill_super()
3477 part_stat_read(sb->s_bdev->bd_part, sectors[1]); in ext4_fill_super()
3485 for (cp = sb->s_id; (cp = strchr(cp, '/'));) in ext4_fill_super()
3490 blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE); in ext4_fill_super()
3492 ext4_msg(sb, KERN_ERR, "unable to set blocksize"); in ext4_fill_super()
3507 if (!(bh = sb_bread_unmovable(sb, logical_sb_block))) { in ext4_fill_super()
3508 ext4_msg(sb, KERN_ERR, "unable to read superblock"); in ext4_fill_super()
3517 sb->s_magic = le16_to_cpu(es->s_magic); in ext4_fill_super()
3518 if (sb->s_magic != EXT4_SUPER_MAGIC) in ext4_fill_super()
3523 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
3525 EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) in ext4_fill_super()
3526 ext4_warning(sb, "metadata_csum and uninit_bg are " in ext4_fill_super()
3530 if (!ext4_verify_csum_type(sb, es)) { in ext4_fill_super()
3531 ext4_msg(sb, KERN_ERR, "VFS: Found ext4 filesystem with " in ext4_fill_super()
3538 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
3542 ext4_msg(sb, KERN_ERR, "Cannot load crc32c driver."); in ext4_fill_super()
3550 if (!ext4_superblock_csum_verify(sb, es)) { in ext4_fill_super()
3551 ext4_msg(sb, KERN_ERR, "VFS: Found ext4 filesystem with " in ext4_fill_super()
3558 if (ext4_has_metadata_csum(sb)) in ext4_fill_super()
3564 set_opt(sb, INIT_INODE_TABLE); in ext4_fill_super()
3566 set_opt(sb, DEBUG); in ext4_fill_super()
3568 set_opt(sb, GRPID); in ext4_fill_super()
3570 set_opt(sb, NO_UID32); in ext4_fill_super()
3572 set_opt(sb, XATTR_USER); in ext4_fill_super()
3574 set_opt(sb, POSIX_ACL); in ext4_fill_super()
3577 if (ext4_has_metadata_csum(sb)) in ext4_fill_super()
3578 set_opt(sb, JOURNAL_CHECKSUM); in ext4_fill_super()
3581 set_opt(sb, JOURNAL_DATA); in ext4_fill_super()
3583 set_opt(sb, ORDERED_DATA); in ext4_fill_super()
3585 set_opt(sb, WRITEBACK_DATA); in ext4_fill_super()
3588 set_opt(sb, ERRORS_PANIC); in ext4_fill_super()
3590 set_opt(sb, ERRORS_CONT); in ext4_fill_super()
3592 set_opt(sb, ERRORS_RO); in ext4_fill_super()
3594 set_opt(sb, BLOCK_VALIDITY); in ext4_fill_super()
3596 set_opt(sb, DISCARD); in ext4_fill_super()
3605 set_opt(sb, BARRIER); in ext4_fill_super()
3611 if (!IS_EXT3_SB(sb) && !IS_EXT2_SB(sb) && in ext4_fill_super()
3613 set_opt(sb, DELALLOC); in ext4_fill_super()
3621 if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, in ext4_fill_super()
3623 ext4_msg(sb, KERN_WARNING, in ext4_fill_super()
3628 if (!parse_options((char *) data, sb, &journal_devnum, in ext4_fill_super()
3632 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { in ext4_fill_super()
3636 if (test_opt2(sb, EXPLICIT_DELALLOC)) { in ext4_fill_super()
3637 ext4_msg(sb, KERN_ERR, "can't mount with " in ext4_fill_super()
3641 if (test_opt(sb, DIOREAD_NOLOCK)) { in ext4_fill_super()
3642 ext4_msg(sb, KERN_ERR, "can't mount with " in ext4_fill_super()
3646 if (test_opt(sb, DAX)) { in ext4_fill_super()
3647 ext4_msg(sb, KERN_ERR, "can't mount with " in ext4_fill_super()
3651 if (test_opt(sb, DELALLOC)) in ext4_fill_super()
3652 clear_opt(sb, DELALLOC); in ext4_fill_super()
3655 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | in ext4_fill_super()
3656 (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); in ext4_fill_super()
3659 (EXT4_HAS_COMPAT_FEATURE(sb, ~0U) || in ext4_fill_super()
3660 EXT4_HAS_RO_COMPAT_FEATURE(sb, ~0U) || in ext4_fill_super()
3661 EXT4_HAS_INCOMPAT_FEATURE(sb, ~0U))) in ext4_fill_super()
3662 ext4_msg(sb, KERN_WARNING, in ext4_fill_super()
3667 set_opt2(sb, HURD_COMPAT); in ext4_fill_super()
3668 if (EXT4_HAS_INCOMPAT_FEATURE(sb, in ext4_fill_super()
3670 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3676 if (IS_EXT2_SB(sb)) { in ext4_fill_super()
3677 if (ext2_feature_set_ok(sb)) in ext4_fill_super()
3678 ext4_msg(sb, KERN_INFO, "mounting ext2 file system " in ext4_fill_super()
3681 ext4_msg(sb, KERN_ERR, "couldn't mount as ext2 due " in ext4_fill_super()
3687 if (IS_EXT3_SB(sb)) { in ext4_fill_super()
3688 if (ext3_feature_set_ok(sb)) in ext4_fill_super()
3689 ext4_msg(sb, KERN_INFO, "mounting ext3 file system " in ext4_fill_super()
3692 ext4_msg(sb, KERN_ERR, "couldn't mount as ext3 due " in ext4_fill_super()
3703 if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY))) in ext4_fill_super()
3709 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3716 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3720 if (!sb->s_bdev->bd_disk->fops->direct_access) { in ext4_fill_super()
3721 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3727 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_ENCRYPT) && in ext4_fill_super()
3729 ext4_msg(sb, KERN_ERR, "Unsupported encryption level %d", in ext4_fill_super()
3734 if (sb->s_blocksize != blocksize) { in ext4_fill_super()
3736 if (!sb_set_blocksize(sb, blocksize)) { in ext4_fill_super()
3737 ext4_msg(sb, KERN_ERR, "bad block size %d", in ext4_fill_super()
3745 bh = sb_bread_unmovable(sb, logical_sb_block); in ext4_fill_super()
3747 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3754 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3760 has_huge_files = EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
3762 sbi->s_bitmap_maxbytes = ext4_max_bitmap_size(sb->s_blocksize_bits, in ext4_fill_super()
3764 sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files); in ext4_fill_super()
3775 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3781 sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2); in ext4_fill_super()
3785 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT)) { in ext4_fill_super()
3789 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3799 if (EXT4_INODE_SIZE(sb) == 0 || EXT4_INODES_PER_GROUP(sb) == 0) in ext4_fill_super()
3802 sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb); in ext4_fill_super()
3807 sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb); in ext4_fill_super()
3810 sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb)); in ext4_fill_super()
3811 sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb)); in ext4_fill_super()
3816 if (EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) { in ext4_fill_super()
3822 if (!(sb->s_flags & MS_RDONLY)) in ext4_fill_super()
3827 if (!(sb->s_flags & MS_RDONLY)) in ext4_fill_super()
3836 has_bigalloc = EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
3840 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3850 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3857 ext4_msg(sb, KERN_ERR, "blocks per group (%lu) and " in ext4_fill_super()
3865 ext4_warning(sb, "fragment/cluster size (%d) != " in ext4_fill_super()
3871 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3882 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3890 set_opt2(sb, STD_GROUP_SIZE); in ext4_fill_super()
3896 err = generic_check_addressable(sb->s_blocksize_bits, in ext4_fill_super()
3899 ext4_msg(sb, KERN_ERR, "filesystem" in ext4_fill_super()
3902 ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled"); in ext4_fill_super()
3906 if (EXT4_BLOCKS_PER_GROUP(sb) == 0) in ext4_fill_super()
3910 blocks_count = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits; in ext4_fill_super()
3912 ext4_msg(sb, KERN_WARNING, "bad geometry: block count %llu " in ext4_fill_super()
3923 ext4_msg(sb, KERN_WARNING, "bad geometry: first data " in ext4_fill_super()
3931 EXT4_BLOCKS_PER_GROUP(sb) - 1); in ext4_fill_super()
3932 do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb)); in ext4_fill_super()
3933 if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) { in ext4_fill_super()
3934 ext4_msg(sb, KERN_WARNING, "groups count too large: %u " in ext4_fill_super()
3939 EXT4_BLOCKS_PER_GROUP(sb)); in ext4_fill_super()
3944 (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); in ext4_fill_super()
3945 db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / in ext4_fill_super()
3946 EXT4_DESC_PER_BLOCK(sb); in ext4_fill_super()
3951 ext4_msg(sb, KERN_ERR, "not enough memory"); in ext4_fill_super()
3957 sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root); in ext4_fill_super()
3961 &ext4_seq_options_fops, sb); in ext4_fill_super()
3966 block = descriptor_loc(sb, logical_sb_block, i); in ext4_fill_super()
3967 sbi->s_group_desc[i] = sb_bread_unmovable(sb, block); in ext4_fill_super()
3969 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
3975 if (!ext4_check_descriptors(sb, &first_not_zeroed)) { in ext4_fill_super()
3976 ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); in ext4_fill_super()
3985 (unsigned long) sb); in ext4_fill_super()
3997 sb->s_op = &ext4_sops; in ext4_fill_super()
3998 sb->s_export_op = &ext4_export_ops; in ext4_fill_super()
3999 sb->s_xattr = ext4_xattr_handlers; in ext4_fill_super()
4001 sb->dq_op = &ext4_quota_operations; in ext4_fill_super()
4002 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) in ext4_fill_super()
4003 sb->s_qcop = &dquot_quotactl_sysfile_ops; in ext4_fill_super()
4005 sb->s_qcop = &ext4_qctl_operations; in ext4_fill_super()
4006 sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; in ext4_fill_super()
4008 memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid)); in ext4_fill_super()
4013 sb->s_root = NULL; in ext4_fill_super()
4016 EXT4_HAS_INCOMPAT_FEATURE(sb, in ext4_fill_super()
4019 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_MMP) && in ext4_fill_super()
4020 !(sb->s_flags & MS_RDONLY)) in ext4_fill_super()
4021 if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block))) in ext4_fill_super()
4028 if (!test_opt(sb, NOLOAD) && in ext4_fill_super()
4029 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { in ext4_fill_super()
4030 if (ext4_load_journal(sb, es, journal_devnum)) in ext4_fill_super()
4032 } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) && in ext4_fill_super()
4033 EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { in ext4_fill_super()
4034 ext4_msg(sb, KERN_ERR, "required journal recovery " in ext4_fill_super()
4038 clear_opt(sb, DATA_FLAGS); in ext4_fill_super()
4044 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT) && in ext4_fill_super()
4045 !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0, in ext4_fill_super()
4047 ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature"); in ext4_fill_super()
4051 if (!set_journal_csum_feature_set(sb)) { in ext4_fill_super()
4052 ext4_msg(sb, KERN_ERR, "Failed to set journal checksum " in ext4_fill_super()
4059 switch (test_opt(sb, DATA_FLAGS)) { in ext4_fill_super()
4067 set_opt(sb, ORDERED_DATA); in ext4_fill_super()
4069 set_opt(sb, JOURNAL_DATA); in ext4_fill_super()
4076 ext4_msg(sb, KERN_ERR, "Journal does not support " in ext4_fill_super()
4089 sbi->s_mb_cache = ext4_xattr_create_cache(sb->s_id); in ext4_fill_super()
4091 ext4_msg(sb, KERN_ERR, "Failed to create an mb_cache"); in ext4_fill_super()
4097 !(sb->s_flags & MS_RDONLY) && in ext4_fill_super()
4098 !EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_ENCRYPT)) { in ext4_fill_super()
4099 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_ENCRYPT); in ext4_fill_super()
4100 ext4_commit_super(sb, 1); in ext4_fill_super()
4110 err = ext4_calculate_overhead(sb); in ext4_fill_super()
4119 EXT4_SB(sb)->rsv_conversion_wq = in ext4_fill_super()
4121 if (!EXT4_SB(sb)->rsv_conversion_wq) { in ext4_fill_super()
4132 root = ext4_iget(sb, EXT4_ROOT_INO); in ext4_fill_super()
4134 ext4_msg(sb, KERN_ERR, "get root inode failed"); in ext4_fill_super()
4140 ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck"); in ext4_fill_super()
4144 sb->s_root = d_make_root(root); in ext4_fill_super()
4145 if (!sb->s_root) { in ext4_fill_super()
4146 ext4_msg(sb, KERN_ERR, "get root dentry failed"); in ext4_fill_super()
4151 if (ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY)) in ext4_fill_super()
4152 sb->s_flags |= MS_RDONLY; in ext4_fill_super()
4158 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
4175 ext4_msg(sb, KERN_INFO, "required extra inode space not" in ext4_fill_super()
4179 err = ext4_reserve_clusters(sbi, ext4_calculate_resv_clusters(sb)); in ext4_fill_super()
4181 ext4_msg(sb, KERN_ERR, "failed to reserve %llu clusters for " in ext4_fill_super()
4182 "reserved pool", ext4_calculate_resv_clusters(sb)); in ext4_fill_super()
4186 err = ext4_setup_system_zone(sb); in ext4_fill_super()
4188 ext4_msg(sb, KERN_ERR, "failed to initialize system " in ext4_fill_super()
4193 ext4_ext_init(sb); in ext4_fill_super()
4194 err = ext4_mb_init(sb); in ext4_fill_super()
4196 ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", in ext4_fill_super()
4201 block = ext4_count_free_clusters(sb); in ext4_fill_super()
4207 unsigned long freei = ext4_count_free_inodes(sb); in ext4_fill_super()
4214 ext4_count_dirs(sb), GFP_KERNEL); in ext4_fill_super()
4219 ext4_msg(sb, KERN_ERR, "insufficient memory"); in ext4_fill_super()
4223 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) in ext4_fill_super()
4224 if (!ext4_fill_flex_info(sb)) { in ext4_fill_super()
4225 ext4_msg(sb, KERN_ERR, in ext4_fill_super()
4231 err = ext4_register_li_request(sb, first_not_zeroed); in ext4_fill_super()
4238 "%s", sb->s_id); in ext4_fill_super()
4244 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) && in ext4_fill_super()
4245 !(sb->s_flags & MS_RDONLY)) { in ext4_fill_super()
4246 err = ext4_enable_quotas(sb); in ext4_fill_super()
4252 EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS; in ext4_fill_super()
4253 ext4_orphan_cleanup(sb, es); in ext4_fill_super()
4254 EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS; in ext4_fill_super()
4256 ext4_msg(sb, KERN_INFO, "recovery complete"); in ext4_fill_super()
4257 ext4_mark_recovery_complete(sb, es); in ext4_fill_super()
4259 if (EXT4_SB(sb)->s_journal) { in ext4_fill_super()
4260 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) in ext4_fill_super()
4262 else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) in ext4_fill_super()
4269 if (test_opt(sb, DISCARD)) { in ext4_fill_super()
4270 struct request_queue *q = bdev_get_queue(sb->s_bdev); in ext4_fill_super()
4272 ext4_msg(sb, KERN_WARNING, in ext4_fill_super()
4277 ext4_msg(sb, KERN_INFO, "mounted filesystem with%s. " in ext4_fill_super()
4294 ext4_msg(sb, KERN_ERR, "VFS: Can't find ext4 filesystem"); in ext4_fill_super()
4302 ext4_unregister_li_request(sb); in ext4_fill_super()
4304 ext4_mb_release(sb); in ext4_fill_super()
4312 ext4_ext_release(sb); in ext4_fill_super()
4313 ext4_release_system_zone(sb); in ext4_fill_super()
4315 dput(sb->s_root); in ext4_fill_super()
4316 sb->s_root = NULL; in ext4_fill_super()
4318 ext4_msg(sb, KERN_ERR, "mount failed"); in ext4_fill_super()
4319 if (EXT4_SB(sb)->rsv_conversion_wq) in ext4_fill_super()
4320 destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq); in ext4_fill_super()
4341 remove_proc_entry(sb->s_id, ext4_proc_root); in ext4_fill_super()
4350 sb->s_fs_info = NULL; in ext4_fill_super()
4363 static void ext4_init_journal_params(struct super_block *sb, journal_t *journal) in ext4_init_journal_params() argument
4365 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_init_journal_params()
4372 if (test_opt(sb, BARRIER)) in ext4_init_journal_params()
4376 if (test_opt(sb, DATA_ERR_ABORT)) in ext4_init_journal_params()
4383 static journal_t *ext4_get_journal(struct super_block *sb, in ext4_get_journal() argument
4389 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_get_journal()
4395 journal_inode = ext4_iget(sb, journal_inum); in ext4_get_journal()
4397 ext4_msg(sb, KERN_ERR, "no journal found"); in ext4_get_journal()
4403 ext4_msg(sb, KERN_ERR, "journal inode is deleted"); in ext4_get_journal()
4410 ext4_msg(sb, KERN_ERR, "invalid journal inode"); in ext4_get_journal()
4417 ext4_msg(sb, KERN_ERR, "Could not load journal inode"); in ext4_get_journal()
4421 journal->j_private = sb; in ext4_get_journal()
4422 ext4_init_journal_params(sb, journal); in ext4_get_journal()
4426 static journal_t *ext4_get_dev_journal(struct super_block *sb, in ext4_get_dev_journal() argument
4439 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_get_dev_journal()
4441 bdev = ext4_blkdev_get(j_dev, sb); in ext4_get_dev_journal()
4445 blocksize = sb->s_blocksize; in ext4_get_dev_journal()
4448 ext4_msg(sb, KERN_ERR, in ext4_get_dev_journal()
4457 ext4_msg(sb, KERN_ERR, "couldn't read superblock of " in ext4_get_dev_journal()
4466 ext4_msg(sb, KERN_ERR, "external journal has " in ext4_get_dev_journal()
4474 es->s_checksum != ext4_superblock_csum(sb, es)) { in ext4_get_dev_journal()
4475 ext4_msg(sb, KERN_ERR, "external journal has " in ext4_get_dev_journal()
4481 if (memcmp(EXT4_SB(sb)->s_es->s_journal_uuid, es->s_uuid, 16)) { in ext4_get_dev_journal()
4482 ext4_msg(sb, KERN_ERR, "journal UUID does not match"); in ext4_get_dev_journal()
4491 journal = jbd2_journal_init_dev(bdev, sb->s_bdev, in ext4_get_dev_journal()
4494 ext4_msg(sb, KERN_ERR, "failed to create device journal"); in ext4_get_dev_journal()
4497 journal->j_private = sb; in ext4_get_dev_journal()
4501 ext4_msg(sb, KERN_ERR, "I/O error on journal device"); in ext4_get_dev_journal()
4505 ext4_msg(sb, KERN_ERR, "External journal has more than one " in ext4_get_dev_journal()
4510 EXT4_SB(sb)->journal_bdev = bdev; in ext4_get_dev_journal()
4511 ext4_init_journal_params(sb, journal); in ext4_get_dev_journal()
4521 static int ext4_load_journal(struct super_block *sb, in ext4_load_journal() argument
4531 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_load_journal()
4535 ext4_msg(sb, KERN_INFO, "external journal device major/minor " in ext4_load_journal()
4541 really_read_only = bdev_read_only(sb->s_bdev); in ext4_load_journal()
4548 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { in ext4_load_journal()
4549 if (sb->s_flags & MS_RDONLY) { in ext4_load_journal()
4550 ext4_msg(sb, KERN_INFO, "INFO: recovery " in ext4_load_journal()
4553 ext4_msg(sb, KERN_ERR, "write access " in ext4_load_journal()
4557 ext4_msg(sb, KERN_INFO, "write access will " in ext4_load_journal()
4563 ext4_msg(sb, KERN_ERR, "filesystem has both journal " in ext4_load_journal()
4569 if (!(journal = ext4_get_journal(sb, journal_inum))) in ext4_load_journal()
4572 if (!(journal = ext4_get_dev_journal(sb, journal_dev))) in ext4_load_journal()
4577 ext4_msg(sb, KERN_INFO, "barriers disabled"); in ext4_load_journal()
4579 if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) in ext4_load_journal()
4594 ext4_msg(sb, KERN_ERR, "error loading journal"); in ext4_load_journal()
4599 EXT4_SB(sb)->s_journal = journal; in ext4_load_journal()
4600 ext4_clear_journal_err(sb, es); in ext4_load_journal()
4607 ext4_commit_super(sb, 1); in ext4_load_journal()
4613 static int ext4_commit_super(struct super_block *sb, int sync) in ext4_commit_super() argument
4615 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_commit_super()
4616 struct buffer_head *sbh = EXT4_SB(sb)->s_sbh; in ext4_commit_super()
4619 if (!sbh || block_device_ejected(sb)) in ext4_commit_super()
4630 ext4_msg(sb, KERN_ERR, "previous I/O error to " in ext4_commit_super()
4645 if (!(sb->s_flags & MS_RDONLY)) in ext4_commit_super()
4647 if (sb->s_bdev->bd_part) in ext4_commit_super()
4649 cpu_to_le64(EXT4_SB(sb)->s_kbytes_written + in ext4_commit_super()
4650 ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) - in ext4_commit_super()
4651 EXT4_SB(sb)->s_sectors_written_start) >> 1)); in ext4_commit_super()
4654 cpu_to_le64(EXT4_SB(sb)->s_kbytes_written); in ext4_commit_super()
4655 if (percpu_counter_initialized(&EXT4_SB(sb)->s_freeclusters_counter)) in ext4_commit_super()
4657 EXT4_C2B(EXT4_SB(sb), percpu_counter_sum_positive( in ext4_commit_super()
4658 &EXT4_SB(sb)->s_freeclusters_counter))); in ext4_commit_super()
4659 if (percpu_counter_initialized(&EXT4_SB(sb)->s_freeinodes_counter)) in ext4_commit_super()
4662 &EXT4_SB(sb)->s_freeinodes_counter)); in ext4_commit_super()
4664 ext4_superblock_csum_set(sb); in ext4_commit_super()
4673 ext4_msg(sb, KERN_ERR, "I/O error while writing " in ext4_commit_super()
4687 static void ext4_mark_recovery_complete(struct super_block *sb, in ext4_mark_recovery_complete() argument
4690 journal_t *journal = EXT4_SB(sb)->s_journal; in ext4_mark_recovery_complete()
4692 if (!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { in ext4_mark_recovery_complete()
4700 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) && in ext4_mark_recovery_complete()
4701 sb->s_flags & MS_RDONLY) { in ext4_mark_recovery_complete()
4702 EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_mark_recovery_complete()
4703 ext4_commit_super(sb, 1); in ext4_mark_recovery_complete()
4715 static void ext4_clear_journal_err(struct super_block *sb, in ext4_clear_journal_err() argument
4722 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_clear_journal_err()
4724 journal = EXT4_SB(sb)->s_journal; in ext4_clear_journal_err()
4735 errstr = ext4_decode_error(sb, j_errno, nbuf); in ext4_clear_journal_err()
4736 ext4_warning(sb, "Filesystem error recorded " in ext4_clear_journal_err()
4738 ext4_warning(sb, "Marking fs in need of filesystem check."); in ext4_clear_journal_err()
4740 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_clear_journal_err()
4742 ext4_commit_super(sb, 1); in ext4_clear_journal_err()
4753 int ext4_force_commit(struct super_block *sb) in ext4_force_commit() argument
4757 if (sb->s_flags & MS_RDONLY) in ext4_force_commit()
4760 journal = EXT4_SB(sb)->s_journal; in ext4_force_commit()
4764 static int ext4_sync_fs(struct super_block *sb, int wait) in ext4_sync_fs() argument
4769 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_sync_fs()
4771 trace_ext4_sync_fs(sb, wait); in ext4_sync_fs()
4777 dquot_writeback_dquots(sb, -1); in ext4_sync_fs()
4794 } else if (wait && test_opt(sb, BARRIER)) in ext4_sync_fs()
4798 err = blkdev_issue_flush(sb->s_bdev, GFP_KERNEL, NULL); in ext4_sync_fs()
4814 static int ext4_freeze(struct super_block *sb) in ext4_freeze() argument
4819 if (sb->s_flags & MS_RDONLY) in ext4_freeze()
4822 journal = EXT4_SB(sb)->s_journal; in ext4_freeze()
4837 EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_freeze()
4840 error = ext4_commit_super(sb, 1); in ext4_freeze()
4852 static int ext4_unfreeze(struct super_block *sb) in ext4_unfreeze() argument
4854 if (sb->s_flags & MS_RDONLY) in ext4_unfreeze()
4857 if (EXT4_SB(sb)->s_journal) { in ext4_unfreeze()
4859 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_unfreeze()
4862 ext4_commit_super(sb, 1); in ext4_unfreeze()
4882 static int ext4_remount(struct super_block *sb, int *flags, char *data) in ext4_remount() argument
4885 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_remount()
4898 old_sb_flags = sb->s_flags; in ext4_remount()
4924 if (!parse_options(data, sb, NULL, &journal_ioprio, 1)) { in ext4_remount()
4930 test_opt(sb, JOURNAL_CHECKSUM)) { in ext4_remount()
4931 ext4_msg(sb, KERN_ERR, "changing journal_checksum " in ext4_remount()
4936 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { in ext4_remount()
4937 if (test_opt2(sb, EXPLICIT_DELALLOC)) { in ext4_remount()
4938 ext4_msg(sb, KERN_ERR, "can't mount with " in ext4_remount()
4943 if (test_opt(sb, DIOREAD_NOLOCK)) { in ext4_remount()
4944 ext4_msg(sb, KERN_ERR, "can't mount with " in ext4_remount()
4949 if (test_opt(sb, DAX)) { in ext4_remount()
4950 ext4_msg(sb, KERN_ERR, "can't mount with " in ext4_remount()
4958 ext4_msg(sb, KERN_WARNING, "warning: refusing change of " in ext4_remount()
4964 ext4_abort(sb, "Abort forced by user"); in ext4_remount()
4966 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | in ext4_remount()
4967 (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); in ext4_remount()
4972 ext4_init_journal_params(sb, sbi->s_journal); in ext4_remount()
4977 sb->s_flags |= MS_LAZYTIME; in ext4_remount()
4979 if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) { in ext4_remount()
4986 err = sync_filesystem(sb); in ext4_remount()
4989 err = dquot_suspend(sb, -1); in ext4_remount()
4997 sb->s_flags |= MS_RDONLY; in ext4_remount()
5009 ext4_mark_recovery_complete(sb, es); in ext4_remount()
5012 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_remount()
5014 !ext4_feature_set_ok(sb, 0)) { in ext4_remount()
5024 ext4_get_group_desc(sb, g, NULL); in ext4_remount()
5026 if (!ext4_group_desc_csum_verify(sb, g, gdp)) { in ext4_remount()
5027 ext4_msg(sb, KERN_ERR, in ext4_remount()
5042 ext4_msg(sb, KERN_WARNING, "Couldn't " in ext4_remount()
5057 ext4_clear_journal_err(sb, es); in ext4_remount()
5059 if (!ext4_setup_super(sb, es, 0)) in ext4_remount()
5060 sb->s_flags &= ~MS_RDONLY; in ext4_remount()
5061 if (EXT4_HAS_INCOMPAT_FEATURE(sb, in ext4_remount()
5063 if (ext4_multi_mount_protect(sb, in ext4_remount()
5076 if ((sb->s_flags & MS_RDONLY) || !test_opt(sb, INIT_INODE_TABLE)) in ext4_remount()
5077 ext4_unregister_li_request(sb); in ext4_remount()
5080 first_not_zeroed = ext4_has_uninit_itable(sb); in ext4_remount()
5081 ext4_register_li_request(sb, first_not_zeroed); in ext4_remount()
5084 ext4_setup_system_zone(sb); in ext4_remount()
5086 ext4_commit_super(sb, 1); in ext4_remount()
5093 if (sb_any_quota_suspended(sb)) in ext4_remount()
5094 dquot_resume(sb, -1); in ext4_remount()
5095 else if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_remount()
5097 err = ext4_enable_quotas(sb); in ext4_remount()
5104 *flags = (*flags & ~MS_LAZYTIME) | (sb->s_flags & MS_LAZYTIME); in ext4_remount()
5105 ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data); in ext4_remount()
5110 sb->s_flags = old_sb_flags; in ext4_remount()
5131 struct super_block *sb = dentry->d_sb; in ext4_statfs() local
5132 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_statfs()
5139 if (!test_opt(sb, MINIX_DF)) in ext4_statfs()
5143 buf->f_bsize = sb->s_blocksize; in ext4_statfs()
5236 struct super_block *sb = dquot->dq_sb; in ext4_mark_dquot_dirty() local
5237 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mark_dquot_dirty()
5240 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) || in ext4_mark_dquot_dirty()
5249 static int ext4_write_info(struct super_block *sb, int type) in ext4_write_info() argument
5255 handle = ext4_journal_start(d_inode(sb->s_root), EXT4_HT_QUOTA, 2); in ext4_write_info()
5258 ret = dquot_commit_info(sb, type); in ext4_write_info()
5269 static int ext4_quota_on_mount(struct super_block *sb, int type) in ext4_quota_on_mount() argument
5271 return dquot_quota_on_mount(sb, EXT4_SB(sb)->s_qf_names[type], in ext4_quota_on_mount()
5272 EXT4_SB(sb)->s_jquota_fmt, type); in ext4_quota_on_mount()
5292 static int ext4_quota_on(struct super_block *sb, int type, int format_id, in ext4_quota_on() argument
5297 if (!test_opt(sb, QUOTA)) in ext4_quota_on()
5301 if (path->dentry->d_sb != sb) in ext4_quota_on()
5304 if (EXT4_SB(sb)->s_qf_names[type]) { in ext4_quota_on()
5306 if (path->dentry->d_parent != sb->s_root) in ext4_quota_on()
5307 ext4_msg(sb, KERN_WARNING, in ext4_quota_on()
5316 if (EXT4_SB(sb)->s_journal && in ext4_quota_on()
5322 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); in ext4_quota_on()
5323 err = jbd2_journal_flush(EXT4_SB(sb)->s_journal); in ext4_quota_on()
5324 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); in ext4_quota_on()
5329 err = dquot_quota_on(sb, type, format_id, path); in ext4_quota_on()
5336 static int ext4_quota_enable(struct super_block *sb, int type, int format_id, in ext4_quota_enable() argument
5342 le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum), in ext4_quota_enable()
5343 le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum) in ext4_quota_enable()
5346 BUG_ON(!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)); in ext4_quota_enable()
5351 qf_inode = ext4_iget(sb, qf_inums[type]); in ext4_quota_enable()
5353 ext4_error(sb, "Bad quota inode # %lu", qf_inums[type]); in ext4_quota_enable()
5369 static int ext4_enable_quotas(struct super_block *sb) in ext4_enable_quotas() argument
5373 le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum), in ext4_enable_quotas()
5374 le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum) in ext4_enable_quotas()
5377 sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE; in ext4_enable_quotas()
5380 err = ext4_quota_enable(sb, type, QFMT_VFS_V1, in ext4_enable_quotas()
5383 ext4_warning(sb, in ext4_enable_quotas()
5394 static int ext4_quota_off(struct super_block *sb, int type) in ext4_quota_off() argument
5396 struct inode *inode = sb_dqopt(sb)->files[type]; in ext4_quota_off()
5401 if (test_opt(sb, DELALLOC)) in ext4_quota_off()
5402 sync_filesystem(sb); in ext4_quota_off()
5417 return dquot_quota_off(sb, type); in ext4_quota_off()
5424 static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, in ext4_quota_read() argument
5427 struct inode *inode = sb_dqopt(sb)->files[type]; in ext4_quota_read()
5428 ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); in ext4_quota_read()
5429 int offset = off & (sb->s_blocksize - 1); in ext4_quota_read()
5441 tocopy = sb->s_blocksize - offset < toread ? in ext4_quota_read()
5442 sb->s_blocksize - offset : toread; in ext4_quota_read()
5461 static ssize_t ext4_quota_write(struct super_block *sb, int type, in ext4_quota_write() argument
5464 struct inode *inode = sb_dqopt(sb)->files[type]; in ext4_quota_write()
5465 ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); in ext4_quota_write()
5466 int err, offset = off & (sb->s_blocksize - 1); in ext4_quota_write()
5470 if (EXT4_SB(sb)->s_journal && !handle) { in ext4_quota_write()
5471 ext4_msg(sb, KERN_WARNING, "Quota write (off=%llu, len=%llu)" in ext4_quota_write()
5480 if (sb->s_blocksize - offset < len) { in ext4_quota_write()
5481 ext4_msg(sb, KERN_WARNING, "Quota write (off=%llu, len=%llu)" in ext4_quota_write()
5535 static inline int ext2_feature_set_ok(struct super_block *sb) in ext2_feature_set_ok() argument
5537 if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP)) in ext2_feature_set_ok()
5539 if (sb->s_flags & MS_RDONLY) in ext2_feature_set_ok()
5541 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP)) in ext2_feature_set_ok()
5548 static inline int ext2_feature_set_ok(struct super_block *sb) { return 0; } in ext2_feature_set_ok() argument
5565 static inline int ext3_feature_set_ok(struct super_block *sb) in ext3_feature_set_ok() argument
5567 if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT3_FEATURE_INCOMPAT_SUPP)) in ext3_feature_set_ok()
5569 if (!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) in ext3_feature_set_ok()
5571 if (sb->s_flags & MS_RDONLY) in ext3_feature_set_ok()
5573 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP)) in ext3_feature_set_ok()
5580 static inline int ext3_feature_set_ok(struct super_block *sb) { return 0; } in ext3_feature_set_ok() argument