Lines Matching refs:sb

51 static int ext3_commit_super(struct super_block *sb,
54 static void ext3_mark_recovery_complete(struct super_block * sb,
56 static void ext3_clear_journal_err(struct super_block * sb,
58 static int ext3_sync_fs(struct super_block *sb, int wait);
59 static const char *ext3_decode_error(struct super_block * sb, int errno,
61 static int ext3_remount (struct super_block * sb, int * flags, char * data);
63 static int ext3_unfreeze(struct super_block *sb);
64 static int ext3_freeze(struct super_block *sb);
69 handle_t *ext3_journal_start_sb(struct super_block *sb, int nblocks) in ext3_journal_start_sb() argument
73 if (sb->s_flags & MS_RDONLY) in ext3_journal_start_sb()
79 journal = EXT3_SB(sb)->s_journal; in ext3_journal_start_sb()
81 ext3_abort(sb, __func__, in ext3_journal_start_sb()
91 struct super_block *sb; in __ext3_journal_stop() local
95 sb = handle->h_transaction->t_journal->j_private; in __ext3_journal_stop()
102 __ext3_std_error(sb, where, err); in __ext3_journal_stop()
127 void ext3_msg(struct super_block *sb, const char *prefix, in ext3_msg() argument
138 printk("%sEXT3-fs (%s): %pV\n", prefix, sb->s_id, &vaf); in ext3_msg()
158 static void ext3_handle_error(struct super_block *sb) in ext3_handle_error() argument
160 struct ext3_super_block *es = EXT3_SB(sb)->s_es; in ext3_handle_error()
162 EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS; in ext3_handle_error()
165 if (sb->s_flags & MS_RDONLY) in ext3_handle_error()
168 if (!test_opt (sb, ERRORS_CONT)) { in ext3_handle_error()
169 journal_t *journal = EXT3_SB(sb)->s_journal; in ext3_handle_error()
171 set_opt(EXT3_SB(sb)->s_mount_opt, ABORT); in ext3_handle_error()
175 if (test_opt (sb, ERRORS_RO)) { in ext3_handle_error()
176 ext3_msg(sb, KERN_CRIT, in ext3_handle_error()
183 sb->s_flags |= MS_RDONLY; in ext3_handle_error()
185 ext3_commit_super(sb, es, 1); in ext3_handle_error()
186 if (test_opt(sb, ERRORS_PANIC)) in ext3_handle_error()
188 sb->s_id); in ext3_handle_error()
191 void ext3_error(struct super_block *sb, const char *function, in ext3_error() argument
203 sb->s_id, function, &vaf); in ext3_error()
207 ext3_handle_error(sb); in ext3_error()
210 static const char *ext3_decode_error(struct super_block * sb, int errno, in ext3_decode_error() argument
223 if (!sb || EXT3_SB(sb)->s_journal->j_flags & JFS_ABORT) in ext3_decode_error()
246 void __ext3_std_error (struct super_block * sb, const char * function, in __ext3_std_error() argument
256 (sb->s_flags & MS_RDONLY)) in __ext3_std_error()
259 errstr = ext3_decode_error(sb, errno, nbuf); in __ext3_std_error()
260 ext3_msg(sb, KERN_CRIT, "error in %s: %s", function, errstr); in __ext3_std_error()
262 ext3_handle_error(sb); in __ext3_std_error()
275 void ext3_abort(struct super_block *sb, const char *function, in ext3_abort() argument
287 sb->s_id, function, &vaf); in ext3_abort()
291 if (test_opt(sb, ERRORS_PANIC)) in ext3_abort()
294 if (sb->s_flags & MS_RDONLY) in ext3_abort()
297 ext3_msg(sb, KERN_CRIT, in ext3_abort()
299 EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS; in ext3_abort()
300 set_opt(EXT3_SB(sb)->s_mount_opt, ABORT); in ext3_abort()
306 sb->s_flags |= MS_RDONLY; in ext3_abort()
308 if (EXT3_SB(sb)->s_journal) in ext3_abort()
309 journal_abort(EXT3_SB(sb)->s_journal, -EIO); in ext3_abort()
312 void ext3_warning(struct super_block *sb, const char *function, in ext3_warning() argument
324 sb->s_id, function, &vaf); in ext3_warning()
329 void ext3_update_dynamic_rev(struct super_block *sb) in ext3_update_dynamic_rev() argument
331 struct ext3_super_block *es = EXT3_SB(sb)->s_es; in ext3_update_dynamic_rev()
336 ext3_msg(sb, KERN_WARNING, in ext3_update_dynamic_rev()
357 static struct block_device *ext3_blkdev_get(dev_t dev, struct super_block *sb) in ext3_blkdev_get() argument
362 bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); in ext3_blkdev_get()
368 ext3_msg(sb, KERN_ERR, "error: failed to open journal device %s: %ld", in ext3_blkdev_get()
397 static void dump_orphan_list(struct super_block *sb, struct ext3_sb_info *sbi) in dump_orphan_list() argument
401 ext3_msg(sb, KERN_ERR, "error: sb orphan head is %d", in dump_orphan_list()
404 ext3_msg(sb, KERN_ERR, "sb_info orphan list:"); in dump_orphan_list()
407 ext3_msg(sb, KERN_ERR, " " in dump_orphan_list()
415 static void ext3_put_super (struct super_block * sb) in ext3_put_super() argument
417 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_put_super()
421 dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); in ext3_put_super()
422 ext3_xattr_put_super(sb); in ext3_put_super()
426 ext3_abort(sb, __func__, "Couldn't clean up the journal"); in ext3_put_super()
428 if (!(sb->s_flags & MS_RDONLY)) { in ext3_put_super()
429 EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); in ext3_put_super()
433 ext3_commit_super(sb, es, 1); in ext3_put_super()
453 dump_orphan_list(sb, sbi); in ext3_put_super()
456 invalidate_bdev(sb->s_bdev); in ext3_put_super()
457 if (sbi->journal_bdev && sbi->journal_bdev != sb->s_bdev) { in ext3_put_super()
467 sb->s_fs_info = NULL; in ext3_put_super()
479 static struct inode *ext3_alloc_inode(struct super_block *sb) in ext3_alloc_inode() argument
558 static inline void ext3_show_quota_options(struct seq_file *seq, struct super_block *sb) in ext3_show_quota_options() argument
561 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_show_quota_options()
586 if (test_opt(sb, USRQUOTA)) in ext3_show_quota_options()
589 if (test_opt(sb, GRPQUOTA)) in ext3_show_quota_options()
614 struct super_block *sb = root->d_sb; in ext3_show_options() local
615 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_show_options()
623 if (test_opt(sb, MINIX_DF)) in ext3_show_options()
625 if (test_opt(sb, GRPID)) in ext3_show_options()
627 if (!test_opt(sb, GRPID) && (def_mount_opts & EXT3_DEFM_BSDGROUPS)) in ext3_show_options()
639 if (test_opt(sb, ERRORS_RO)) { in ext3_show_options()
647 if (test_opt(sb, ERRORS_CONT)) in ext3_show_options()
649 if (test_opt(sb, ERRORS_PANIC)) in ext3_show_options()
651 if (test_opt(sb, NO_UID32)) in ext3_show_options()
653 if (test_opt(sb, DEBUG)) in ext3_show_options()
656 if (test_opt(sb, XATTR_USER)) in ext3_show_options()
658 if (!test_opt(sb, XATTR_USER) && in ext3_show_options()
664 if (test_opt(sb, POSIX_ACL)) in ext3_show_options()
666 if (!test_opt(sb, POSIX_ACL) && (def_mount_opts & EXT3_DEFM_ACL)) in ext3_show_options()
669 if (!test_opt(sb, RESERVATION)) in ext3_show_options()
680 seq_puts(seq, test_opt(sb, BARRIER) ? "1" : "0"); in ext3_show_options()
681 seq_printf(seq, ",data=%s", data_mode_string(test_opt(sb, DATA_FLAGS))); in ext3_show_options()
682 if (test_opt(sb, DATA_ERR_ABORT)) in ext3_show_options()
685 if (test_opt(sb, NOLOAD)) in ext3_show_options()
688 ext3_show_quota_options(seq, sb); in ext3_show_options()
694 static struct inode *ext3_nfs_get_inode(struct super_block *sb, in ext3_nfs_get_inode() argument
699 if (ino < EXT3_FIRST_INO(sb) && ino != EXT3_ROOT_INO) in ext3_nfs_get_inode()
701 if (ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) in ext3_nfs_get_inode()
712 inode = ext3_iget(sb, ino); in ext3_nfs_get_inode()
723 static struct dentry *ext3_fh_to_dentry(struct super_block *sb, struct fid *fid, in ext3_fh_to_dentry() argument
726 return generic_fh_to_dentry(sb, fid, fh_len, fh_type, in ext3_fh_to_dentry()
730 static struct dentry *ext3_fh_to_parent(struct super_block *sb, struct fid *fid, in ext3_fh_to_parent() argument
733 return generic_fh_to_parent(sb, fid, fh_len, fh_type, in ext3_fh_to_parent()
743 static int bdev_try_to_free_page(struct super_block *sb, struct page *page, in bdev_try_to_free_page() argument
746 journal_t *journal = EXT3_SB(sb)->s_journal; in bdev_try_to_free_page()
765 static int ext3_write_info(struct super_block *sb, int type);
766 static int ext3_quota_on(struct super_block *sb, int type, int format_id,
768 static int ext3_quota_on_mount(struct super_block *sb, int type);
769 static ssize_t ext3_quota_read(struct super_block *sb, int type, char *data,
771 static ssize_t ext3_quota_write(struct super_block *sb, int type,
901 static ext3_fsblk_t get_sb_block(void **data, struct super_block *sb) in get_sb_block() argument
912 ext3_msg(sb, KERN_ERR, "error: invalid sb specification: %s", in get_sb_block()
923 static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) in set_qf_name() argument
925 struct ext3_sb_info *sbi = EXT3_SB(sb); in set_qf_name()
928 if (sb_any_quota_loaded(sb) && in set_qf_name()
930 ext3_msg(sb, KERN_ERR, in set_qf_name()
937 ext3_msg(sb, KERN_ERR, in set_qf_name()
946 ext3_msg(sb, KERN_ERR, in set_qf_name()
953 ext3_msg(sb, KERN_ERR, in set_qf_name()
963 static int clear_qf_name(struct super_block *sb, int qtype) { in clear_qf_name() argument
965 struct ext3_sb_info *sbi = EXT3_SB(sb); in clear_qf_name()
967 if (sb_any_quota_loaded(sb) && in clear_qf_name()
969 ext3_msg(sb, KERN_ERR, "Cannot change journaled quota options" in clear_qf_name()
981 static int parse_options (char *options, struct super_block *sb, in parse_options() argument
985 struct ext3_sb_info *sbi = EXT3_SB(sb); in parse_options()
1032 ext3_msg(sb, KERN_ERR, "Invalid uid value %d", option); in parse_options()
1043 ext3_msg(sb, KERN_ERR, "Invalid gid value %d", option); in parse_options()
1077 ext3_msg(sb, KERN_WARNING, in parse_options()
1081 ext3_msg(sb, KERN_WARNING, in parse_options()
1094 ext3_msg(sb, KERN_INFO, in parse_options()
1108 ext3_msg(sb, KERN_INFO, in parse_options()
1125 ext3_msg(sb, KERN_ERR, "error: cannot specify " in parse_options()
1133 ext3_msg(sb, KERN_ERR, "error: cannot specify " in parse_options()
1143 ext3_msg(sb, KERN_ERR, "error: cannot specify " in parse_options()
1153 ext3_msg(sb, KERN_ERR, "error: cannot specify " in parse_options()
1160 ext3_msg(sb, KERN_ERR, "error: could not dup " in parse_options()
1167 ext3_msg(sb, KERN_ERR, "error: could not find " in parse_options()
1175 ext3_msg(sb, KERN_ERR, "error: journal path %s " in parse_options()
1208 if (test_opt(sb, DATA_FLAGS) == data_opt) in parse_options()
1210 ext3_msg(sb, KERN_ERR, in parse_options()
1215 data_mode_string(test_opt(sb, in parse_options()
1232 if (!set_qf_name(sb, USRQUOTA, &args[0])) in parse_options()
1236 if (!set_qf_name(sb, GRPQUOTA, &args[0])) in parse_options()
1240 if (!clear_qf_name(sb, USRQUOTA)) in parse_options()
1244 if (!clear_qf_name(sb, GRPQUOTA)) in parse_options()
1256 if (sb_any_quota_loaded(sb) && in parse_options()
1258 ext3_msg(sb, KERN_ERR, "error: cannot change " in parse_options()
1275 if (sb_any_quota_loaded(sb)) { in parse_options()
1276 ext3_msg(sb, KERN_ERR, "error: cannot change " in parse_options()
1288 ext3_msg(sb, KERN_ERR, in parse_options()
1298 ext3_msg(sb, KERN_ERR, in parse_options()
1326 ext3_msg(sb, KERN_ERR, in parse_options()
1336 ext3_msg(sb, KERN_WARNING, in parse_options()
1340 ext3_msg(sb, KERN_WARNING, in parse_options()
1344 ext3_msg(sb, KERN_ERR, in parse_options()
1352 if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) in parse_options()
1354 if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) in parse_options()
1357 if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { in parse_options()
1358 ext3_msg(sb, KERN_ERR, "error: old and new quota " in parse_options()
1364 ext3_msg(sb, KERN_ERR, "error: journaled quota format " in parse_options()
1373 static int ext3_setup_super(struct super_block *sb, struct ext3_super_block *es, in ext3_setup_super() argument
1376 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_setup_super()
1380 ext3_msg(sb, KERN_ERR, in ext3_setup_super()
1388 ext3_msg(sb, KERN_WARNING, in ext3_setup_super()
1392 ext3_msg(sb, KERN_WARNING, in ext3_setup_super()
1398 ext3_msg(sb, KERN_WARNING, in ext3_setup_super()
1404 ext3_msg(sb, KERN_WARNING, in ext3_setup_super()
1418 ext3_update_dynamic_rev(sb); in ext3_setup_super()
1419 EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); in ext3_setup_super()
1421 ext3_commit_super(sb, es, 1); in ext3_setup_super()
1422 if (test_opt(sb, DEBUG)) in ext3_setup_super()
1423 ext3_msg(sb, KERN_INFO, "[bs=%lu, gc=%lu, " in ext3_setup_super()
1425 sb->s_blocksize, in ext3_setup_super()
1427 EXT3_BLOCKS_PER_GROUP(sb), in ext3_setup_super()
1428 EXT3_INODES_PER_GROUP(sb), in ext3_setup_super()
1431 if (EXT3_SB(sb)->s_journal->j_inode == NULL) { in ext3_setup_super()
1433 ext3_msg(sb, KERN_INFO, "using external journal on %s", in ext3_setup_super()
1434 bdevname(EXT3_SB(sb)->s_journal->j_dev, b)); in ext3_setup_super()
1436 ext3_msg(sb, KERN_INFO, "using internal journal"); in ext3_setup_super()
1438 cleancache_init_fs(sb); in ext3_setup_super()
1443 static int ext3_check_descriptors(struct super_block *sb) in ext3_check_descriptors() argument
1445 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_check_descriptors()
1451 struct ext3_group_desc *gdp = ext3_get_group_desc(sb, i, NULL); in ext3_check_descriptors()
1452 ext3_fsblk_t first_block = ext3_group_first_block_no(sb, i); in ext3_check_descriptors()
1459 (EXT3_BLOCKS_PER_GROUP(sb) - 1); in ext3_check_descriptors()
1464 ext3_error (sb, "ext3_check_descriptors", in ext3_check_descriptors()
1474 ext3_error (sb, "ext3_check_descriptors", in ext3_check_descriptors()
1485 ext3_error (sb, "ext3_check_descriptors", in ext3_check_descriptors()
1494 sbi->s_es->s_free_blocks_count=cpu_to_le32(ext3_count_free_blocks(sb)); in ext3_check_descriptors()
1495 sbi->s_es->s_free_inodes_count=cpu_to_le32(ext3_count_free_inodes(sb)); in ext3_check_descriptors()
1517 static void ext3_orphan_cleanup (struct super_block * sb, in ext3_orphan_cleanup() argument
1520 unsigned int s_flags = sb->s_flags; in ext3_orphan_cleanup()
1530 if (bdev_read_only(sb->s_bdev)) { in ext3_orphan_cleanup()
1531 ext3_msg(sb, KERN_ERR, "error: write access " in ext3_orphan_cleanup()
1537 if (EXT3_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP)) { in ext3_orphan_cleanup()
1538 ext3_msg(sb, KERN_INFO, "Skipping orphan cleanup due to " in ext3_orphan_cleanup()
1543 if (EXT3_SB(sb)->s_mount_state & EXT3_ERROR_FS) { in ext3_orphan_cleanup()
1555 ext3_msg(sb, KERN_INFO, "orphan cleanup on readonly fs"); in ext3_orphan_cleanup()
1556 sb->s_flags &= ~MS_RDONLY; in ext3_orphan_cleanup()
1560 sb->s_flags |= MS_ACTIVE; in ext3_orphan_cleanup()
1563 if (EXT3_SB(sb)->s_qf_names[i]) { in ext3_orphan_cleanup()
1564 int ret = ext3_quota_on_mount(sb, i); in ext3_orphan_cleanup()
1566 ext3_msg(sb, KERN_ERR, in ext3_orphan_cleanup()
1576 inode = ext3_orphan_get(sb, le32_to_cpu(es->s_last_orphan)); in ext3_orphan_cleanup()
1582 list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); in ext3_orphan_cleanup()
1606 ext3_msg(sb, KERN_INFO, "%d orphan inode%s deleted", in ext3_orphan_cleanup()
1609 ext3_msg(sb, KERN_INFO, "%d truncate%s cleaned up", in ext3_orphan_cleanup()
1614 if (sb_dqopt(sb)->files[i]) in ext3_orphan_cleanup()
1615 dquot_quota_off(sb, i); in ext3_orphan_cleanup()
1618 sb->s_flags = s_flags; /* Restore MS_RDONLY status */ in ext3_orphan_cleanup()
1668 static ext3_fsblk_t descriptor_loc(struct super_block *sb, in descriptor_loc() argument
1672 struct ext3_sb_info *sbi = EXT3_SB(sb); in descriptor_loc()
1678 if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_META_BG) || in descriptor_loc()
1682 if (ext3_bg_has_super(sb, bg)) in descriptor_loc()
1684 return (has_super + ext3_group_first_block_no(sb, bg)); in descriptor_loc()
1688 static int ext3_fill_super (struct super_block *sb, void *data, int silent) in ext3_fill_super() argument
1694 ext3_fsblk_t sb_block = get_sb_block(&data, sb); in ext3_fill_super()
1720 sb->s_fs_info = sbi; in ext3_fill_super()
1723 blocksize = sb_min_blocksize(sb, EXT3_MIN_BLOCK_SIZE); in ext3_fill_super()
1725 ext3_msg(sb, KERN_ERR, "error: unable to set blocksize"); in ext3_fill_super()
1740 if (!(bh = sb_bread(sb, logic_sb_block))) { in ext3_fill_super()
1741 ext3_msg(sb, KERN_ERR, "error: unable to read superblock"); in ext3_fill_super()
1750 sb->s_magic = le16_to_cpu(es->s_magic); in ext3_fill_super()
1751 if (sb->s_magic != EXT3_SUPER_MAGIC) in ext3_fill_super()
1791 if (!parse_options ((char *) data, sb, &journal_inum, &journal_devnum, in ext3_fill_super()
1795 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | in ext3_fill_super()
1796 (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); in ext3_fill_super()
1799 (EXT3_HAS_COMPAT_FEATURE(sb, ~0U) || in ext3_fill_super()
1800 EXT3_HAS_RO_COMPAT_FEATURE(sb, ~0U) || in ext3_fill_super()
1801 EXT3_HAS_INCOMPAT_FEATURE(sb, ~0U))) in ext3_fill_super()
1802 ext3_msg(sb, KERN_WARNING, in ext3_fill_super()
1810 features = EXT3_HAS_INCOMPAT_FEATURE(sb, ~EXT3_FEATURE_INCOMPAT_SUPP); in ext3_fill_super()
1812 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1817 features = EXT3_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP); in ext3_fill_super()
1818 if (!(sb->s_flags & MS_RDONLY) && features) { in ext3_fill_super()
1819 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1828 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1834 hblock = bdev_logical_block_size(sb->s_bdev); in ext3_fill_super()
1835 if (sb->s_blocksize != blocksize) { in ext3_fill_super()
1841 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1848 if (!sb_set_blocksize(sb, blocksize)) { in ext3_fill_super()
1849 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1855 bh = sb_bread(sb, logic_sb_block); in ext3_fill_super()
1857 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1864 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1870 sb->s_maxbytes = ext3_max_size(sb->s_blocksize_bits); in ext3_fill_super()
1881 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1890 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1899 if (EXT3_INODE_SIZE(sb) == 0 || EXT3_INODES_PER_GROUP(sb) == 0) in ext3_fill_super()
1901 sbi->s_inodes_per_block = blocksize / EXT3_INODE_SIZE(sb); in ext3_fill_super()
1909 sbi->s_addr_per_block_bits = ilog2(EXT3_ADDR_PER_BLOCK(sb)); in ext3_fill_super()
1910 sbi->s_desc_per_block_bits = ilog2(EXT3_DESC_PER_BLOCK(sb)); in ext3_fill_super()
1927 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1933 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1939 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1945 err = generic_check_addressable(sb->s_blocksize_bits, in ext3_fill_super()
1948 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1951 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1957 if (EXT3_BLOCKS_PER_GROUP(sb) == 0) in ext3_fill_super()
1961 / EXT3_BLOCKS_PER_GROUP(sb)) + 1; in ext3_fill_super()
1962 db_count = DIV_ROUND_UP(sbi->s_groups_count, EXT3_DESC_PER_BLOCK(sb)); in ext3_fill_super()
1966 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1975 block = descriptor_loc(sb, logic_sb_block, i); in ext3_fill_super()
1976 sbi->s_group_desc[i] = sb_bread(sb, block); in ext3_fill_super()
1978 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
1984 if (!ext3_check_descriptors (sb)) { in ext3_fill_super()
1985 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
2004 ext3_rsv_window_add(sb, &sbi->s_rsv_window_head); in ext3_fill_super()
2009 sb->s_op = &ext3_sops; in ext3_fill_super()
2010 sb->s_export_op = &ext3_export_ops; in ext3_fill_super()
2011 sb->s_xattr = ext3_xattr_handlers; in ext3_fill_super()
2013 sb->s_qcop = &ext3_qctl_operations; in ext3_fill_super()
2014 sb->dq_op = &ext3_quota_operations; in ext3_fill_super()
2015 sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; in ext3_fill_super()
2017 memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid)); in ext3_fill_super()
2022 sb->s_root = NULL; in ext3_fill_super()
2025 EXT3_HAS_INCOMPAT_FEATURE(sb, in ext3_fill_super()
2032 if (!test_opt(sb, NOLOAD) && in ext3_fill_super()
2033 EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL)) { in ext3_fill_super()
2034 if (ext3_load_journal(sb, es, journal_devnum)) in ext3_fill_super()
2037 if (ext3_create_journal(sb, es, journal_inum)) in ext3_fill_super()
2041 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
2047 ext3_count_free_blocks(sb), GFP_KERNEL); in ext3_fill_super()
2050 ext3_count_free_inodes(sb), GFP_KERNEL); in ext3_fill_super()
2054 ext3_count_dirs(sb), GFP_KERNEL); in ext3_fill_super()
2057 ext3_msg(sb, KERN_ERR, "error: insufficient memory"); in ext3_fill_super()
2064 switch (test_opt(sb, DATA_FLAGS)) { in ext3_fill_super()
2080 ext3_msg(sb, KERN_ERR, in ext3_fill_super()
2094 root = ext3_iget(sb, EXT3_ROOT_INO); in ext3_fill_super()
2096 ext3_msg(sb, KERN_ERR, "error: get root inode failed"); in ext3_fill_super()
2102 ext3_msg(sb, KERN_ERR, "error: corrupt root inode, run e2fsck"); in ext3_fill_super()
2105 sb->s_root = d_make_root(root); in ext3_fill_super()
2106 if (!sb->s_root) { in ext3_fill_super()
2107 ext3_msg(sb, KERN_ERR, "error: get root dentry failed"); in ext3_fill_super()
2112 if (ext3_setup_super(sb, es, sb->s_flags & MS_RDONLY)) in ext3_fill_super()
2113 sb->s_flags |= MS_RDONLY; in ext3_fill_super()
2115 EXT3_SB(sb)->s_mount_state |= EXT3_ORPHAN_FS; in ext3_fill_super()
2116 ext3_orphan_cleanup(sb, es); in ext3_fill_super()
2117 EXT3_SB(sb)->s_mount_state &= ~EXT3_ORPHAN_FS; in ext3_fill_super()
2119 ext3_mark_recovery_complete(sb, es); in ext3_fill_super()
2120 ext3_msg(sb, KERN_INFO, "recovery complete"); in ext3_fill_super()
2122 ext3_msg(sb, KERN_INFO, "mounted filesystem with %s data mode", in ext3_fill_super()
2123 test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA ? "journal": in ext3_fill_super()
2124 test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": in ext3_fill_super()
2131 ext3_msg(sb, KERN_INFO, in ext3_fill_super()
2133 sb->s_id); in ext3_fill_super()
2153 sb->s_fs_info = NULL; in ext3_fill_super()
2164 static void ext3_init_journal_params(struct super_block *sb, journal_t *journal) in ext3_init_journal_params() argument
2166 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_init_journal_params()
2175 if (test_opt(sb, BARRIER)) in ext3_init_journal_params()
2179 if (test_opt(sb, DATA_ERR_ABORT)) in ext3_init_journal_params()
2186 static journal_t *ext3_get_journal(struct super_block *sb, in ext3_get_journal() argument
2196 journal_inode = ext3_iget(sb, journal_inum); in ext3_get_journal()
2198 ext3_msg(sb, KERN_ERR, "error: no journal found"); in ext3_get_journal()
2204 ext3_msg(sb, KERN_ERR, "error: journal inode is deleted"); in ext3_get_journal()
2211 ext3_msg(sb, KERN_ERR, "error: invalid journal inode"); in ext3_get_journal()
2218 ext3_msg(sb, KERN_ERR, "error: could not load journal inode"); in ext3_get_journal()
2222 journal->j_private = sb; in ext3_get_journal()
2223 ext3_init_journal_params(sb, journal); in ext3_get_journal()
2227 static journal_t *ext3_get_dev_journal(struct super_block *sb, in ext3_get_dev_journal() argument
2240 bdev = ext3_blkdev_get(j_dev, sb); in ext3_get_dev_journal()
2244 blocksize = sb->s_blocksize; in ext3_get_dev_journal()
2247 ext3_msg(sb, KERN_ERR, in ext3_get_dev_journal()
2256 ext3_msg(sb, KERN_ERR, "error: couldn't read superblock of " in ext3_get_dev_journal()
2265 ext3_msg(sb, KERN_ERR, "error: external journal has " in ext3_get_dev_journal()
2271 if (memcmp(EXT3_SB(sb)->s_es->s_journal_uuid, es->s_uuid, 16)) { in ext3_get_dev_journal()
2272 ext3_msg(sb, KERN_ERR, "error: journal UUID does not match"); in ext3_get_dev_journal()
2281 journal = journal_init_dev(bdev, sb->s_bdev, in ext3_get_dev_journal()
2284 ext3_msg(sb, KERN_ERR, in ext3_get_dev_journal()
2288 journal->j_private = sb; in ext3_get_dev_journal()
2291 ext3_msg(sb, KERN_ERR, "I/O error on journal device"); in ext3_get_dev_journal()
2296 ext3_msg(sb, KERN_ERR, in ext3_get_dev_journal()
2302 EXT3_SB(sb)->journal_bdev = bdev; in ext3_get_dev_journal()
2303 ext3_init_journal_params(sb, journal); in ext3_get_dev_journal()
2312 static int ext3_load_journal(struct super_block *sb, in ext3_load_journal() argument
2324 ext3_msg(sb, KERN_INFO, "external journal device major/minor " in ext3_load_journal()
2330 really_read_only = bdev_read_only(sb->s_bdev); in ext3_load_journal()
2338 if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER)) { in ext3_load_journal()
2339 if (sb->s_flags & MS_RDONLY) { in ext3_load_journal()
2340 ext3_msg(sb, KERN_INFO, in ext3_load_journal()
2343 ext3_msg(sb, KERN_ERR, "error: write access " in ext3_load_journal()
2347 ext3_msg(sb, KERN_INFO, in ext3_load_journal()
2353 ext3_msg(sb, KERN_ERR, "error: filesystem has both journal " in ext3_load_journal()
2359 if (!(journal = ext3_get_journal(sb, journal_inum))) in ext3_load_journal()
2362 if (!(journal = ext3_get_dev_journal(sb, journal_dev))) in ext3_load_journal()
2369 if (!really_read_only && test_opt(sb, UPDATE_JOURNAL)) { in ext3_load_journal()
2372 ext3_msg(sb, KERN_ERR, "error updating journal"); in ext3_load_journal()
2378 if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER)) in ext3_load_journal()
2384 ext3_msg(sb, KERN_ERR, "error loading journal"); in ext3_load_journal()
2389 EXT3_SB(sb)->s_journal = journal; in ext3_load_journal()
2390 ext3_clear_journal_err(sb, es); in ext3_load_journal()
2397 ext3_commit_super(sb, es, 1); in ext3_load_journal()
2403 static int ext3_create_journal(struct super_block *sb, in ext3_create_journal() argument
2410 if (sb->s_flags & MS_RDONLY) { in ext3_create_journal()
2411 ext3_msg(sb, KERN_ERR, in ext3_create_journal()
2417 journal = ext3_get_journal(sb, journal_inum); in ext3_create_journal()
2421 ext3_msg(sb, KERN_INFO, "creating new journal on inode %u", in ext3_create_journal()
2426 ext3_msg(sb, KERN_ERR, "error creating journal"); in ext3_create_journal()
2431 EXT3_SB(sb)->s_journal = journal; in ext3_create_journal()
2433 ext3_update_dynamic_rev(sb); in ext3_create_journal()
2434 EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); in ext3_create_journal()
2435 EXT3_SET_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL); in ext3_create_journal()
2440 ext3_commit_super(sb, es, 1); in ext3_create_journal()
2445 static int ext3_commit_super(struct super_block *sb, in ext3_commit_super() argument
2449 struct buffer_head *sbh = EXT3_SB(sb)->s_sbh; in ext3_commit_super()
2464 ext3_msg(sb, KERN_ERR, "previous I/O error to " in ext3_commit_super()
2479 if (!(sb->s_flags & MS_RDONLY)) in ext3_commit_super()
2481 es->s_free_blocks_count = cpu_to_le32(ext3_count_free_blocks(sb)); in ext3_commit_super()
2482 es->s_free_inodes_count = cpu_to_le32(ext3_count_free_inodes(sb)); in ext3_commit_super()
2488 ext3_msg(sb, KERN_ERR, "I/O error while writing " in ext3_commit_super()
2503 static void ext3_mark_recovery_complete(struct super_block * sb, in ext3_mark_recovery_complete() argument
2506 journal_t *journal = EXT3_SB(sb)->s_journal; in ext3_mark_recovery_complete()
2512 if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER) && in ext3_mark_recovery_complete()
2513 sb->s_flags & MS_RDONLY) { in ext3_mark_recovery_complete()
2514 EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); in ext3_mark_recovery_complete()
2515 ext3_commit_super(sb, es, 1); in ext3_mark_recovery_complete()
2527 static void ext3_clear_journal_err(struct super_block *sb, in ext3_clear_journal_err() argument
2534 journal = EXT3_SB(sb)->s_journal; in ext3_clear_journal_err()
2545 errstr = ext3_decode_error(sb, j_errno, nbuf); in ext3_clear_journal_err()
2546 ext3_warning(sb, __func__, "Filesystem error recorded " in ext3_clear_journal_err()
2548 ext3_warning(sb, __func__, "Marking fs in need of " in ext3_clear_journal_err()
2551 EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS; in ext3_clear_journal_err()
2553 ext3_commit_super (sb, es, 1); in ext3_clear_journal_err()
2563 int ext3_force_commit(struct super_block *sb) in ext3_force_commit() argument
2568 if (sb->s_flags & MS_RDONLY) in ext3_force_commit()
2571 journal = EXT3_SB(sb)->s_journal; in ext3_force_commit()
2576 static int ext3_sync_fs(struct super_block *sb, int wait) in ext3_sync_fs() argument
2580 trace_ext3_sync_fs(sb, wait); in ext3_sync_fs()
2585 dquot_writeback_dquots(sb, -1); in ext3_sync_fs()
2586 if (journal_start_commit(EXT3_SB(sb)->s_journal, &target)) { in ext3_sync_fs()
2588 log_wait_commit(EXT3_SB(sb)->s_journal, target); in ext3_sync_fs()
2597 static int ext3_freeze(struct super_block *sb) in ext3_freeze() argument
2602 if (!(sb->s_flags & MS_RDONLY)) { in ext3_freeze()
2603 journal = EXT3_SB(sb)->s_journal; in ext3_freeze()
2617 EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); in ext3_freeze()
2618 error = ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); in ext3_freeze()
2633 static int ext3_unfreeze(struct super_block *sb) in ext3_unfreeze() argument
2635 if (!(sb->s_flags & MS_RDONLY)) { in ext3_unfreeze()
2637 EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); in ext3_unfreeze()
2638 ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); in ext3_unfreeze()
2639 journal_unlock_updates(EXT3_SB(sb)->s_journal); in ext3_unfreeze()
2644 static int ext3_remount (struct super_block * sb, int * flags, char * data) in ext3_remount() argument
2647 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_remount()
2657 sync_filesystem(sb); in ext3_remount()
2660 old_sb_flags = sb->s_flags; in ext3_remount()
2685 if (!parse_options(data, sb, NULL, NULL, &n_blocks_count, 1)) { in ext3_remount()
2690 if (test_opt(sb, ABORT)) in ext3_remount()
2691 ext3_abort(sb, __func__, "Abort forced by user"); in ext3_remount()
2693 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | in ext3_remount()
2694 (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); in ext3_remount()
2698 ext3_init_journal_params(sb, sbi->s_journal); in ext3_remount()
2700 if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY) || in ext3_remount()
2702 if (test_opt(sb, ABORT)) { in ext3_remount()
2708 err = dquot_suspend(sb, -1); in ext3_remount()
2716 sb->s_flags |= MS_RDONLY; in ext3_remount()
2727 ext3_mark_recovery_complete(sb, es); in ext3_remount()
2730 if ((ret = EXT3_HAS_RO_COMPAT_FEATURE(sb, in ext3_remount()
2732 ext3_msg(sb, KERN_WARNING, in ext3_remount()
2746 ext3_msg(sb, KERN_WARNING, "warning: couldn't " in ext3_remount()
2760 ext3_clear_journal_err(sb, es); in ext3_remount()
2762 if ((err = ext3_group_extend(sb, es, n_blocks_count))) in ext3_remount()
2764 if (!ext3_setup_super (sb, es, 0)) in ext3_remount()
2765 sb->s_flags &= ~MS_RDONLY; in ext3_remount()
2775 dquot_resume(sb, -1); in ext3_remount()
2778 sb->s_flags = old_sb_flags; in ext3_remount()
2795 struct super_block *sb = dentry->d_sb; in ext3_statfs() local
2796 struct ext3_sb_info *sbi = EXT3_SB(sb); in ext3_statfs()
2800 if (test_opt(sb, MINIX_DF)) { in ext3_statfs()
2825 overhead += ext3_bg_has_super(sb, i) + in ext3_statfs()
2826 ext3_bg_num_gdb(sb, i); in ext3_statfs()
2846 buf->f_bsize = sb->s_blocksize; in ext3_statfs()
2944 static int ext3_write_info(struct super_block *sb, int type) in ext3_write_info() argument
2950 handle = ext3_journal_start(d_inode(sb->s_root), 2); in ext3_write_info()
2953 ret = dquot_commit_info(sb, type); in ext3_write_info()
2964 static int ext3_quota_on_mount(struct super_block *sb, int type) in ext3_quota_on_mount() argument
2966 return dquot_quota_on_mount(sb, EXT3_SB(sb)->s_qf_names[type], in ext3_quota_on_mount()
2967 EXT3_SB(sb)->s_jquota_fmt, type); in ext3_quota_on_mount()
2973 static int ext3_quota_on(struct super_block *sb, int type, int format_id, in ext3_quota_on() argument
2978 if (!test_opt(sb, QUOTA)) in ext3_quota_on()
2982 if (path->dentry->d_sb != sb) in ext3_quota_on()
2985 if (EXT3_SB(sb)->s_qf_names[type]) { in ext3_quota_on()
2987 if (path->dentry->d_parent != sb->s_root) in ext3_quota_on()
2988 ext3_msg(sb, KERN_WARNING, in ext3_quota_on()
3002 journal_lock_updates(EXT3_SB(sb)->s_journal); in ext3_quota_on()
3003 err = journal_flush(EXT3_SB(sb)->s_journal); in ext3_quota_on()
3004 journal_unlock_updates(EXT3_SB(sb)->s_journal); in ext3_quota_on()
3009 return dquot_quota_on(sb, type, format_id, path); in ext3_quota_on()
3016 static ssize_t ext3_quota_read(struct super_block *sb, int type, char *data, in ext3_quota_read() argument
3019 struct inode *inode = sb_dqopt(sb)->files[type]; in ext3_quota_read()
3020 sector_t blk = off >> EXT3_BLOCK_SIZE_BITS(sb); in ext3_quota_read()
3022 int offset = off & (sb->s_blocksize - 1); in ext3_quota_read()
3034 tocopy = sb->s_blocksize - offset < toread ? in ext3_quota_read()
3035 sb->s_blocksize - offset : toread; in ext3_quota_read()
3054 static ssize_t ext3_quota_write(struct super_block *sb, int type, in ext3_quota_write() argument
3057 struct inode *inode = sb_dqopt(sb)->files[type]; in ext3_quota_write()
3058 sector_t blk = off >> EXT3_BLOCK_SIZE_BITS(sb); in ext3_quota_write()
3060 int offset = off & (sb->s_blocksize - 1); in ext3_quota_write()
3061 int journal_quota = EXT3_SB(sb)->s_qf_names[type] != NULL; in ext3_quota_write()
3066 ext3_msg(sb, KERN_WARNING, in ext3_quota_write()
3077 if (sb->s_blocksize - offset < len) { in ext3_quota_write()
3078 ext3_msg(sb, KERN_WARNING, "Quota write (off=%llu, len=%llu)" in ext3_quota_write()