Lines Matching refs:sb
54 static int ext4_commit_super(struct super_block *sb,
56 static void ext4_mark_recovery_complete(struct super_block *sb,
58 static void ext4_clear_journal_err(struct super_block *sb,
60 static int ext4_sync_fs(struct super_block *sb, int wait);
61 static const char *ext4_decode_error(struct super_block *sb, int errno,
63 static int ext4_remount(struct super_block *sb, int *flags, char *data);
65 static int ext4_unfreeze(struct super_block *sb);
66 static void ext4_write_super(struct super_block *sb);
67 static int ext4_freeze(struct super_block *sb);
70 ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, in ext4_block_bitmap() argument
74 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_block_bitmap()
78 ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb, in ext4_inode_bitmap() argument
82 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_inode_bitmap()
86 ext4_fsblk_t ext4_inode_table(struct super_block *sb, in ext4_inode_table() argument
90 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_inode_table()
94 __u32 ext4_free_blks_count(struct super_block *sb, in ext4_free_blks_count() argument
98 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_free_blks_count()
102 __u32 ext4_free_inodes_count(struct super_block *sb, in ext4_free_inodes_count() argument
106 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_free_inodes_count()
110 __u32 ext4_used_dirs_count(struct super_block *sb, in ext4_used_dirs_count() argument
114 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_used_dirs_count()
118 __u32 ext4_itable_unused_count(struct super_block *sb, in ext4_itable_unused_count() argument
122 (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? in ext4_itable_unused_count()
126 void ext4_block_bitmap_set(struct super_block *sb, in ext4_block_bitmap_set() argument
130 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_block_bitmap_set()
134 void ext4_inode_bitmap_set(struct super_block *sb, in ext4_inode_bitmap_set() argument
138 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_inode_bitmap_set()
142 void ext4_inode_table_set(struct super_block *sb, in ext4_inode_table_set() argument
146 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_inode_table_set()
150 void ext4_free_blks_set(struct super_block *sb, in ext4_free_blks_set() argument
154 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_free_blks_set()
158 void ext4_free_inodes_set(struct super_block *sb, in ext4_free_inodes_set() argument
162 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_free_inodes_set()
166 void ext4_used_dirs_set(struct super_block *sb, in ext4_used_dirs_set() argument
170 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_used_dirs_set()
174 void ext4_itable_unused_set(struct super_block *sb, in ext4_itable_unused_set() argument
178 if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) in ext4_itable_unused_set()
190 handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks) in ext4_journal_start_sb() argument
194 if (sb->s_flags & MS_RDONLY) in ext4_journal_start_sb()
200 journal = EXT4_SB(sb)->s_journal; in ext4_journal_start_sb()
203 ext4_abort(sb, __func__, in ext4_journal_start_sb()
224 struct super_block *sb; in __ext4_journal_stop() local
236 sb = handle->h_transaction->t_journal->j_private; in __ext4_journal_stop()
243 __ext4_std_error(sb, where, err); in __ext4_journal_stop()
285 static void ext4_handle_error(struct super_block *sb) in ext4_handle_error() argument
287 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_handle_error()
289 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_handle_error()
292 if (sb->s_flags & MS_RDONLY) in ext4_handle_error()
295 if (!test_opt(sb, ERRORS_CONT)) { in ext4_handle_error()
296 journal_t *journal = EXT4_SB(sb)->s_journal; in ext4_handle_error()
298 EXT4_SB(sb)->s_mount_opt |= EXT4_MOUNT_ABORT; in ext4_handle_error()
302 if (test_opt(sb, ERRORS_RO)) { in ext4_handle_error()
304 sb->s_flags |= MS_RDONLY; in ext4_handle_error()
306 ext4_commit_super(sb, es, 1); in ext4_handle_error()
307 if (test_opt(sb, ERRORS_PANIC)) in ext4_handle_error()
309 sb->s_id); in ext4_handle_error()
312 void ext4_error(struct super_block *sb, const char *function, in ext4_error() argument
318 printk(KERN_CRIT "EXT4-fs error (device %s): %s: ", sb->s_id, function); in ext4_error()
323 ext4_handle_error(sb); in ext4_error()
326 static const char *ext4_decode_error(struct super_block *sb, int errno, in ext4_decode_error() argument
339 if (!sb || EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT) in ext4_decode_error()
362 void __ext4_std_error(struct super_block *sb, const char *function, int errno) in __ext4_std_error() argument
371 (sb->s_flags & MS_RDONLY)) in __ext4_std_error()
374 errstr = ext4_decode_error(sb, errno, nbuf); in __ext4_std_error()
376 sb->s_id, function, errstr); in __ext4_std_error()
378 ext4_handle_error(sb); in __ext4_std_error()
391 void ext4_abort(struct super_block *sb, const char *function, in ext4_abort() argument
399 printk(KERN_CRIT "EXT4-fs error (device %s): %s: ", sb->s_id, function); in ext4_abort()
404 if (test_opt(sb, ERRORS_PANIC)) in ext4_abort()
407 if (sb->s_flags & MS_RDONLY) in ext4_abort()
411 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_abort()
412 sb->s_flags |= MS_RDONLY; in ext4_abort()
413 EXT4_SB(sb)->s_mount_opt |= EXT4_MOUNT_ABORT; in ext4_abort()
414 if (EXT4_SB(sb)->s_journal) in ext4_abort()
415 jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); in ext4_abort()
418 void ext4_warning(struct super_block *sb, const char *function, in ext4_warning() argument
425 sb->s_id, function); in ext4_warning()
431 void ext4_grp_locked_error(struct super_block *sb, ext4_group_t grp, in ext4_grp_locked_error() argument
437 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_grp_locked_error()
440 printk(KERN_CRIT "EXT4-fs error (device %s): %s: ", sb->s_id, function); in ext4_grp_locked_error()
445 if (test_opt(sb, ERRORS_CONT)) { in ext4_grp_locked_error()
446 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_grp_locked_error()
448 ext4_commit_super(sb, es, 0); in ext4_grp_locked_error()
451 ext4_unlock_group(sb, grp); in ext4_grp_locked_error()
452 ext4_handle_error(sb); in ext4_grp_locked_error()
464 ext4_lock_group(sb, grp); in ext4_grp_locked_error()
469 void ext4_update_dynamic_rev(struct super_block *sb) in ext4_update_dynamic_rev() argument
471 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_update_dynamic_rev()
476 ext4_warning(sb, __func__, in ext4_update_dynamic_rev()
540 static void dump_orphan_list(struct super_block *sb, struct ext4_sb_info *sbi) in dump_orphan_list() argument
558 static void ext4_put_super(struct super_block *sb) in ext4_put_super() argument
560 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_put_super()
564 ext4_mb_release(sb); in ext4_put_super()
565 ext4_ext_release(sb); in ext4_put_super()
566 ext4_xattr_put_super(sb); in ext4_put_super()
571 ext4_abort(sb, __func__, in ext4_put_super()
574 if (!(sb->s_flags & MS_RDONLY)) { in ext4_put_super()
575 EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_put_super()
577 ext4_commit_super(sb, es, 1); in ext4_put_super()
581 remove_proc_entry(sb->s_id, ext4_proc_root); in ext4_put_super()
603 dump_orphan_list(sb, sbi); in ext4_put_super()
606 invalidate_bdev(sb->s_bdev); in ext4_put_super()
607 if (sbi->journal_bdev && sbi->journal_bdev != sb->s_bdev) { in ext4_put_super()
617 sb->s_fs_info = NULL; in ext4_put_super()
627 static struct inode *ext4_alloc_inode(struct super_block *sb) in ext4_alloc_inode() argument
720 struct super_block *sb) in ext4_show_quota_options() argument
723 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_show_quota_options()
752 struct super_block *sb = vfs->mnt_sb; in ext4_show_options() local
753 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_show_options()
761 if (test_opt(sb, MINIX_DF)) in ext4_show_options()
763 if (test_opt(sb, GRPID) && !(def_mount_opts & EXT4_DEFM_BSDGROUPS)) in ext4_show_options()
765 if (!test_opt(sb, GRPID) && (def_mount_opts & EXT4_DEFM_BSDGROUPS)) in ext4_show_options()
775 if (test_opt(sb, ERRORS_RO)) { in ext4_show_options()
781 if (test_opt(sb, ERRORS_CONT) && def_errors != EXT4_ERRORS_CONTINUE) in ext4_show_options()
783 if (test_opt(sb, ERRORS_PANIC) && def_errors != EXT4_ERRORS_PANIC) in ext4_show_options()
785 if (test_opt(sb, NO_UID32) && !(def_mount_opts & EXT4_DEFM_UID16)) in ext4_show_options()
787 if (test_opt(sb, DEBUG) && !(def_mount_opts & EXT4_DEFM_DEBUG)) in ext4_show_options()
789 if (test_opt(sb, OLDALLOC)) in ext4_show_options()
792 if (test_opt(sb, XATTR_USER) && in ext4_show_options()
795 if (!test_opt(sb, XATTR_USER) && in ext4_show_options()
801 if (test_opt(sb, POSIX_ACL) && !(def_mount_opts & EXT4_DEFM_ACL)) in ext4_show_options()
803 if (!test_opt(sb, POSIX_ACL) && (def_mount_opts & EXT4_DEFM_ACL)) in ext4_show_options()
806 if (!test_opt(sb, RESERVATION)) in ext4_show_options()
827 seq_puts(seq, test_opt(sb, BARRIER) ? "1" : "0"); in ext4_show_options()
828 if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) in ext4_show_options()
830 if (test_opt(sb, NOBH)) in ext4_show_options()
832 if (test_opt(sb, I_VERSION)) in ext4_show_options()
834 if (!test_opt(sb, DELALLOC)) in ext4_show_options()
844 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) in ext4_show_options()
846 else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) in ext4_show_options()
848 else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) in ext4_show_options()
855 if (test_opt(sb, DATA_ERR_ABORT)) in ext4_show_options()
858 ext4_show_quota_options(seq, sb); in ext4_show_options()
863 static struct inode *ext4_nfs_get_inode(struct super_block *sb, in ext4_nfs_get_inode() argument
868 if (ino < EXT4_FIRST_INO(sb) && ino != EXT4_ROOT_INO) in ext4_nfs_get_inode()
870 if (ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)) in ext4_nfs_get_inode()
881 inode = ext4_iget(sb, ino); in ext4_nfs_get_inode()
892 static struct dentry *ext4_fh_to_dentry(struct super_block *sb, struct fid *fid, in ext4_fh_to_dentry() argument
895 return generic_fh_to_dentry(sb, fid, fh_len, fh_type, in ext4_fh_to_dentry()
899 static struct dentry *ext4_fh_to_parent(struct super_block *sb, struct fid *fid, in ext4_fh_to_parent() argument
902 return generic_fh_to_parent(sb, fid, fh_len, fh_type, in ext4_fh_to_parent()
912 static int bdev_try_to_free_page(struct super_block *sb, struct page *page, gfp_t wait) in bdev_try_to_free_page() argument
914 journal_t *journal = EXT4_SB(sb)->s_journal; in bdev_try_to_free_page()
935 static int ext4_write_info(struct super_block *sb, int type);
936 static int ext4_quota_on(struct super_block *sb, int type, int format_id,
938 static int ext4_quota_on_mount(struct super_block *sb, int type);
939 static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
941 static ssize_t ext4_quota_write(struct super_block *sb, int type,
1102 static int parse_options(char *options, struct super_block *sb, in parse_options() argument
1107 struct ext4_sb_info *sbi = EXT4_SB(sb); in parse_options()
1307 if (sb_any_quota_loaded(sb) && in parse_options()
1346 if (sb_any_quota_loaded(sb) && in parse_options()
1365 if (sb_any_quota_loaded(sb) && in parse_options()
1384 if (sb_any_quota_loaded(sb)) { in parse_options()
1444 sb->s_flags |= MS_I_VERSION; in parse_options()
1517 static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, in ext4_setup_super() argument
1520 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_setup_super()
1555 ext4_update_dynamic_rev(sb); in ext4_setup_super()
1557 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_setup_super()
1559 ext4_commit_super(sb, es, 1); in ext4_setup_super()
1560 if (test_opt(sb, DEBUG)) in ext4_setup_super()
1563 sb->s_blocksize, in ext4_setup_super()
1565 EXT4_BLOCKS_PER_GROUP(sb), in ext4_setup_super()
1566 EXT4_INODES_PER_GROUP(sb), in ext4_setup_super()
1569 if (EXT4_SB(sb)->s_journal) { in ext4_setup_super()
1571 sb->s_id, EXT4_SB(sb)->s_journal->j_inode ? "internal" : in ext4_setup_super()
1572 "external", EXT4_SB(sb)->s_journal->j_devname); in ext4_setup_super()
1574 printk(KERN_INFO "EXT4 FS on %s, no journal\n", sb->s_id); in ext4_setup_super()
1579 static int ext4_fill_flex_info(struct super_block *sb) in ext4_fill_flex_info() argument
1581 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_fill_flex_info()
1600 EXT4_DESC_PER_BLOCK_BITS(sb))) / groups_per_flex; in ext4_fill_flex_info()
1610 gdp = ext4_get_group_desc(sb, i, &bh); in ext4_fill_flex_info()
1614 ext4_free_inodes_count(sb, gdp); in ext4_fill_flex_info()
1616 ext4_free_blks_count(sb, gdp); in ext4_fill_flex_info()
1662 static int ext4_check_descriptors(struct super_block *sb) in ext4_check_descriptors() argument
1664 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_check_descriptors()
1673 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) in ext4_check_descriptors()
1679 struct ext4_group_desc *gdp = ext4_get_group_desc(sb, i, NULL); in ext4_check_descriptors()
1685 (EXT4_BLOCKS_PER_GROUP(sb) - 1); in ext4_check_descriptors()
1687 block_bitmap = ext4_block_bitmap(sb, gdp); in ext4_check_descriptors()
1694 inode_bitmap = ext4_inode_bitmap(sb, gdp); in ext4_check_descriptors()
1701 inode_table = ext4_inode_table(sb, gdp); in ext4_check_descriptors()
1715 if (!(sb->s_flags & MS_RDONLY)) { in ext4_check_descriptors()
1722 first_block += EXT4_BLOCKS_PER_GROUP(sb); in ext4_check_descriptors()
1725 ext4_free_blocks_count_set(sbi->s_es, ext4_count_free_blocks(sb)); in ext4_check_descriptors()
1726 sbi->s_es->s_free_inodes_count = cpu_to_le32(ext4_count_free_inodes(sb)); in ext4_check_descriptors()
1747 static void ext4_orphan_cleanup(struct super_block *sb, in ext4_orphan_cleanup() argument
1750 unsigned int s_flags = sb->s_flags; in ext4_orphan_cleanup()
1760 if (bdev_read_only(sb->s_bdev)) { in ext4_orphan_cleanup()
1766 if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) { in ext4_orphan_cleanup()
1777 sb->s_id); in ext4_orphan_cleanup()
1778 sb->s_flags &= ~MS_RDONLY; in ext4_orphan_cleanup()
1782 sb->s_flags |= MS_ACTIVE; in ext4_orphan_cleanup()
1785 if (EXT4_SB(sb)->s_qf_names[i]) { in ext4_orphan_cleanup()
1786 int ret = ext4_quota_on_mount(sb, i); in ext4_orphan_cleanup()
1798 inode = ext4_orphan_get(sb, le32_to_cpu(es->s_last_orphan)); in ext4_orphan_cleanup()
1804 list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan); in ext4_orphan_cleanup()
1829 sb->s_id, PLURAL(nr_orphans)); in ext4_orphan_cleanup()
1832 sb->s_id, PLURAL(nr_truncates)); in ext4_orphan_cleanup()
1836 if (sb_dqopt(sb)->files[i]) in ext4_orphan_cleanup()
1837 vfs_quota_off(sb, i, 0); in ext4_orphan_cleanup()
1840 sb->s_flags = s_flags; /* Restore MS_RDONLY status */ in ext4_orphan_cleanup()
1945 static ext4_fsblk_t descriptor_loc(struct super_block *sb, in descriptor_loc() argument
1948 struct ext4_sb_info *sbi = EXT4_SB(sb); in descriptor_loc()
1954 if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG) || in descriptor_loc()
1958 if (ext4_bg_has_super(sb, bg)) in descriptor_loc()
1960 return (has_super + ext4_group_first_block_no(sb, bg)); in descriptor_loc()
1992 static int ext4_fill_super(struct super_block *sb, void *data, int silent) in ext4_fill_super() argument
2022 sb->s_fs_info = sbi; in ext4_fill_super()
2032 for (cp = sb->s_id; (cp = strchr(cp, '/'));) in ext4_fill_super()
2035 blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE); in ext4_fill_super()
2052 if (!(bh = sb_bread(sb, logical_sb_block))) { in ext4_fill_super()
2062 sb->s_magic = le16_to_cpu(es->s_magic); in ext4_fill_super()
2063 if (sb->s_magic != EXT4_SUPER_MAGIC) in ext4_fill_super()
2112 if (!parse_options((char *) data, sb, &journal_devnum, in ext4_fill_super()
2116 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | in ext4_fill_super()
2120 (EXT4_HAS_COMPAT_FEATURE(sb, ~0U) || in ext4_fill_super()
2121 EXT4_HAS_RO_COMPAT_FEATURE(sb, ~0U) || in ext4_fill_super()
2122 EXT4_HAS_INCOMPAT_FEATURE(sb, ~0U))) in ext4_fill_super()
2132 features = EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT4_FEATURE_INCOMPAT_SUPP); in ext4_fill_super()
2135 "unsupported optional features (%x).\n", sb->s_id, in ext4_fill_super()
2136 (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) & in ext4_fill_super()
2140 features = EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT4_FEATURE_RO_COMPAT_SUPP); in ext4_fill_super()
2141 if (!(sb->s_flags & MS_RDONLY) && features) { in ext4_fill_super()
2143 "unsupported optional features (%x).\n", sb->s_id, in ext4_fill_super()
2144 (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) & in ext4_fill_super()
2148 has_huge_files = EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
2156 !(sb->s_flags & MS_RDONLY)) { in ext4_fill_super()
2159 "without CONFIG_LBD.\n", sb->s_id); in ext4_fill_super()
2169 blocksize, sb->s_id); in ext4_fill_super()
2173 if (sb->s_blocksize != blocksize) { in ext4_fill_super()
2176 if (!sb_set_blocksize(sb, blocksize)) { in ext4_fill_super()
2185 bh = sb_bread(sb, logical_sb_block); in ext4_fill_super()
2200 sbi->s_bitmap_maxbytes = ext4_max_bitmap_size(sb->s_blocksize_bits, in ext4_fill_super()
2202 sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files); in ext4_fill_super()
2219 sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2); in ext4_fill_super()
2222 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT)) { in ext4_fill_super()
2235 if (EXT4_INODE_SIZE(sb) == 0 || EXT4_INODES_PER_GROUP(sb) == 0) in ext4_fill_super()
2237 sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb); in ext4_fill_super()
2242 sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb); in ext4_fill_super()
2245 sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb)); in ext4_fill_super()
2246 sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb)); in ext4_fill_super()
2260 sb->s_dirt = 1; in ext4_fill_super()
2277 (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { in ext4_fill_super()
2279 " too large to mount safely\n", sb->s_id); in ext4_fill_super()
2286 if (EXT4_BLOCKS_PER_GROUP(sb) == 0) in ext4_fill_super()
2302 EXT4_BLOCKS_PER_GROUP(sb) - 1); in ext4_fill_super()
2303 do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb)); in ext4_fill_super()
2304 if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) { in ext4_fill_super()
2310 EXT4_BLOCKS_PER_GROUP(sb)); in ext4_fill_super()
2314 db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / in ext4_fill_super()
2315 EXT4_DESC_PER_BLOCK(sb); in ext4_fill_super()
2325 sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root); in ext4_fill_super()
2336 block = descriptor_loc(sb, logical_sb_block, i); in ext4_fill_super()
2337 sbi->s_group_desc[i] = sb_bread(sb, block); in ext4_fill_super()
2345 if (!ext4_check_descriptors(sb)) { in ext4_fill_super()
2349 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) in ext4_fill_super()
2350 if (!ext4_fill_flex_info(sb)) { in ext4_fill_super()
2362 ext4_count_free_blocks(sb)); in ext4_fill_super()
2365 ext4_count_free_inodes(sb)); in ext4_fill_super()
2369 ext4_count_dirs(sb)); in ext4_fill_super()
2384 sb->s_op = &ext4_sops; in ext4_fill_super()
2385 sb->s_export_op = &ext4_export_ops; in ext4_fill_super()
2386 sb->s_xattr = ext4_xattr_handlers; in ext4_fill_super()
2388 sb->s_qcop = &ext4_qctl_operations; in ext4_fill_super()
2389 sb->dq_op = &ext4_quota_operations; in ext4_fill_super()
2393 sb->s_root = NULL; in ext4_fill_super()
2396 EXT4_HAS_INCOMPAT_FEATURE(sb, in ext4_fill_super()
2403 if (!test_opt(sb, NOLOAD) && in ext4_fill_super()
2404 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { in ext4_fill_super()
2405 if (ext4_load_journal(sb, es, journal_devnum)) in ext4_fill_super()
2407 if (!(sb->s_flags & MS_RDONLY) && in ext4_fill_super()
2408 EXT4_SB(sb)->s_journal->j_failed_commit) { in ext4_fill_super()
2411 "%u is corrupt\n", sb->s_id, in ext4_fill_super()
2412 EXT4_SB(sb)->s_journal->j_failed_commit); in ext4_fill_super()
2413 if (test_opt(sb, ERRORS_RO)) { in ext4_fill_super()
2416 sb->s_flags |= MS_RDONLY; in ext4_fill_super()
2417 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_fill_super()
2420 if (test_opt(sb, ERRORS_PANIC)) { in ext4_fill_super()
2421 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_fill_super()
2423 ext4_commit_super(sb, es, 1); in ext4_fill_super()
2427 } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) && in ext4_fill_super()
2428 EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { in ext4_fill_super()
2441 !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0, in ext4_fill_super()
2447 if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { in ext4_fill_super()
2451 } else if (test_opt(sb, JOURNAL_CHECKSUM)) { in ext4_fill_super()
2464 switch (test_opt(sb, DATA_FLAGS)) { in ext4_fill_super()
2492 if (test_opt(sb, NOBH)) { in ext4_fill_super()
2493 if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) { in ext4_fill_super()
2504 root = ext4_iget(sb, EXT4_ROOT_INO); in ext4_fill_super()
2515 sb->s_root = d_alloc_root(root); in ext4_fill_super()
2516 if (!sb->s_root) { in ext4_fill_super()
2523 ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY); in ext4_fill_super()
2529 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_fill_super()
2550 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { in ext4_fill_super()
2554 } else if (test_opt(sb, DELALLOC)) in ext4_fill_super()
2557 ext4_ext_init(sb); in ext4_fill_super()
2558 err = ext4_mb_init(sb, needs_recovery); in ext4_fill_super()
2573 EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS; in ext4_fill_super()
2574 ext4_orphan_cleanup(sb, es); in ext4_fill_super()
2575 EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS; in ext4_fill_super()
2578 ext4_mark_recovery_complete(sb, es); in ext4_fill_super()
2580 if (EXT4_SB(sb)->s_journal) { in ext4_fill_super()
2581 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) in ext4_fill_super()
2583 else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) in ext4_fill_super()
2591 sb->s_id, descr); in ext4_fill_super()
2599 sb->s_id); in ext4_fill_super()
2603 printk(KERN_ERR "EXT4-fs (device %s): mount failed\n", sb->s_id); in ext4_fill_super()
2620 remove_proc_entry(sb->s_id, ext4_proc_root); in ext4_fill_super()
2629 sb->s_fs_info = NULL; in ext4_fill_super()
2640 static void ext4_init_journal_params(struct super_block *sb, journal_t *journal) in ext4_init_journal_params() argument
2642 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_init_journal_params()
2649 if (test_opt(sb, BARRIER)) in ext4_init_journal_params()
2653 if (test_opt(sb, DATA_ERR_ABORT)) in ext4_init_journal_params()
2660 static journal_t *ext4_get_journal(struct super_block *sb, in ext4_get_journal() argument
2666 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_get_journal()
2672 journal_inode = ext4_iget(sb, journal_inum); in ext4_get_journal()
2698 journal->j_private = sb; in ext4_get_journal()
2699 ext4_init_journal_params(sb, journal); in ext4_get_journal()
2703 static journal_t *ext4_get_dev_journal(struct super_block *sb, in ext4_get_dev_journal() argument
2716 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_get_dev_journal()
2722 if (bd_claim(bdev, sb)) { in ext4_get_dev_journal()
2729 blocksize = sb->s_blocksize; in ext4_get_dev_journal()
2756 if (memcmp(EXT4_SB(sb)->s_es->s_journal_uuid, es->s_uuid, 16)) { in ext4_get_dev_journal()
2766 journal = jbd2_journal_init_dev(bdev, sb->s_bdev, in ext4_get_dev_journal()
2772 journal->j_private = sb; in ext4_get_dev_journal()
2785 EXT4_SB(sb)->journal_bdev = bdev; in ext4_get_dev_journal()
2786 ext4_init_journal_params(sb, journal); in ext4_get_dev_journal()
2795 static int ext4_load_journal(struct super_block *sb, in ext4_load_journal() argument
2805 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_load_journal()
2815 really_read_only = bdev_read_only(sb->s_bdev); in ext4_load_journal()
2823 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { in ext4_load_journal()
2824 if (sb->s_flags & MS_RDONLY) { in ext4_load_journal()
2844 if (!(journal = ext4_get_journal(sb, journal_inum))) in ext4_load_journal()
2847 if (!(journal = ext4_get_dev_journal(sb, journal_dev))) in ext4_load_journal()
2856 if (!really_read_only && test_opt(sb, UPDATE_JOURNAL)) { in ext4_load_journal()
2865 if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) in ext4_load_journal()
2876 EXT4_SB(sb)->s_journal = journal; in ext4_load_journal()
2877 ext4_clear_journal_err(sb, es); in ext4_load_journal()
2882 sb->s_dirt = 1; in ext4_load_journal()
2885 ext4_commit_super(sb, es, 1); in ext4_load_journal()
2891 static int ext4_commit_super(struct super_block *sb, in ext4_commit_super() argument
2894 struct buffer_head *sbh = EXT4_SB(sb)->s_sbh; in ext4_commit_super()
2909 "superblock detected for %s.\n", sb->s_id); in ext4_commit_super()
2915 &EXT4_SB(sb)->s_freeblocks_counter)); in ext4_commit_super()
2917 &EXT4_SB(sb)->s_freeinodes_counter)); in ext4_commit_super()
2929 "superblock for %s.\n", sb->s_id); in ext4_commit_super()
2943 static void ext4_mark_recovery_complete(struct super_block *sb, in ext4_mark_recovery_complete() argument
2946 journal_t *journal = EXT4_SB(sb)->s_journal; in ext4_mark_recovery_complete()
2948 if (!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { in ext4_mark_recovery_complete()
2956 lock_super(sb); in ext4_mark_recovery_complete()
2957 if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) && in ext4_mark_recovery_complete()
2958 sb->s_flags & MS_RDONLY) { in ext4_mark_recovery_complete()
2959 EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_mark_recovery_complete()
2960 sb->s_dirt = 0; in ext4_mark_recovery_complete()
2961 ext4_commit_super(sb, es, 1); in ext4_mark_recovery_complete()
2963 unlock_super(sb); in ext4_mark_recovery_complete()
2974 static void ext4_clear_journal_err(struct super_block *sb, in ext4_clear_journal_err() argument
2981 BUG_ON(!EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)); in ext4_clear_journal_err()
2983 journal = EXT4_SB(sb)->s_journal; in ext4_clear_journal_err()
2994 errstr = ext4_decode_error(sb, j_errno, nbuf); in ext4_clear_journal_err()
2995 ext4_warning(sb, __func__, "Filesystem error recorded " in ext4_clear_journal_err()
2997 ext4_warning(sb, __func__, "Marking fs in need of " in ext4_clear_journal_err()
3000 EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; in ext4_clear_journal_err()
3002 ext4_commit_super(sb, es, 1); in ext4_clear_journal_err()
3012 int ext4_force_commit(struct super_block *sb) in ext4_force_commit() argument
3017 if (sb->s_flags & MS_RDONLY) in ext4_force_commit()
3020 journal = EXT4_SB(sb)->s_journal; in ext4_force_commit()
3022 sb->s_dirt = 0; in ext4_force_commit()
3035 static void ext4_write_super(struct super_block *sb) in ext4_write_super() argument
3037 if (EXT4_SB(sb)->s_journal) { in ext4_write_super()
3038 if (mutex_trylock(&sb->s_lock) != 0) in ext4_write_super()
3040 sb->s_dirt = 0; in ext4_write_super()
3042 ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1); in ext4_write_super()
3046 static int ext4_sync_fs(struct super_block *sb, int wait) in ext4_sync_fs() argument
3051 trace_mark(ext4_sync_fs, "dev %s wait %d", sb->s_id, wait); in ext4_sync_fs()
3052 sb->s_dirt = 0; in ext4_sync_fs()
3053 if (EXT4_SB(sb)->s_journal) { in ext4_sync_fs()
3054 if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, in ext4_sync_fs()
3057 jbd2_log_wait_commit(EXT4_SB(sb)->s_journal, in ext4_sync_fs()
3061 ext4_commit_super(sb, EXT4_SB(sb)->s_es, wait); in ext4_sync_fs()
3070 static int ext4_freeze(struct super_block *sb) in ext4_freeze() argument
3074 sb->s_dirt = 0; in ext4_freeze()
3076 if (!(sb->s_flags & MS_RDONLY)) { in ext4_freeze()
3077 journal = EXT4_SB(sb)->s_journal; in ext4_freeze()
3093 EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_freeze()
3094 error = ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1); in ext4_freeze()
3108 static int ext4_unfreeze(struct super_block *sb) in ext4_unfreeze() argument
3110 if (EXT4_SB(sb)->s_journal && !(sb->s_flags & MS_RDONLY)) { in ext4_unfreeze()
3111 lock_super(sb); in ext4_unfreeze()
3113 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); in ext4_unfreeze()
3114 ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1); in ext4_unfreeze()
3115 unlock_super(sb); in ext4_unfreeze()
3116 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); in ext4_unfreeze()
3121 static int ext4_remount(struct super_block *sb, int *flags, char *data) in ext4_remount() argument
3124 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_remount()
3136 old_sb_flags = sb->s_flags; in ext4_remount()
3154 if (!parse_options(data, sb, NULL, &journal_ioprio, in ext4_remount()
3161 ext4_abort(sb, __func__, "Abort forced by user"); in ext4_remount()
3163 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | in ext4_remount()
3169 ext4_init_journal_params(sb, sbi->s_journal); in ext4_remount()
3173 if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY) || in ext4_remount()
3185 sb->s_flags |= MS_RDONLY; in ext4_remount()
3201 unlock_super(sb); in ext4_remount()
3202 ext4_mark_recovery_complete(sb, es); in ext4_remount()
3203 lock_super(sb); in ext4_remount()
3207 if ((ret = EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_remount()
3211 "optional features (%x).\n", sb->s_id, in ext4_remount()
3225 ext4_get_group_desc(sb, g, NULL); in ext4_remount()
3248 sb->s_id); in ext4_remount()
3260 ext4_clear_journal_err(sb, es); in ext4_remount()
3262 if ((err = ext4_group_extend(sb, es, n_blocks_count))) in ext4_remount()
3264 if (!ext4_setup_super(sb, es, 0)) in ext4_remount()
3265 sb->s_flags &= ~MS_RDONLY; in ext4_remount()
3269 ext4_commit_super(sb, es, 1); in ext4_remount()
3280 sb->s_flags = old_sb_flags; in ext4_remount()
3301 struct super_block *sb = dentry->d_sb; in ext4_statfs() local
3302 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_statfs()
3306 if (test_opt(sb, MINIX_DF)) { in ext4_statfs()
3331 overhead += ext4_bg_has_super(sb, i) + in ext4_statfs()
3332 ext4_bg_num_gdb(sb, i); in ext4_statfs()
3347 buf->f_bsize = sb->s_blocksize; in ext4_statfs()
3486 static int ext4_write_info(struct super_block *sb, int type) in ext4_write_info() argument
3492 handle = ext4_journal_start(sb->s_root->d_inode, 2); in ext4_write_info()
3495 ret = dquot_commit_info(sb, type); in ext4_write_info()
3506 static int ext4_quota_on_mount(struct super_block *sb, int type) in ext4_quota_on_mount() argument
3508 return vfs_quota_on_mount(sb, EXT4_SB(sb)->s_qf_names[type], in ext4_quota_on_mount()
3509 EXT4_SB(sb)->s_jquota_fmt, type); in ext4_quota_on_mount()
3515 static int ext4_quota_on(struct super_block *sb, int type, int format_id, in ext4_quota_on() argument
3521 if (!test_opt(sb, QUOTA)) in ext4_quota_on()
3525 return vfs_quota_on(sb, type, format_id, name, remount); in ext4_quota_on()
3532 if (path.mnt->mnt_sb != sb) { in ext4_quota_on()
3537 if (EXT4_SB(sb)->s_qf_names[type]) { in ext4_quota_on()
3539 if (path.dentry->d_parent != sb->s_root) in ext4_quota_on()
3549 if (EXT4_SB(sb)->s_journal && in ext4_quota_on()
3555 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); in ext4_quota_on()
3556 err = jbd2_journal_flush(EXT4_SB(sb)->s_journal); in ext4_quota_on()
3557 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); in ext4_quota_on()
3564 err = vfs_quota_on_path(sb, type, format_id, &path); in ext4_quota_on()
3573 static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, in ext4_quota_read() argument
3576 struct inode *inode = sb_dqopt(sb)->files[type]; in ext4_quota_read()
3577 ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); in ext4_quota_read()
3579 int offset = off & (sb->s_blocksize - 1); in ext4_quota_read()
3591 tocopy = sb->s_blocksize - offset < toread ? in ext4_quota_read()
3592 sb->s_blocksize - offset : toread; in ext4_quota_read()
3611 static ssize_t ext4_quota_write(struct super_block *sb, int type, in ext4_quota_write() argument
3614 struct inode *inode = sb_dqopt(sb)->files[type]; in ext4_quota_write()
3615 ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); in ext4_quota_write()
3617 int offset = off & (sb->s_blocksize - 1); in ext4_quota_write()
3619 int journal_quota = EXT4_SB(sb)->s_qf_names[type] != NULL; in ext4_quota_write()
3624 if (EXT4_SB(sb)->s_journal && !handle) { in ext4_quota_write()
3632 tocopy = sb->s_blocksize - offset < towrite ? in ext4_quota_write()
3633 sb->s_blocksize - offset : towrite; in ext4_quota_write()