提交 feb8c6d3 编写于 作者: D Darrick J. Wong 提交者: Theodore Ts'o

jbd2: fix journal checksum feature flag handling

Clear all three journal checksum feature flags before turning on
whichever journal checksum options we want.  Rearrange the error
checking so that newer flags get complained about first.
Reported-by: NTR Reardon <thomas_reardon@hotmail.com>
Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
上级 c7f72543
...@@ -3237,6 +3237,10 @@ static int set_journal_csum_feature_set(struct super_block *sb) ...@@ -3237,6 +3237,10 @@ static int set_journal_csum_feature_set(struct super_block *sb)
incompat = 0; incompat = 0;
} }
jbd2_journal_clear_features(sbi->s_journal,
JBD2_FEATURE_COMPAT_CHECKSUM, 0,
JBD2_FEATURE_INCOMPAT_CSUM_V3 |
JBD2_FEATURE_INCOMPAT_CSUM_V2);
if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
ret = jbd2_journal_set_features(sbi->s_journal, ret = jbd2_journal_set_features(sbi->s_journal,
compat, 0, compat, 0,
...@@ -3249,11 +3253,8 @@ static int set_journal_csum_feature_set(struct super_block *sb) ...@@ -3249,11 +3253,8 @@ static int set_journal_csum_feature_set(struct super_block *sb)
jbd2_journal_clear_features(sbi->s_journal, 0, 0, jbd2_journal_clear_features(sbi->s_journal, 0, 0,
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT); JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT);
} else { } else {
jbd2_journal_clear_features(sbi->s_journal, jbd2_journal_clear_features(sbi->s_journal, 0, 0,
JBD2_FEATURE_COMPAT_CHECKSUM, 0, JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT);
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT |
JBD2_FEATURE_INCOMPAT_CSUM_V3 |
JBD2_FEATURE_INCOMPAT_CSUM_V2);
} }
return ret; return ret;
......
...@@ -1522,14 +1522,6 @@ static int journal_get_superblock(journal_t *journal) ...@@ -1522,14 +1522,6 @@ static int journal_get_superblock(journal_t *journal)
goto out; goto out;
} }
if (jbd2_journal_has_csum_v2or3(journal) &&
JBD2_HAS_COMPAT_FEATURE(journal, JBD2_FEATURE_COMPAT_CHECKSUM)) {
/* Can't have checksum v1 and v2 on at the same time! */
printk(KERN_ERR "JBD2: Can't enable checksumming v1 and v2 "
"at the same time!\n");
goto out;
}
if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2) && if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2) &&
JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V3)) { JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V3)) {
/* Can't have checksum v2 and v3 at the same time! */ /* Can't have checksum v2 and v3 at the same time! */
...@@ -1538,6 +1530,14 @@ static int journal_get_superblock(journal_t *journal) ...@@ -1538,6 +1530,14 @@ static int journal_get_superblock(journal_t *journal)
goto out; goto out;
} }
if (jbd2_journal_has_csum_v2or3(journal) &&
JBD2_HAS_COMPAT_FEATURE(journal, JBD2_FEATURE_COMPAT_CHECKSUM)) {
/* Can't have checksum v1 and v2 on at the same time! */
printk(KERN_ERR "JBD2: Can't enable checksumming v1 and v2/3 "
"at the same time!\n");
goto out;
}
if (!jbd2_verify_csum_type(journal, sb)) { if (!jbd2_verify_csum_type(journal, sb)) {
printk(KERN_ERR "JBD2: Unknown checksum type\n"); printk(KERN_ERR "JBD2: Unknown checksum type\n");
goto out; goto out;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册