diff mbox series

[v2,05/17] ext4: Allow sb to be NULL in ext4_msg()

Message ID 20200428164536.462-6-lczerner@redhat.com
State Superseded
Headers show
Series ext4: new mount API conversion | expand

Commit Message

Lukas Czerner April 28, 2020, 4:45 p.m. UTC
At the parsing phase of mount in the new mount api sb will not be
available so allow sb to be NULL in ext4_msg and use that in
handle_mount_opt().

Also change return value to appropriate -EINVAL where needed.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
---
 fs/ext4/super.c | 120 +++++++++++++++++++++++++-----------------------
 1 file changed, 63 insertions(+), 57 deletions(-)

Comments

Christoph Hellwig April 28, 2020, 4:48 p.m. UTC | #1
On Tue, Apr 28, 2020 at 06:45:24PM +0200, Lukas Czerner wrote:
> At the parsing phase of mount in the new mount api sb will not be
> available so allow sb to be NULL in ext4_msg and use that in
> handle_mount_opt().
> 
> Also change return value to appropriate -EINVAL where needed.

Shouldn't mount-time messages be reported using the logfc and family
helpers from include/linux/fs_context.h? (which btw, have really
horrible over-generic names).
Lukas Czerner April 28, 2020, 4:57 p.m. UTC | #2
On Tue, Apr 28, 2020 at 09:48:08AM -0700, Christoph Hellwig wrote:
> On Tue, Apr 28, 2020 at 06:45:24PM +0200, Lukas Czerner wrote:
> > At the parsing phase of mount in the new mount api sb will not be
> > available so allow sb to be NULL in ext4_msg and use that in
> > handle_mount_opt().
> > 
> > Also change return value to appropriate -EINVAL where needed.
> 
> Shouldn't mount-time messages be reported using the logfc and family
> helpers from include/linux/fs_context.h? (which btw, have really
> horrible over-generic names).

I am sure it should at some point, but I am not really sure how ready
it is at the moment. Last time I checked David told me not to bother
using it yet.

Is it ready yet David ? Should we be switching to it ?

