#define BLKID_SUBLKS_USAGE (1 << 7) /* define USAGE result value */
#define BLKID_SUBLKS_VERSION (1 << 8) /* read FS type from superblock */
#define BLKID_SUBLKS_MAGIC (1 << 9) /* define SBMAGIC and SBMAGIC_OFFSET */
+#define BLKID_SUBLKS_BADCSUM (1 << 10) /* allow a bad checksum */
#define BLKID_SUBLKS_DEFAULT (BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID | \
BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE)
int blkid_probe_verify_csum(blkid_probe pr, uint64_t csum, uint64_t expected)
{
if (csum != expected) {
+ struct blkid_chain *chn = blkid_probe_get_chain(pr);
+
DBG(LOWPROBE, blkid_debug(
"incorrect checksum for type %s,"
" got %jX, expected %jX",
blkid_probe_get_probername(pr),
csum, expected));
- return 0;
+
+ if (!(chn->flags & BLKID_SUBLKS_BADCSUM))
+ return 0;
}
- return 1;
+ return 1; /* checksum accepted */
}
/**
blkid_probe_enable_superblocks(pr, 1);
blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_MAGIC |
BLKID_SUBLKS_TYPE | BLKID_SUBLKS_USAGE |
- BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID);
+ BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID |
+ BLKID_SUBLKS_BADCSUM);
blkid_probe_enable_partitions(pr, 1);
blkid_probe_set_partitions_flags(pr, BLKID_PARTS_MAGIC);