Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Pull ext4 bug fixes from Ted Ts'o: "Various bug fixes for ext4. The most important is a fix for the new extent cache's slab shrinker which can cause significant, user-visible pauses when the system is under memory pressure." * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: enable quotas before orphan cleanup ext4: don't allow quota mount options when quota feature enabled ext4: fix a warning from sparse check for ext4_dir_llseek ext4: convert number of blocks to clusters properly ext4: fix possible memory leak in ext4_remount() jbd2: fix ERR_PTR dereference in jbd2__journal_start ext4: use percpu counter for extent cache count ext4: optimize ext4_es_shrink()
This commit is contained in:
@@ -783,6 +783,7 @@ static void ext4_put_super(struct super_block *sb)
|
||||
percpu_counter_destroy(&sbi->s_freeinodes_counter);
|
||||
percpu_counter_destroy(&sbi->s_dirs_counter);
|
||||
percpu_counter_destroy(&sbi->s_dirtyclusters_counter);
|
||||
percpu_counter_destroy(&sbi->s_extent_cache_cnt);
|
||||
brelse(sbi->s_sbh);
|
||||
#ifdef CONFIG_QUOTA
|
||||
for (i = 0; i < MAXQUOTAS; i++)
|
||||
@@ -1247,6 +1248,11 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args)
|
||||
"quota options when quota turned on");
|
||||
return -1;
|
||||
}
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) {
|
||||
ext4_msg(sb, KERN_ERR, "Cannot set journaled quota options "
|
||||
"when QUOTA feature is enabled");
|
||||
return -1;
|
||||
}
|
||||
qname = match_strdup(args);
|
||||
if (!qname) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
@@ -1544,6 +1550,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
|
||||
"quota options when quota turned on");
|
||||
return -1;
|
||||
}
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
|
||||
EXT4_FEATURE_RO_COMPAT_QUOTA)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Cannot set journaled quota options "
|
||||
"when QUOTA feature is enabled");
|
||||
return -1;
|
||||
}
|
||||
sbi->s_jquota_fmt = m->mount_opt;
|
||||
#endif
|
||||
} else {
|
||||
@@ -1592,6 +1605,12 @@ static int parse_options(char *options, struct super_block *sb,
|
||||
return 0;
|
||||
}
|
||||
#ifdef CONFIG_QUOTA
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) &&
|
||||
(test_opt(sb, USRQUOTA) || test_opt(sb, GRPQUOTA))) {
|
||||
ext4_msg(sb, KERN_ERR, "Cannot set quota options when QUOTA "
|
||||
"feature is enabled");
|
||||
return 0;
|
||||
}
|
||||
if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) {
|
||||
if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA])
|
||||
clear_opt(sb, USRQUOTA);
|
||||
@@ -3161,7 +3180,7 @@ int ext4_calculate_overhead(struct super_block *sb)
|
||||
}
|
||||
/* Add the journal blocks as well */
|
||||
if (sbi->s_journal)
|
||||
overhead += EXT4_B2C(sbi, sbi->s_journal->j_maxlen);
|
||||
overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_maxlen);
|
||||
|
||||
sbi->s_overhead = overhead;
|
||||
smp_wmb();
|
||||
@@ -3688,6 +3707,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
||||
if (!err) {
|
||||
err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0);
|
||||
}
|
||||
if (!err) {
|
||||
err = percpu_counter_init(&sbi->s_extent_cache_cnt, 0);
|
||||
}
|
||||
if (err) {
|
||||
ext4_msg(sb, KERN_ERR, "insufficient memory");
|
||||
goto failed_mount3;
|
||||
@@ -3711,13 +3733,11 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
||||
sb->s_export_op = &ext4_export_ops;
|
||||
sb->s_xattr = ext4_xattr_handlers;
|
||||
#ifdef CONFIG_QUOTA
|
||||
sb->s_qcop = &ext4_qctl_operations;
|
||||
sb->dq_op = &ext4_quota_operations;
|
||||
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) {
|
||||
/* Use qctl operations for hidden quota files. */
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA))
|
||||
sb->s_qcop = &ext4_qctl_sysfile_operations;
|
||||
}
|
||||
else
|
||||
sb->s_qcop = &ext4_qctl_operations;
|
||||
#endif
|
||||
memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
|
||||
|
||||
@@ -3913,6 +3933,16 @@ no_journal:
|
||||
if (err)
|
||||
goto failed_mount7;
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
/* Enable quota usage during mount. */
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) &&
|
||||
!(sb->s_flags & MS_RDONLY)) {
|
||||
err = ext4_enable_quotas(sb);
|
||||
if (err)
|
||||
goto failed_mount8;
|
||||
}
|
||||
#endif /* CONFIG_QUOTA */
|
||||
|
||||
EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
|
||||
ext4_orphan_cleanup(sb, es);
|
||||
EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
|
||||
@@ -3930,16 +3960,6 @@ no_journal:
|
||||
} else
|
||||
descr = "out journal";
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
/* Enable quota usage during mount. */
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) &&
|
||||
!(sb->s_flags & MS_RDONLY)) {
|
||||
err = ext4_enable_quotas(sb);
|
||||
if (err)
|
||||
goto failed_mount8;
|
||||
}
|
||||
#endif /* CONFIG_QUOTA */
|
||||
|
||||
if (test_opt(sb, DISCARD)) {
|
||||
struct request_queue *q = bdev_get_queue(sb->s_bdev);
|
||||
if (!blk_queue_discard(q))
|
||||
@@ -3993,6 +4013,7 @@ failed_mount3:
|
||||
percpu_counter_destroy(&sbi->s_freeinodes_counter);
|
||||
percpu_counter_destroy(&sbi->s_dirs_counter);
|
||||
percpu_counter_destroy(&sbi->s_dirtyclusters_counter);
|
||||
percpu_counter_destroy(&sbi->s_extent_cache_cnt);
|
||||
if (sbi->s_mmp_tsk)
|
||||
kthread_stop(sbi->s_mmp_tsk);
|
||||
failed_mount2:
|
||||
@@ -4538,6 +4559,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
|
||||
if (!old_opts.s_qf_names[i]) {
|
||||
for (j = 0; j < i; j++)
|
||||
kfree(old_opts.s_qf_names[j]);
|
||||
kfree(orig_data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else
|
||||
@@ -4816,9 +4838,12 @@ static int ext4_release_dquot(struct dquot *dquot)
|
||||
|
||||
static int ext4_mark_dquot_dirty(struct dquot *dquot)
|
||||
{
|
||||
struct super_block *sb = dquot->dq_sb;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
|
||||
/* Are we journaling quotas? */
|
||||
if (EXT4_SB(dquot->dq_sb)->s_qf_names[USRQUOTA] ||
|
||||
EXT4_SB(dquot->dq_sb)->s_qf_names[GRPQUOTA]) {
|
||||
if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) ||
|
||||
sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) {
|
||||
dquot_mark_dquot_dirty(dquot);
|
||||
return ext4_write_dquot(dquot);
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user