diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2015-10-18 23:50:26 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2015-10-18 23:50:26 -0400 |
commit | 1e381f60dad913625956ed3a9c5714d9fc7e865f (patch) | |
tree | 0087057e6ef3610cc5e1f197d8754e644d803567 /fs/ext4/super.c | |
parent | c93cf2d75779d73376e84e2547de1304113d3f1c (diff) |
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 journal 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 <dmonakhov@openvz.org>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index db4be39a8db7..04d0f1b33409 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1384,10 +1384,10 @@ static const struct mount_opts { | |||
1384 | {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, | 1384 | {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, |
1385 | MOPT_EXT4_ONLY | MOPT_CLEAR}, | 1385 | MOPT_EXT4_ONLY | MOPT_CLEAR}, |
1386 | {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, | 1386 | {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, |
1387 | MOPT_EXT4_ONLY | MOPT_SET}, | 1387 | MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT}, |
1388 | {Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT | | 1388 | {Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT | |
1389 | EXT4_MOUNT_JOURNAL_CHECKSUM), | 1389 | EXT4_MOUNT_JOURNAL_CHECKSUM), |
1390 | MOPT_EXT4_ONLY | MOPT_SET}, | 1390 | MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT}, |
1391 | {Opt_noload, EXT4_MOUNT_NOLOAD, MOPT_NO_EXT2 | MOPT_SET}, | 1391 | {Opt_noload, EXT4_MOUNT_NOLOAD, MOPT_NO_EXT2 | MOPT_SET}, |
1392 | {Opt_err_panic, EXT4_MOUNT_ERRORS_PANIC, MOPT_SET | MOPT_CLEAR_ERR}, | 1392 | {Opt_err_panic, EXT4_MOUNT_ERRORS_PANIC, MOPT_SET | MOPT_CLEAR_ERR}, |
1393 | {Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR}, | 1393 | {Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR}, |
@@ -1519,6 +1519,8 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | |||
1519 | if (m->flags & MOPT_EXPLICIT) { | 1519 | if (m->flags & MOPT_EXPLICIT) { |
1520 | if (m->mount_opt & EXT4_MOUNT_DELALLOC) { | 1520 | if (m->mount_opt & EXT4_MOUNT_DELALLOC) { |
1521 | set_opt2(sb, EXPLICIT_DELALLOC); | 1521 | set_opt2(sb, EXPLICIT_DELALLOC); |
1522 | } else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) { | ||
1523 | set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM); | ||
1522 | } else | 1524 | } else |
1523 | return -1; | 1525 | return -1; |
1524 | } | 1526 | } |
@@ -3677,6 +3679,31 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3677 | "suppressed and not mounted read-only"); | 3679 | "suppressed and not mounted read-only"); |
3678 | goto failed_mount_wq; | 3680 | goto failed_mount_wq; |
3679 | } else { | 3681 | } else { |
3682 | /* Nojournal mode, all journal mount options are illegal */ | ||
3683 | if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) { | ||
3684 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3685 | "journal_checksum, fs mounted w/o journal"); | ||
3686 | goto failed_mount_wq; | ||
3687 | } | ||
3688 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { | ||
3689 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3690 | "journal_async_commit, fs mounted w/o journal"); | ||
3691 | goto failed_mount_wq; | ||
3692 | } | ||
3693 | if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) { | ||
3694 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3695 | "commit=%lu, fs mounted w/o journal", | ||
3696 | sbi->s_commit_interval / HZ); | ||
3697 | goto failed_mount_wq; | ||
3698 | } | ||
3699 | if (EXT4_MOUNT_DATA_FLAGS & | ||
3700 | (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) { | ||
3701 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3702 | "data=, fs mounted w/o journal"); | ||
3703 | goto failed_mount_wq; | ||
3704 | } | ||
3705 | sbi->s_def_mount_opt &= EXT4_MOUNT_JOURNAL_CHECKSUM; | ||
3706 | clear_opt(sb, JOURNAL_CHECKSUM); | ||
3680 | clear_opt(sb, DATA_FLAGS); | 3707 | clear_opt(sb, DATA_FLAGS); |
3681 | sbi->s_journal = NULL; | 3708 | sbi->s_journal = NULL; |
3682 | needs_recovery = 0; | 3709 | needs_recovery = 0; |