-Lukas
Eric Sandeen April 29, 2020, 2:38 a.m. UTC | #3
On 4/28/20 11:45 AM, Lukas Czerner wrote:
> At the parsing phase of mount in the new mount api sb will not be
> available so allow sb to be NULL in ext4_msg and use that in
> handle_mount_opt().
> 
> Also change return value to appropriate -EINVAL where needed.
> 
> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> ---
>  fs/ext4/super.c | 120 +++++++++++++++++++++++++-----------------------
>  1 file changed, 63 insertions(+), 57 deletions(-)
> 
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 2c6fea451d7d..2f7e49bfbf71 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -88,7 +88,7 @@ static void ext4_unregister_li_request(struct super_block *sb);
>  static void ext4_clear_request_list(void);
>  static struct inode *ext4_get_journal_inode(struct super_block *sb,
>  					    unsigned int journal_inum);
> -static int ext4_validate_options(struct super_block *sb);
> +static int ext4_validate_options(struct fs_context *fc);
>  
>  /*
>   * Lock ordering
> @@ -754,13 +754,14 @@ void __ext4_msg(struct super_block *sb,
>  	struct va_format vaf;
>  	va_list args;
>  
> -	if (!___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
> +	if (sb &&
> +	    !___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
>  		return;
>  
>  	va_start(args, fmt);
>  	vaf.fmt = fmt;
>  	vaf.va = &args;
> -	printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
> +	printk("%sEXT4-fs (%s): %pV\n", prefix, sb ? sb->s_id : "n/a", &vaf);

Tiny nitpick, I might drop "n/a" - I'm not sure that makes anything clearer:

"EXT4-fs (n/a): message" seems confusing, but maybe that's just me.

FWIW xfs just removes the s_id print altogether if it's not available, i.e.:

static void
__xfs_printk(
        const char              *level,
        const struct xfs_mount  *mp,
        struct va_format        *vaf)
{
        if (mp && mp->m_super) {
                printk("%sXFS (%s): %pV\n", level, mp->m_super->s_id, vaf);
                return;
        }
        printk("%sXFS: %pV\n", level, vaf);
}

*shrug* up to personal preference I suppose.

Thanks,
-Eric
Ian Kent April 29, 2020, 2:53 a.m. UTC | #4
On Tue, 2020-04-28 at 18:57 +0200, Lukas Czerner wrote:
> On Tue, Apr 28, 2020 at 09:48:08AM -0700, Christoph Hellwig wrote:
> > On Tue, Apr 28, 2020 at 06:45:24PM +0200, Lukas Czerner wrote:
> > > At the parsing phase of mount in the new mount api sb will not be
> > > available so allow sb to be NULL in ext4_msg and use that in
> > > handle_mount_opt().
> > > 
> > > Also change return value to appropriate -EINVAL where needed.
> > 
> > Shouldn't mount-time messages be reported using the logfc and
> > family
> > helpers from include/linux/fs_context.h? (which btw, have really
> > horrible over-generic names).
> 
> I am sure it should at some point, but I am not really sure how ready
> it is at the moment. Last time I checked David told me not to bother
> using it yet.
> 
> Is it ready yet David ? Should we be switching to it ?

The mount-API log macros tend to cause user confusion because they
often lead to unexpected log messages.

We're seeing that now with bugs logged due to unexpected messages
resulting from the NFS mount-API conversion.

I'd recommend mostly avoiding using the macros until there's been
time to reconsider how they should work, after all fsopen() and
friends will still get errno errors just not the passed string
description.

Ian
Lukas Czerner April 29, 2020, 11:02 a.m. UTC | #5
On Tue, Apr 28, 2020 at 09:38:11PM -0500, Eric Sandeen wrote:
> On 4/28/20 11:45 AM, Lukas Czerner wrote:
> > At the parsing phase of mount in the new mount api sb will not be
> > available so allow sb to be NULL in ext4_msg and use that in
> > handle_mount_opt().
> > 
> > Also change return value to appropriate -EINVAL where needed.
> > 
> > Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> > ---
> >  fs/ext4/super.c | 120 +++++++++++++++++++++++++-----------------------
> >  1 file changed, 63 insertions(+), 57 deletions(-)
> > 
> > diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> > index 2c6fea451d7d..2f7e49bfbf71 100644
> > --- a/fs/ext4/super.c
> > +++ b/fs/ext4/super.c
> > @@ -88,7 +88,7 @@ static void ext4_unregister_li_request(struct super_block *sb);
> >  static void ext4_clear_request_list(void);
> >  static struct inode *ext4_get_journal_inode(struct super_block *sb,
> >  					    unsigned int journal_inum);
> > -static int ext4_validate_options(struct super_block *sb);
> > +static int ext4_validate_options(struct fs_context *fc);
> >  
> >  /*
> >   * Lock ordering
> > @@ -754,13 +754,14 @@ void __ext4_msg(struct super_block *sb,
> >  	struct va_format vaf;
> >  	va_list args;
> >  
> > -	if (!___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
> > +	if (sb &&
> > +	    !___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
> >  		return;
> >  
> >  	va_start(args, fmt);
> >  	vaf.fmt = fmt;
> >  	vaf.va = &args;
> > -	printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
> > +	printk("%sEXT4-fs (%s): %pV\n", prefix, sb ? sb->s_id : "n/a", &vaf);
> 
> Tiny nitpick, I might drop "n/a" - I'm not sure that makes anything clearer:
> 
> "EXT4-fs (n/a): message" seems confusing, but maybe that's just me.
> 
> FWIW xfs just removes the s_id print altogether if it's not available, i.e.:
> 
> static void
> __xfs_printk(
>         const char              *level,
>         const struct xfs_mount  *mp,
>         struct va_format        *vaf)
> {
>         if (mp && mp->m_super) {
>                 printk("%sXFS (%s): %pV\n", level, mp->m_super->s_id, vaf);
>                 return;
>         }
>         printk("%sXFS: %pV\n", level, vaf);
> }
> 
> *shrug* up to personal preference I suppose.

I wanted the message to stay more-or-less uniform, but I think you're
right. I'll drop the (n/a).

-Lukas

> 
> Thanks,
> -Eric
>
Christoph Hellwig April 29, 2020, 11:09 a.m. UTC | #6
On Wed, Apr 29, 2020 at 10:53:00AM +0800, Ian Kent wrote:
> The mount-API log macros tend to cause user confusion because they
> often lead to unexpected log messages.
> 
> We're seeing that now with bugs logged due to unexpected messages
> resulting from the NFS mount-API conversion.
> 
> I'd recommend mostly avoiding using the macros until there's been
> time to reconsider how they should work, after all fsopen() and
> friends will still get errno errors just not the passed string
> description.

And when is that time going to be?  Should we convert existing users
back and remove that functionality if it doesn't work properly?
diff mbox series

Patch

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 2c6fea451d7d..2f7e49bfbf71 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -88,7 +88,7 @@  static void ext4_unregister_li_request(struct super_block *sb);
 static void ext4_clear_request_list(void);
 static struct inode *ext4_get_journal_inode(struct super_block *sb,
 					    unsigned int journal_inum);
-static int ext4_validate_options(struct super_block *sb);
+static int ext4_validate_options(struct fs_context *fc);
 
 /*
  * Lock ordering
@@ -754,13 +754,14 @@  void __ext4_msg(struct super_block *sb,
 	struct va_format vaf;
 	va_list args;
 
-	if (!___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
+	if (sb &&
+	    !___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs"))
 		return;
 
 	va_start(args, fmt);
 	vaf.fmt = fmt;
 	vaf.va = &args;
-	printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
+	printk("%sEXT4-fs (%s): %pV\n", prefix, sb ? sb->s_id : "n/a", &vaf);
 	va_end(args);
 }
 
@@ -2021,12 +2022,12 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 	switch (token) {
 	case Opt_noacl:
 	case Opt_nouser_xattr:
-		ext4_msg(sb, KERN_WARNING, deprecated_msg, param->key, "3.5");
+		ext4_msg(NULL, KERN_WARNING, deprecated_msg, param->key, "3.5");
 		break;
 	case Opt_sb:
 		return 1;	/* handled by get_sb_block() */
 	case Opt_removed:
