2015-10-09 09:54:52

by Dmitry Monakhov

[permalink] [raw]
Subject: [PATCH 1/2] ext4: explicit mount options parsing cleanup

Currently MOPT_EXPLICIT treated as EXPLICIT_DELALLOC which may be changed
in future. Let's fix it now.

Signed-off-by: Dmitry Monakhov <[email protected]>
---
fs/ext4/super.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 7ef3fa5..e91f6d4 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1503,8 +1503,12 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
return -1;
if (args->from && (m->flags & MOPT_GTE0) && (arg < 0))
return -1;
- if (m->flags & MOPT_EXPLICIT)
- set_opt2(sb, EXPLICIT_DELALLOC);
+ if (m->flags & MOPT_EXPLICIT) {
+ if (m->mount_opt & EXT4_MOUNT_DELALLOC) {
+ set_opt2(sb, EXPLICIT_DELALLOC);
+ } else
+ return -1;
+ }
if (m->flags & MOPT_CLEAR_ERR)
clear_opt(sb, ERRORS_MASK);
if (token == Opt_noquota && sb_any_quota_loaded(sb)) {
--
1.7.1



2015-10-09 09:54:54

by Dmitry Monakhov

[permalink] [raw]
Subject: [PATCH 2/2] ext4: do not allow journal_opts for fs w/o journal

It is appeared that we can pass journal related mount options and such options
be shown in /proc/mounts

Example:
#mkfs.ext4 -F /dev/vdb
#tune2fs -O ^has_journal /dev/vdb
#mount /dev/vdb /mnt/ -ocommit=20,journal_async_commit
#cat /proc/mounts | grep /mnt
/dev/vdb /mnt ext4 rw,relatime,journal_checksum,journal_async_commit,commit=20,data=ordered 0 0

But options:"journal_checksum,journal_async_commit,commit=20,data=ordered" has
nothing with reality because there is no jornall at all.

This patch disallow following options for journalless configurations:
- journal_checksum
- journal_async_commit
- commit=%ld
- data={writeback,ordered,journal}

Signed-off-by: Dmitry Monakhov <[email protected]>
---
fs/ext4/ext4.h | 3 +++
fs/ext4/super.c | 31 +++++++++++++++++++++++++++++--
2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 3f248c9..871cdc6 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1019,6 +1019,9 @@ struct ext4_inode_info {
#define EXT4_MOUNT2_HURD_COMPAT 0x00000004 /* Support HURD-castrated
file systems */

+#define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM 0x00000008 /* User explicitly
+ specified journal checksum */
+
#define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \
~EXT4_MOUNT_##opt
#define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index e91f6d4..a29b32b 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1371,10 +1371,10 @@ static const struct mount_opts {
{Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
MOPT_EXT4_ONLY | MOPT_CLEAR},
{Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
- MOPT_EXT4_ONLY | MOPT_SET},
+ MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
{Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT |
EXT4_MOUNT_JOURNAL_CHECKSUM),
- MOPT_EXT4_ONLY | MOPT_SET},
+ MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
{Opt_noload, EXT4_MOUNT_NOLOAD, MOPT_NO_EXT2 | MOPT_SET},
{Opt_err_panic, EXT4_MOUNT_ERRORS_PANIC, MOPT_SET | MOPT_CLEAR_ERR},
{Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR},
@@ -1506,6 +1506,8 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
if (m->flags & MOPT_EXPLICIT) {
if (m->mount_opt & EXT4_MOUNT_DELALLOC) {
set_opt2(sb, EXPLICIT_DELALLOC);
+ } else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) {
+ set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM);
} else
return -1;
}
@@ -3675,6 +3677,31 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
"suppressed and not mounted read-only");
goto failed_mount_wq;
} else {
+ /* Nojournal mode, all journal mount options are illegal */
+ if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) {
+ ext4_msg(sb, KERN_ERR, "can't mount with "
+ "journal_checksum, fs mounted w/o journal");
+ goto failed_mount_wq;
+ }
+ if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
+ ext4_msg(sb, KERN_ERR, "can't mount with "
+ "journal_async_commit, fs mounted w/o journal");
+ goto failed_mount_wq;
+ }
+ if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) {
+ ext4_msg(sb, KERN_ERR, "can't mount with "
+ "commit=%lu, fs mounted w/o journal",
+ sbi->s_commit_interval / HZ);
+ goto failed_mount_wq;
+ }
+ if (EXT4_MOUNT_DATA_FLAGS &
+ (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) {
+ ext4_msg(sb, KERN_ERR, "can't mount with "
+ "data=, fs mounted w/o journal");
+ goto failed_mount_wq;
+ }
+ sbi->s_def_mount_opt &= EXT4_MOUNT_JOURNAL_CHECKSUM;
+ clear_opt(sb, JOURNAL_CHECKSUM);
clear_opt(sb, DATA_FLAGS);
sbi->s_journal = NULL;
needs_recovery = 0;
--
1.7.1


2015-10-09 20:53:45

by Andreas Dilger

[permalink] [raw]
Subject: Re: [PATCH 2/2] ext4: do not allow journal_opts for fs w/o journal

On Oct 9, 2015, at 3:09 AM, Dmitry Monakhov <[email protected]> wrote:
>
> It is appeared that we can pass journal related mount options and such options
> be shown in /proc/mounts
>
> Example:
> #mkfs.ext4 -F /dev/vdb
> #tune2fs -O ^has_journal /dev/vdb
> #mount /dev/vdb /mnt/ -ocommit=20,journal_async_commit
> #cat /proc/mounts | grep /mnt
> /dev/vdb /mnt ext4 rw,relatime,journal_checksum,journal_async_commit,commit=20,data=ordered 0 0
>
> But options:"journal_checksum,journal_async_commit,commit=20,data=ordered" has
> nothing with reality because there is no jornall at all.

(typo) s/jornall/journal/

but looks reasonable otherwise.

Reviewed-by: Andreas Dilger <[email protected]>

> This patch disallow following options for journalless configurations:
> - journal_checksum
> - journal_async_commit
> - commit=%ld
> - data={writeback,ordered,journal}
>
> Signed-off-by: Dmitry Monakhov <[email protected]>
> ---
> fs/ext4/ext4.h | 3 +++
> fs/ext4/super.c | 31 +++++++++++++++++++++++++++++--
> 2 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 3f248c9..871cdc6 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -1019,6 +1019,9 @@ struct ext4_inode_info {
> #define EXT4_MOUNT2_HURD_COMPAT 0x00000004 /* Support HURD-castrated
> file systems */
>
> +#define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM 0x00000008 /* User explicitly
> + specified journal checksum */
> +
> #define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \
> ~EXT4_MOUNT_##opt
> #define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index e91f6d4..a29b32b 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -1371,10 +1371,10 @@ static const struct mount_opts {
> {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
> MOPT_EXT4_ONLY | MOPT_CLEAR},
> {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
> - MOPT_EXT4_ONLY | MOPT_SET},
> + MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
> {Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT |
> EXT4_MOUNT_JOURNAL_CHECKSUM),
> - MOPT_EXT4_ONLY | MOPT_SET},
> + MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
> {Opt_noload, EXT4_MOUNT_NOLOAD, MOPT_NO_EXT2 | MOPT_SET},
> {Opt_err_panic, EXT4_MOUNT_ERRORS_PANIC, MOPT_SET | MOPT_CLEAR_ERR},
> {Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR},
> @@ -1506,6 +1506,8 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
> if (m->flags & MOPT_EXPLICIT) {
> if (m->mount_opt & EXT4_MOUNT_DELALLOC) {
> set_opt2(sb, EXPLICIT_DELALLOC);
> + } else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) {
> + set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM);
> } else
> return -1;
> }
> @@ -3675,6 +3677,31 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
> "suppressed and not mounted read-only");
> goto failed_mount_wq;
> } else {
> + /* Nojournal mode, all journal mount options are illegal */
> + if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) {
> + ext4_msg(sb, KERN_ERR, "can't mount with "
> + "journal_checksum, fs mounted w/o journal");
> + goto failed_mount_wq;
> + }
> + if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
> + ext4_msg(sb, KERN_ERR, "can't mount with "
> + "journal_async_commit, fs mounted w/o journal");
> + goto failed_mount_wq;
> + }
> + if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) {
> + ext4_msg(sb, KERN_ERR, "can't mount with "
> + "commit=%lu, fs mounted w/o journal",
> + sbi->s_commit_interval / HZ);
> + goto failed_mount_wq;
> + }
> + if (EXT4_MOUNT_DATA_FLAGS &
> + (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) {
> + ext4_msg(sb, KERN_ERR, "can't mount with "
> + "data=, fs mounted w/o journal");
> + goto failed_mount_wq;
> + }
> + sbi->s_def_mount_opt &= EXT4_MOUNT_JOURNAL_CHECKSUM;
> + clear_opt(sb, JOURNAL_CHECKSUM);
> clear_opt(sb, DATA_FLAGS);
> sbi->s_journal = NULL;
> needs_recovery = 0;
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html


Cheers, Andreas






Attachments:
signature.asc (833.00 B)
Message signed with OpenPGP using GPGMail

2015-10-19 03:57:24

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH 1/2] ext4: explicit mount options parsing cleanup

