diff options
-rw-r--r-- | fs/ext4/ext4.h | 3 | ||||
-rw-r--r-- | 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 b1d04aa724be..750063f7a50c 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1023,6 +1023,9 @@ struct ext4_inode_info { | |||
1023 | #define EXT4_MOUNT2_HURD_COMPAT 0x00000004 /* Support HURD-castrated | 1023 | #define EXT4_MOUNT2_HURD_COMPAT 0x00000004 /* Support HURD-castrated |
1024 | file systems */ | 1024 | file systems */ |
1025 | 1025 | ||
1026 | #define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM 0x00000008 /* User explicitly | ||
1027 | specified journal checksum */ | ||
1028 | |||
1026 | #define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \ | 1029 | #define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \ |
1027 | ~EXT4_MOUNT_##opt | 1030 | ~EXT4_MOUNT_##opt |
1028 | #define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \ | 1031 | #define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \ |
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; |