Linux block layer
 help / color / mirror / Atom feed
* [PATCH] block: fix lbmd_guard_tag_type assignment in FS_IOC_GETLBMD_CAP
       [not found] <CGME20250722081938epcas5p12a1ee45419754afa2f1c1c9040d519d6@epcas5p1.samsung.com>
@ 2025-07-22  8:19 ` Anuj Gupta
  2025-07-22  8:45   ` Christoph Hellwig
  0 siblings, 1 reply; 3+ messages in thread
From: Anuj Gupta @ 2025-07-22  8:19 UTC (permalink / raw)
  To: vincent.fu, anuj1072538, axboe, hch, martin.petersen
  Cc: linux-block, joshi.k, Anuj Gupta

The blk_get_meta_cap() implementation directly assigns bi->csum_type to
the UAPI field lbmd_guard_tag_type. This is not right as the kernel enum
blk_integrity_checksum values is not guaranteed to match the UAPI
defined values.

Fix this by explicitly mapping internal checksum types to UAPI-defined
constants to ensure compatibility and correctness, especially for the
devices using CRC64 PI.

Fixes: 9eb22f7fedfc (add ioctl to query metadata and protection info capabilities)
Reported-by: Vincent Fu <vincent.fu@samsung.com>
Signed-off-by: Anuj Gupta <anuj20.g@samsung.com>
---
 block/blk-integrity.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/block/blk-integrity.c b/block/blk-integrity.c
index 61a79e19c78f..2b5829c58aa1 100644
--- a/block/blk-integrity.c
+++ b/block/blk-integrity.c
@@ -83,7 +83,23 @@ int blk_get_meta_cap(struct block_device *bdev, unsigned int cmd,
 	if (meta_cap.lbmd_opaque_size && !bi->pi_offset)
 		meta_cap.lbmd_opaque_offset = bi->pi_tuple_size;
 
-	meta_cap.lbmd_guard_tag_type = bi->csum_type;
+	switch (bi->csum_type) {
+	case BLK_INTEGRITY_CSUM_NONE:
+		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_NONE;
+		break;
+	case BLK_INTEGRITY_CSUM_IP:
+		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_IP;
+		break;
+	case BLK_INTEGRITY_CSUM_CRC:
+		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_CRC16_T10DIF;
+		break;
+	case BLK_INTEGRITY_CSUM_CRC64:
+		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_CRC64_NVME;
+		break;
+	default:
+		break;
+	}
+
 	if (bi->csum_type != BLK_INTEGRITY_CSUM_NONE)
 		meta_cap.lbmd_app_tag_size = 2;
 
-- 
2.25.1


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

* Re: [PATCH] block: fix lbmd_guard_tag_type assignment in FS_IOC_GETLBMD_CAP
  2025-07-22  8:19 ` [PATCH] block: fix lbmd_guard_tag_type assignment in FS_IOC_GETLBMD_CAP Anuj Gupta
@ 2025-07-22  8:45   ` Christoph Hellwig
  2025-07-22  8:47     ` Christoph Hellwig
  0 siblings, 1 reply; 3+ messages in thread
From: Christoph Hellwig @ 2025-07-22  8:45 UTC (permalink / raw)
  To: Anuj Gupta
  Cc: vincent.fu, anuj1072538, axboe, hch, martin.petersen, linux-block,
	joshi.k

On Tue, Jul 22, 2025 at 01:49:11PM +0530, Anuj Gupta wrote:
> +	switch (bi->csum_type) {
> +	case BLK_INTEGRITY_CSUM_NONE:
> +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_NONE;
> +		break;
> +	case BLK_INTEGRITY_CSUM_IP:
> +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_IP;
> +		break;
> +	case BLK_INTEGRITY_CSUM_CRC:
> +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_CRC16_T10DIF;
> +		break;
> +	case BLK_INTEGRITY_CSUM_CRC64:
> +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_CRC64_NVME;
> +		break;
> +	default:
> +		break;

This should catch and reject invalid values.  Otherwise the patch looks
fine.


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

* Re: [PATCH] block: fix lbmd_guard_tag_type assignment in FS_IOC_GETLBMD_CAP
  2025-07-22  8:45   ` Christoph Hellwig
@ 2025-07-22  8:47     ` Christoph Hellwig
  0 siblings, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2025-07-22  8:47 UTC (permalink / raw)
  To: Anuj Gupta
  Cc: vincent.fu, anuj1072538, axboe, hch, martin.petersen, linux-block,
	joshi.k

On Tue, Jul 22, 2025 at 01:45:53AM -0700, Christoph Hellwig wrote:
> On Tue, Jul 22, 2025 at 01:49:11PM +0530, Anuj Gupta wrote:
> > +	switch (bi->csum_type) {
> > +	case BLK_INTEGRITY_CSUM_NONE:
> > +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_NONE;
> > +		break;
> > +	case BLK_INTEGRITY_CSUM_IP:
> > +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_IP;
> > +		break;
> > +	case BLK_INTEGRITY_CSUM_CRC:
> > +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_CRC16_T10DIF;
> > +		break;
> > +	case BLK_INTEGRITY_CSUM_CRC64:
> > +		meta_cap.lbmd_guard_tag_type = LBMD_PI_CSUM_CRC64_NVME;
> > +		break;
> > +	default:
> > +		break;
> 
> This should catch and reject invalid values.  Otherwise the patch looks
> fine.

I guess reject is wrong, as the kernel is the source, but I think
a bit of validation here still makes sense.  I think if you just leave
the default out, the compiler would complain if we added a new value
to the union without handling it here, which should be enough.


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

end of thread, other threads:[~2025-07-22  8:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CGME20250722081938epcas5p12a1ee45419754afa2f1c1c9040d519d6@epcas5p1.samsung.com>
2025-07-22  8:19 ` [PATCH] block: fix lbmd_guard_tag_type assignment in FS_IOC_GETLBMD_CAP Anuj Gupta
2025-07-22  8:45   ` Christoph Hellwig
2025-07-22  8:47     ` Christoph Hellwig

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