Commit ae97648e authored by Shubhankar Mishra's avatar Shubhankar Mishra Committed by Mikulas Patocka
Browse files

dm verity fec: Expose corrected block count via status



Enhance visibility into dm-verity Forward Error Correction (FEC)
activity. While FEC can correct on-disk corruptions, the number of
successful correction events is not readily exposed through a standard
interface.

This change integrates FEC statistics into the verity target's
.status handler for STATUSTYPE_INFO. The info output now
includes count of corrected block by FEC.

The counter is a per-device instance atomic64_t, maintained within
the struct dm_verity_fec, tracking blocks successfully repaired by FEC
on this specific device instance since it was created.

This approach aligns with the standard Device Mapper mechanism for
targets to report runtime information, as used by other targets like
dm-integrity.

This patch also updates Documentation/admin-guide/device-mapper/verity.rst
to reflect the new status information.

Tested:
  Induced single-bit errors on a block device protected by dm-verity
  with FEC on android phone. Confirmed 'dmctl status <device>' on Android
  reports an incrementing 'fec_corrected_blocks' count after the
  corrupted blocks were accessed.

Signed-off-by: default avatarShubhankar Mishra <shubhankarm@google.com>
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
parent c82faa89
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -236,8 +236,10 @@ is available at the cryptsetup project's wiki page

Status
======
V (for Valid) is returned if every check performed so far was valid.
1. V (for Valid) is returned if every check performed so far was valid.
   If any check failed, C (for Corruption) is returned.
2. Number of corrected blocks by Forward Error Correction.
   '-' if Forward Error Correction is not enabled.

Example
=======
+3 −1
Original line number Diff line number Diff line
@@ -177,9 +177,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
	if (r < 0 && neras)
		DMERR_LIMIT("%s: FEC %llu: failed to correct: %d",
			    v->data_dev->name, (unsigned long long)rsb, r);
	else if (r > 0)
	else if (r > 0) {
		DMWARN_LIMIT("%s: FEC %llu: corrected %d errors",
			     v->data_dev->name, (unsigned long long)rsb, r);
		atomic64_inc(&v->fec->corrected);
	}

	return r;
}
+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ struct dm_verity_fec {
	mempool_t extra_pool;	/* mempool for extra buffers */
	mempool_t output_pool;	/* mempool for output */
	struct kmem_cache *cache;	/* cache for buffers */
	atomic64_t corrected; /* corrected errors */
};

/* per-bio data */
+4 −0
Original line number Diff line number Diff line
@@ -848,6 +848,10 @@ static void verity_status(struct dm_target *ti, status_type_t type,
	switch (type) {
	case STATUSTYPE_INFO:
		DMEMIT("%c", v->hash_failed ? 'C' : 'V');
		if (verity_fec_is_enabled(v))
			DMEMIT(" %lld", atomic64_read(&v->fec->corrected));
		else
			DMEMIT(" -");
		break;
	case STATUSTYPE_TABLE:
		DMEMIT("%u %s %s %u %u %llu %llu %s ",