Patchwork [1/2] ext4: Don't allow quota mount options when quota feature enabled

login
register
mail settings
Submitter Jan Kara
Date Feb. 25, 2013, 11:36 p.m.
Message ID <1361835369-19850-1-git-send-email-jack@suse.cz>
Download mbox | patch
Permalink /patch/223068/
State Accepted
Headers show

Comments

Jan Kara - Feb. 25, 2013, 11:36 p.m.
So far we silently ignored when quota mount options were set while quota
feature was enabled. But this can create confusion in userspace when
mount options are set but silently ignored and also creates opportunities
for bugs when we don't properly test all quota types. Actually
ext4_mark_dquot_dirty() forgets to test for quota feature so it was
dependent on journaled quota options being set. OTOH ext4_orphan_cleanup()
tries to enable journaled quota when quota options are specified which is
wrong when quota feature is enabled.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/ext4/super.c |   33 ++++++++++++++++++++++++++-------
 1 files changed, 26 insertions(+), 7 deletions(-)

I've spotted two issues with quota feature in kernel when reviewing Jeff's
patch. So here are the fixes.
Theodore Ts'o - Feb. 26, 2013, 12:39 a.m.
On Tue, Feb 26, 2013 at 12:36:08AM +0100, Jan Kara wrote:
> So far we silently ignored when quota mount options were set while quota
> feature was enabled. But this can create confusion in userspace when
> mount options are set but silently ignored and also creates opportunities
> for bugs when we don't properly test all quota types. Actually
> ext4_mark_dquot_dirty() forgets to test for quota feature so it was
> dependent on journaled quota options being set. OTOH ext4_orphan_cleanup()
> tries to enable journaled quota when quota options are specified which is
> wrong when quota feature is enabled.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>

I've been using the quota mount options since it's the only way to
test the quota patches when using an older version of the quota
userspace package.

I can build a newer version of the userspace quota package for my own
use (since version 4.01 isn't in Debian Testing yet nor Ubuntu yet),
but we probably need to make sure we document that users may need to
build their own version of the quota package.

      	    		       	     - Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jan Kara - Feb. 26, 2013, 1:18 p.m.
On Mon 25-02-13 19:39:43, Ted Tso wrote:
> On Tue, Feb 26, 2013 at 12:36:08AM +0100, Jan Kara wrote:
> > So far we silently ignored when quota mount options were set while quota
> > feature was enabled. But this can create confusion in userspace when
> > mount options are set but silently ignored and also creates opportunities
> > for bugs when we don't properly test all quota types. Actually
> > ext4_mark_dquot_dirty() forgets to test for quota feature so it was
> > dependent on journaled quota options being set. OTOH ext4_orphan_cleanup()
> > tries to enable journaled quota when quota options are specified which is
> > wrong when quota feature is enabled.
> > 
> > Signed-off-by: Jan Kara <jack@suse.cz>
> 
> I've been using the quota mount options since it's the only way to
> test the quota patches when using an older version of the quota
> userspace package.
  Yeah, I know it's useful at moments to be able to use quota mount options
even with quota feature. But older quota tools behave strangely with quota
feature anyway at times so for production use I'd suggest at least version
4.01 anyway. That's why I decided forcing quota mount options off with
quota feature because that's going to cause the least confusion long term
IMHO.

> I can build a newer version of the userspace quota package for my own
> use (since version 4.01 isn't in Debian Testing yet nor Ubuntu yet),
> but we probably need to make sure we document that users may need to
> build their own version of the quota package.
  True, I guess adding that to mke2fs manpage would be appropriate?

								Honza
Theodore Ts'o - March 2, 2013, 11:04 p.m.
On Tue, Feb 26, 2013 at 12:36:08AM +0100, Jan Kara wrote:
> So far we silently ignored when quota mount options were set while quota
> feature was enabled. But this can create confusion in userspace when
> mount options are set but silently ignored and also creates opportunities
> for bugs when we don't properly test all quota types. Actually
> ext4_mark_dquot_dirty() forgets to test for quota feature so it was
> dependent on journaled quota options being set. OTOH ext4_orphan_cleanup()
> tries to enable journaled quota when quota options are specified which is
> wrong when quota feature is enabled.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>

Thanks, applied.

					- Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 161f043..1746a6e 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1345,6 +1345,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,
@@ -1615,6 +1620,13 @@  static int handle_mount_opt(struct super_block *sb, char *opt, int token,
 					 "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 {
@@ -1667,6 +1679,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);
@@ -3783,13 +3801,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));
 
@@ -4887,9 +4903,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 {