|
@@ -1438,6 +1438,17 @@ static int journal_get_superblock(journal_t *journal)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /* Load the checksum driver */
|
|
|
+ if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2)) {
|
|
|
+ journal->j_chksum_driver = crypto_alloc_shash("crc32c", 0, 0);
|
|
|
+ if (IS_ERR(journal->j_chksum_driver)) {
|
|
|
+ printk(KERN_ERR "JBD: Cannot load crc32c driver.\n");
|
|
|
+ err = PTR_ERR(journal->j_chksum_driver);
|
|
|
+ journal->j_chksum_driver = NULL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
set_buffer_verified(bh);
|
|
|
|
|
|
return 0;
|
|
@@ -1591,6 +1602,8 @@ int jbd2_journal_destroy(journal_t *journal)
|
|
|
iput(journal->j_inode);
|
|
|
if (journal->j_revoke)
|
|
|
jbd2_journal_destroy_revoke(journal);
|
|
|
+ if (journal->j_chksum_driver)
|
|
|
+ crypto_free_shash(journal->j_chksum_driver);
|
|
|
kfree(journal->j_wbuf);
|
|
|
kfree(journal);
|
|
|
|
|
@@ -1707,6 +1720,18 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat,
|
|
|
sb->s_checksum_type = JBD2_CRC32C_CHKSUM;
|
|
|
sb->s_feature_compat &=
|
|
|
~cpu_to_be32(JBD2_FEATURE_COMPAT_CHECKSUM);
|
|
|
+
|
|
|
+ /* Load the checksum driver */
|
|
|
+ if (journal->j_chksum_driver == NULL) {
|
|
|
+ journal->j_chksum_driver = crypto_alloc_shash("crc32c",
|
|
|
+ 0, 0);
|
|
|
+ if (IS_ERR(journal->j_chksum_driver)) {
|
|
|
+ printk(KERN_ERR "JBD: Cannot load crc32c "
|
|
|
+ "driver.\n");
|
|
|
+ journal->j_chksum_driver = NULL;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* If enabling v1 checksums, downgrade superblock */
|