-		ext4_msg(sb, KERN_WARNING, "Ignoring removed %s option",
+		ext4_msg(NULL, KERN_WARNING, "Ignoring removed %s option",
 			 param->key);
 		return 1;
 	case Opt_abort:
@@ -2053,22 +2054,22 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 			break;
 
 	if (m->token == Opt_err) {
-		ext4_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" "
+		ext4_msg(NULL, KERN_ERR, "Unrecognized mount option \"%s\" "
 			 "or missing value", param->key);
-		return -1;
+		return -EINVAL;
 	}
 
 	if ((m->flags & MOPT_NO_EXT2) && IS_EXT2_SB(sb)) {
-		ext4_msg(sb, KERN_ERR,
+		ext4_msg(NULL, KERN_ERR,
 			 "Mount option \"%s\" incompatible with ext2",
 			 param->string);
-		return -1;
+		return -EINVAL;
 	}
 	if ((m->flags & MOPT_NO_EXT3) && IS_EXT3_SB(sb)) {
-		ext4_msg(sb, KERN_ERR,
+		ext4_msg(NULL, KERN_ERR,
 			 "Mount option \"%s\" incompatible with ext3",
 			 param->string);
-		return -1;
+		return -EINVAL;
 	}
 
 	if (m->flags & MOPT_EXPLICIT) {
@@ -2077,28 +2078,28 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 		} else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) {
 			set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM);
 		} else
-			return -1;
+			return -EINVAL;
 	}
 	if (m->flags & MOPT_CLEAR_ERR)
 		clear_opt(sb, ERRORS_MASK);
 	if (token == Opt_noquota && sb_any_quota_loaded(sb)) {
-		ext4_msg(sb, KERN_ERR, "Cannot change quota "
+		ext4_msg(NULL, KERN_ERR, "Cannot change quota "
 			 "options when quota turned on");
-		return -1;
+		return -EINVAL;
 	}
 
 	if (m->flags & MOPT_NOSUPPORT) {
-		ext4_msg(sb, KERN_ERR, "%s option not supported",
+		ext4_msg(NULL, KERN_ERR, "%s option not supported",
 			 param->key);
 	} else if (token == Opt_commit) {
 		if (result.uint_32 == 0)
 			sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE;
 		else if (result.uint_32 > INT_MAX / HZ) {
-			ext4_msg(sb, KERN_ERR,
+			ext4_msg(NULL, KERN_ERR,
 				 "Invalid commit interval %d, "
 				 "must be smaller than %d",
 				 result.uint_32, INT_MAX / HZ);
-			return -1;
+			return -EINVAL;
 		}
 		sbi->s_commit_interval = HZ * result.uint_32;
 	} else if (token == Opt_debug_want_extra_isize) {
@@ -2106,9 +2107,9 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 		    (result.uint_32 < 4) ||
 		    (result.uint_32 >
 		     (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) {
-			ext4_msg(sb, KERN_ERR,
+			ext4_msg(NULL, KERN_ERR,
 				 "Invalid want_extra_isize %d", result.uint_32);
-			return -1;
+			return -EINVAL;
 		}
 		sbi->s_want_extra_isize = result.uint_32;
 	} else if (token == Opt_max_batch_time) {
@@ -2119,10 +2120,10 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 		if (result.uint_32 &&
 		    (result.uint_32 > (1 << 30) ||
 		     !is_power_of_2(result.uint_32))) {
-			ext4_msg(sb, KERN_ERR,
+			ext4_msg(NULL, KERN_ERR,
 				 "EXT4-fs: inode_readahead_blks must be "
 				 "0 or a power of 2 smaller than 2^31");
-			return -1;
+			return -EINVAL;
 		}
 		sbi->s_inode_readahead_blks = result.uint_32;
 	} else if (token == Opt_init_itable) {
@@ -2137,24 +2138,24 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 	} else if (token == Opt_resuid) {
 		uid = make_kuid(current_user_ns(), result.uint_32);
 		if (!uid_valid(uid)) {
-			ext4_msg(sb, KERN_ERR, "Invalid uid value %d",
+			ext4_msg(NULL, KERN_ERR, "Invalid uid value %d",
 				 result.uint_32);
-			return -1;
+			return -EINVAL;
 		}
 		sbi->s_resuid = uid;
 	} else if (token == Opt_resgid) {
 		gid = make_kgid(current_user_ns(), result.uint_32);
 		if (!gid_valid(gid)) {
-			ext4_msg(sb, KERN_ERR, "Invalid gid value %d",
+			ext4_msg(NULL, KERN_ERR, "Invalid gid value %d",
 				 result.uint_32);
-			return -1;
+			return -EINVAL;
 		}
 		sbi->s_resgid = gid;
 	} else if (token == Opt_journal_dev) {
 		if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) {
-			ext4_msg(sb, KERN_ERR,
+			ext4_msg(NULL, KERN_ERR,
 				 "Cannot specify journal on remount");
-			return -1;
+			return -EINVAL;
 		}
 		ctx->journal_devnum = result.uint_32;
 	} else if (token == Opt_journal_path) {
@@ -2163,16 +2164,16 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 		int error;
 
 		if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) {
-			ext4_msg(sb, KERN_ERR,
+			ext4_msg(NULL, KERN_ERR,
 				 "Cannot specify journal on remount");
-			return -1;
+			return -EINVAL;
 		}
 
 		error = fs_lookup_param(fc, param, 1, &path);
 		if (error) {
-			ext4_msg(sb, KERN_ERR, "error: could not find "
+			ext4_msg(NULL, KERN_ERR, "error: could not find "
 				 "journal device path");
-			return -1;
+			return -EINVAL;
 		}
 
 		journal_inode = d_inode(path.dentry);
@@ -2180,29 +2181,29 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 		path_put(&path);
 	} else if (token == Opt_journal_ioprio) {
 		if (result.uint_32 > 7) {
-			ext4_msg(sb, KERN_ERR, "Invalid journal IO priority"
+			ext4_msg(NULL, KERN_ERR, "Invalid journal IO priority"
 				 " (must be 0-7)");
-			return -1;
+			return -EINVAL;
 		}
 		ctx->journal_ioprio =
 			IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, result.uint_32);
 	} else if (token == Opt_test_dummy_encryption) {
 #ifdef CONFIG_FS_ENCRYPTION
 		sbi->s_mount_flags |= EXT4_MF_TEST_DUMMY_ENCRYPTION;
-		ext4_msg(sb, KERN_WARNING,
+		ext4_msg(NULL, KERN_WARNING,
 			 "Test dummy encryption mode enabled");
 #else
-		ext4_msg(sb, KERN_WARNING,
+		ext4_msg(NULL, KERN_WARNING,
 			 "Test dummy encryption mount option ignored");
 #endif
 	} else if (m->flags & MOPT_DATAJ) {
 		if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) {
 			if (!sbi->s_journal)
-				ext4_msg(sb, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data option");
+				ext4_msg(NULL, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data option");
 			else if (test_opt(sb, DATA_FLAGS) != m->mount_opt) {
-				ext4_msg(sb, KERN_ERR,
+				ext4_msg(NULL, KERN_ERR,
 					 "Cannot change data mode on remount");
-				return -1;
+				return -EINVAL;
 			}
 		} else {
 			clear_opt(sb, DATA_FLAGS);
@@ -2212,12 +2213,12 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 	} else if (m->flags & MOPT_QFMT) {
 		if (sb_any_quota_loaded(sb) &&
 		    sbi->s_jquota_fmt != m->mount_opt) {
-			ext4_msg(sb, KERN_ERR, "Cannot change journaled "
+			ext4_msg(NULL, KERN_ERR, "Cannot change journaled "
 				 "quota options when quota turned on");
-			return -1;
+			return -EINVAL;
 		}
 		if (ext4_has_feature_quota(sb)) {
-			ext4_msg(sb, KERN_INFO,
+			ext4_msg(NULL, KERN_INFO,
 				 "Quota format mount options ignored "
 				 "when QUOTA feature is enabled");
 			return 1;
@@ -2226,12 +2227,12 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 #endif
 	} else if (token == Opt_dax) {
 #ifdef CONFIG_FS_DAX
-		ext4_msg(sb, KERN_WARNING,
+		ext4_msg(NULL, KERN_WARNING,
 		"DAX enabled. Warning: EXPERIMENTAL, use at your own risk");
 		sbi->s_mount_opt |= m->mount_opt;
 #else
-		ext4_msg(sb, KERN_INFO, "dax option not supported");
-		return -1;
+		ext4_msg(NULL, KERN_INFO, "dax option not supported");
+		return -EINVAL;
 #endif
 	} else if (token == Opt_data_err_abort) {
 		sbi->s_mount_opt |= m->mount_opt;
@@ -2247,11 +2248,11 @@  static int handle_mount_opt(struct fs_context *fc, struct fs_parameter *param)
 		if (m->flags & MOPT_CLEAR)
 			set = !set;
 		else if (unlikely(!(m->flags & MOPT_SET))) {
-			ext4_msg(sb, KERN_WARNING,
+			ext4_msg(NULL, KERN_WARNING,
 				 "buggy handling of option %s",
 				 param->key);
 			WARN_ON(1);
-			return -1;
+			return -EINVAL;
 		}
 		if (set != 0)
 			sbi->s_mount_opt |= m->mount_opt;
@@ -2320,12 +2321,17 @@  static int parse_options(char *options, struct super_block *sb,
 	if (journal_ioprio)
 		*journal_ioprio = ctx.journal_ioprio;
 
-	return ext4_validate_options(sb);
+	ret = ext4_validate_options(&fc);
+	if (ret < 0)
+		return 0;
+
+	return 1;
 }
 
-static int ext4_validate_options(struct super_block *sb)
+static int ext4_validate_options(struct fs_context *fc)
 {
-	struct ext4_sb_info *sbi = EXT4_SB(sb);
+	struct ext4_sb_info *sbi = fc->s_fs_info;
+	struct super_block *sb = sbi->s_sb;
 #ifdef CONFIG_QUOTA
 	char *usr_qf_name, *grp_qf_name;
 	/*
@@ -2334,9 +2340,9 @@  static int ext4_validate_options(struct super_block *sb)
 	 * to support legacy quotas in quota files.
 	 */
 	if (test_opt(sb, PRJQUOTA) && !ext4_has_feature_project(sb)) {
-		ext4_msg(sb, KERN_ERR, "Project quota feature not enabled. "
+		ext4_msg(NULL, KERN_ERR, "Project quota feature not enabled. "
 			 "Cannot enable project quota enforcement.");
-		return 0;
+		return -EINVAL;
 	}
 	usr_qf_name = get_qf_name(sb, sbi, USRQUOTA);
 	grp_qf_name = get_qf_name(sb, sbi, GRPQUOTA);
@@ -2348,15 +2354,15 @@  static int ext4_validate_options(struct super_block *sb)
 			clear_opt(sb, GRPQUOTA);
 
 		if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) {
-			ext4_msg(sb, KERN_ERR, "old and new quota "
+			ext4_msg(NULL, KERN_ERR, "old and new quota "
 					"format mixing");
-			return 0;
+			return -EINVAL;
 		}
 
 		if (!sbi->s_jquota_fmt) {
-			ext4_msg(sb, KERN_ERR, "journaled quota format "
+			ext4_msg(NULL, KERN_ERR, "journaled quota format "
 					"not specified");
-			return 0;
+			return -EINVAL;
 		}
 	}
 #endif
@@ -2364,11 +2370,11 @@  static int ext4_validate_options(struct super_block *sb)
 		int blocksize =
 			BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
 		if (blocksize < PAGE_SIZE)
-			ext4_msg(sb, KERN_WARNING, "Warning: mounting with an "
+			ext4_msg(NULL, KERN_WARNING, "Warning: mounting with an "
 				 "experimental mount option 'dioread_nolock' "
 				 "for blocksize < PAGE_SIZE");
 	}
-	return 1;
+	return 0;
 }
 
 static inline void ext4_show_quota_options(struct seq_file *seq,