On Fri, Feb 21, 2025 at 04:07:55PM +0530, Anuj gupta wrote: > > I don't see any change in what's reported with block/for-next in a > > regular SCSI HBA/disk setup. Will have to look at whether there is a > > stacking issue wrt. multipathing. > > Hi Martin, Christoph, > > It seems this change in behaviour is not limited to SCSI only. As Nikhil > mentioned an earlier commit > [9f4aa46f2a74 ("block: invert the BLK_INTEGRITY_{GENERATE,VERIFY} flags")] > causes this change in behaviour. On my setup with a NVMe drive not formatted > with PI, I see that: > > Without this commit: > Value reported by read_verify and write_generate sysfs entries is 0. > > With this commit: > Value reported by read_verify and write_generate sysfs entries is 1. > > Diving a bit deeper, both these flags got inverted due to this commit. > But during init (in nvme_init_integrity) these values get initialized to 0, > inturn setting the sysfs entries to 1. In order to fix this, the driver has to > initialize both these flags to 1 in nvme_init_integrity if PI is not supported. > That way, the value in sysfs for these entries would become 0 again. Tried this > approach in my setup, and I am able to see the right values now. Then something > like this would also need to be done for SCSI too. This is the patch that I used: diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 818d4e49aab5..6cd9f57131cc 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1799,6 +1799,7 @@ static bool nvme_init_integrity(struct nvme_ns_head *head, memset(bi, 0, sizeof(*bi)); + bi->flags |= BLK_INTEGRITY_NOGENERATE | BLK_INTEGRITY_NOVERIFY; if (!head->ms) return true; @@ -1817,11 +1818,15 @@ static bool nvme_init_integrity(struct nvme_ns_head *head, bi->csum_type = BLK_INTEGRITY_CSUM_CRC; bi->tag_size = sizeof(u16) + sizeof(u32); bi->flags |= BLK_INTEGRITY_DEVICE_CAPABLE; + bi->flags &= ~(BLK_INTEGRITY_NOGENERATE | + BLK_INTEGRITY_NOVERIFY); break; case NVME_NVM_NS_64B_GUARD: bi->csum_type = BLK_INTEGRITY_CSUM_CRC64; bi->tag_size = sizeof(u16) + 6; bi->flags |= BLK_INTEGRITY_DEVICE_CAPABLE; + bi->flags &= ~(BLK_INTEGRITY_NOGENERATE | + BLK_INTEGRITY_NOVERIFY); break; default: break; @@ -1835,12 +1840,16 @@ static bool nvme_init_integrity(struct nvme_ns_head *head, bi->tag_size = sizeof(u16); bi->flags |= BLK_INTEGRITY_DEVICE_CAPABLE | BLK_INTEGRITY_REF_TAG; + bi->flags &= ~(BLK_INTEGRITY_NOGENERATE | + BLK_INTEGRITY_NOVERIFY); break; case NVME_NVM_NS_64B_GUARD: bi->csum_type = BLK_INTEGRITY_CSUM_CRC64; bi->tag_size = sizeof(u16); bi->flags |= BLK_INTEGRITY_DEVICE_CAPABLE | BLK_INTEGRITY_REF_TAG; + bi->flags &= ~(BLK_INTEGRITY_NOGENERATE | + BLK_INTEGRITY_NOVERIFY); break; default: break;