[PATCH v1 1/3] block: Fix incorrect integrity sysfs reporting for DM devices
Anuj gupta
anuj1072538 at gmail.com
Wed Feb 26 03:27:42 PST 2025
> > diff --git a/block/blk-settings.c b/block/blk-settings.c
> > index c44dadc35e1e..c32517c8bc2e 100644
> > --- a/block/blk-settings.c
> > +++ b/block/blk-settings.c
> > @@ -861,7 +861,8 @@ bool queue_limits_stack_integrity(struct queue_limits *t,
> >
> > if (!ti->tuple_size) {
> > /* inherit the settings from the first underlying device */
> > - if (!(ti->flags & BLK_INTEGRITY_STACKED)) {
> > + if (!(ti->flags & BLK_INTEGRITY_STACKED) &&
> > + (bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE)) {
> > ti->flags = BLK_INTEGRITY_DEVICE_CAPABLE |
> > (bi->flags & BLK_INTEGRITY_REF_TAG);
> > ti->csum_type = bi->csum_type;
>
> Hmm. I wonder if this is the correct logic. Basically we do not want to
> allow mixing integrity capable and not integrity devices, do we?
It is about a situation where a non-integrity-capable device incorrectly
reports integrity capability due to improper flag propagation. The issue
is that BLK_INTEGRITY_DEVICE_CAPABLE is set incorrectly even when the
first underlying device does not support integrity. This part of the patch
tries to fix that.
For example, when I create a dm-linear device using an integrity-incapable
device, the resulting DM device wrongly reports integrity capability [1]
Rest of the handling in this patch would not be required once we correctly
initialize in blk_validate_integrity_limits as you suggested in the other
reply [2]
[1]
# cat /sys/block/nvme0n1/integrity/device_is_integrity_capable
0
# echo 0 409600 linear /dev/nvme0n1 0 > /tmp/table
# echo 409600 409600 linear /dev/nvme0n1 0 >> /tmp/table
# dmsetup create two /tmp/table
# cat /sys/block/dm-0/integrity/device_is_integrity_capable
1
[2]
https://lore.kernel.org/linux-block/20250225150753.GB6099@lst.de/
> So maybe the logic should be more something like:
>
> if (!IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY))
> return true;
>
> if (ti->flags & BLK_INTEGRITY_STACKED) {
> /* check blk_integrity compatibility */
> } else {
> ti->flags = BLK_INTEGRITY_STACKED;
> /* inherit blk_integrity, including the empty one */
> }
>
More information about the Linux-nvme
mailing list