mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] dm verity fec: Expose corrected block count via status
@ 2025-11-05 14:06 Shubhankar Mishra
  2025-11-05 14:27 ` Mikulas Patocka
  0 siblings, 1 reply; 2+ messages in thread
From: Shubhankar Mishra @ 2025-11-05 14:06 UTC (permalink / raw)
  To: Alasdair Kergon, Mike Snitzer, Mikulas Patocka, Jonathan Corbet
  Cc: dm-devel, linux-doc, linux-kernel, Eric Biggers, Sami Tolvanen,
	kernel-team, Shubhankar Mishra

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: Shubhankar Mishra <shubhankarm@google.com>
---
 Documentation/admin-guide/device-mapper/verity.rst | 6 ++++--
 drivers/md/dm-verity-fec.c                         | 4 +++-
 drivers/md/dm-verity-fec.h                         | 1 +
 drivers/md/dm-verity-target.c                      | 4 ++++
 4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/Documentation/admin-guide/device-mapper/verity.rst b/Documentation/admin-guide/device-mapper/verity.rst
index 8c3f1f967a3c..3ecab1cff9c6 100644
--- a/Documentation/admin-guide/device-mapper/verity.rst
+++ b/Documentation/admin-guide/device-mapper/verity.rst
@@ -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.
-If any check failed, C (for Corruption) is returned.
+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
 =======
diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
index 301a9c01bf86..d792eaed0792 100644
--- a/drivers/md/dm-verity-fec.c
+++ b/drivers/md/dm-verity-fec.c
@@ -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;
 }
diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h
index a6689cdc489d..dd55037377b6 100644
--- a/drivers/md/dm-verity-fec.h
+++ b/drivers/md/dm-verity-fec.h
@@ -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 */
diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
index bf0aee73b074..52a0e052a5e8 100644
--- a/drivers/md/dm-verity-target.c
+++ b/drivers/md/dm-verity-target.c
@@ -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 ",
-- 
2.51.2.1006.ga50a493c49-goog


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] dm verity fec: Expose corrected block count via status
  2025-11-05 14:06 [PATCH] dm verity fec: Expose corrected block count via status Shubhankar Mishra
@ 2025-11-05 14:27 ` Mikulas Patocka
  0 siblings, 0 replies; 2+ messages in thread
From: Mikulas Patocka @ 2025-11-05 14:27 UTC (permalink / raw)
  To: Shubhankar Mishra
  Cc: Alasdair Kergon, Mike Snitzer, Jonathan Corbet, dm-devel,
	linux-doc, linux-kernel, Eric Biggers, Sami Tolvanen,
	kernel-team

Accepted, thanks.

Mikulas

On Wed, 5 Nov 2025, Shubhankar Mishra wrote:

> 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: Shubhankar Mishra <shubhankarm@google.com>
> ---
>  Documentation/admin-guide/device-mapper/verity.rst | 6 ++++--
>  drivers/md/dm-verity-fec.c                         | 4 +++-
>  drivers/md/dm-verity-fec.h                         | 1 +
>  drivers/md/dm-verity-target.c                      | 4 ++++
>  4 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/admin-guide/device-mapper/verity.rst b/Documentation/admin-guide/device-mapper/verity.rst
> index 8c3f1f967a3c..3ecab1cff9c6 100644
> --- a/Documentation/admin-guide/device-mapper/verity.rst
> +++ b/Documentation/admin-guide/device-mapper/verity.rst
> @@ -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.
> -If any check failed, C (for Corruption) is returned.
> +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
>  =======
> diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
> index 301a9c01bf86..d792eaed0792 100644
> --- a/drivers/md/dm-verity-fec.c
> +++ b/drivers/md/dm-verity-fec.c
> @@ -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;
>  }
> diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h
> index a6689cdc489d..dd55037377b6 100644
> --- a/drivers/md/dm-verity-fec.h
> +++ b/drivers/md/dm-verity-fec.h
> @@ -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 */
> diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
> index bf0aee73b074..52a0e052a5e8 100644
> --- a/drivers/md/dm-verity-target.c
> +++ b/drivers/md/dm-verity-target.c
> @@ -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 ",
> -- 
> 2.51.2.1006.ga50a493c49-goog
> 


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-11-05 14:27 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-05 14:06 [PATCH] dm verity fec: Expose corrected block count via status Shubhankar Mishra
2025-11-05 14:27 ` Mikulas Patocka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®