Skip to contentSkip to conversation

sd_dif: problem with verify of type 1 protection information (PI)

PATCH In review Jeremy Higdon 2 participants 2 messages Apr 18, 2013 – Apr 25, 2013 SCSI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 sd_dif: problem with verify of type 1 protection information (PI)

It appears to me that there is a problem with handling of type 1 protection information.

It is considering a logical block reference tag of 0xffffffff to be an error, but it is actually valid any time ((lba & 0xffffffff) == 0xffffffff) [for example, 2TiB-1, 4TiB-1, 6TiB-1, etc.].

I'm going by what's written in 4.18.3 of SBC3, where there doesn't appear to be any invalid value for the reference tag.

 sd_dif.c |    8 --------
 1 file changed, 8 deletions(-)
drivers/scsi/sd_dif.c +0 -8
@@ -93,14 +93,6 @@ static int sd_dif_type1_verify(struct bl
 		if (sdt->app_tag == 0xffff)
 			return 0;
 
-		/* Bad ref tag received from disk */
-		if (sdt->ref_tag == 0xffffffff) {
-			printk(KERN_ERR
-			       "%s: bad phys ref tag on sector %lu\n",
-			       bix->disk_name, (unsigned long)sector);
-			return -EIO;
-		}
-
 		if (be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
 			printk(KERN_ERR
 			       "%s: ref tag error on sector %lu (rcvd %u)\n",
#1 lore raw
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Jeremy" == Jeremy Higdon <[email protected]> writes:

Jeremy> It appears to me that there is a problem with handling of type 1 Jeremy> protection information. It is considering a logical block Jeremy> reference tag of 0xffffffff to be an error, but it is actually Jeremy> valid any time ((lba & 0xffffffff) == 0xffffffff) [for example, Jeremy> 2TiB-1, 4TiB-1, 6TiB-1, etc.].

Yes, that's a bogus check. It's actually one I put in way back to debug a faulty device and forgot to back out. My DIF test tooling does not rely on the block layer generate/verify functions so I never noticed.

The same issue was reported recently by Keith Busch.

Signature · 1 line
Martin K. Petersen	Oracle Linux Engineering