On Fri, Oct 09, 2015 at 01:09:58PM +0400, Dmitry Monakhov wrote:
> Currently MOPT_EXPLICIT treated as EXPLICIT_DELALLOC which may be changed
> in future. Let's fix it now.
>
> Signed-off-by: Dmitry Monakhov <[email protected]>

Applied, thanks.

- Ted

2015-10-19 03:57:37

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH 2/2] ext4: do not allow journal_opts for fs w/o journal

On Fri, Oct 09, 2015 at 02:53:39PM -0600, Andreas Dilger wrote:
> On Oct 9, 2015, at 3:09 AM, Dmitry Monakhov <[email protected]> wrote:
> >
> > It is appeared that we can pass journal related mount options and such options
> > be shown in /proc/mounts
> >
> > Example:
> > #mkfs.ext4 -F /dev/vdb
> > #tune2fs -O ^has_journal /dev/vdb
> > #mount /dev/vdb /mnt/ -ocommit=20,journal_async_commit
> > #cat /proc/mounts | grep /mnt
> > /dev/vdb /mnt ext4 rw,relatime,journal_checksum,journal_async_commit,commit=20,data=ordered 0 0
> >
> > But options:"journal_checksum,journal_async_commit,commit=20,data=ordered" has
> > nothing with reality because there is no jornall at all.
>
> (typo) s/jornall/journal/
>
> but looks reasonable otherwise.
>
> Reviewed-by: Andreas Dilger <[email protected]>

Applied, thanks.

- Ted