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: TR Reardon <thomas_reardon@hotmail.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
c7f725435a
commit
feb8c6d3dd
2 changed files with 14 additions and 13 deletions
|
@ -3237,6 +3237,10 @@ static int set_journal_csum_feature_set(struct super_block *sb)
|
|||
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)) {
|
||||
ret = jbd2_journal_set_features(sbi->s_journal,
|
||||
compat, 0,
|
||||
|
@ -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_FEATURE_INCOMPAT_ASYNC_COMMIT);
|
||||
} else {
|
||||
jbd2_journal_clear_features(sbi->s_journal,
|
||||
JBD2_FEATURE_COMPAT_CHECKSUM, 0,
|
||||
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT |
|
||||
JBD2_FEATURE_INCOMPAT_CSUM_V3 |
|
||||
JBD2_FEATURE_INCOMPAT_CSUM_V2);
|
||||
jbd2_journal_clear_features(sbi->s_journal, 0, 0,
|
||||
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -1522,14 +1522,6 @@ static int journal_get_superblock(journal_t *journal)
|
|||
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) &&
|
||||
JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V3)) {
|
||||
/* Can't have checksum v2 and v3 at the same time! */
|
||||
|
@ -1538,6 +1530,14 @@ static int journal_get_superblock(journal_t *journal)
|
|||
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)) {
|
||||
printk(KERN_ERR "JBD2: Unknown checksum type\n");
|
||||
goto out;
|
||||
|
|
Loading…
Reference in a new issue