aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/super.c
diff options
context:
space:
mode:
authorDmitry Monakhov <dmonakhov@openvz.org>2015-10-18 23:50:26 -0400
committerTheodore Ts'o <tytso@mit.edu>2015-10-18 23:50:26 -0400
commit1e381f60dad913625956ed3a9c5714d9fc7e865f (patch)
tree0087057e6ef3610cc5e1f197d8754e644d803567 /fs/ext4/super.c
parentc93cf2d75779d73376e84e2547de1304113d3f1c (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.c31
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;