]> Pileus Git - ~andy/linux/blobdiff - drivers/scsi/sd_dif.c
Merge branch 'for-3.9' of git://linux-nfs.org/~bfields/linux
[~andy/linux] / drivers / scsi / sd_dif.c
index e52d5bc42bc47330d2ff9b658c6eec33a9143da5..04998f36e5071bdda94ff225f39b0ca3616eeb7b 100644 (file)
@@ -366,7 +366,8 @@ void sd_dif_config_host(struct scsi_disk *sdkp)
  *
  * Type 3 does not have a reference tag so no remapping is required.
  */
-int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_sz)
+void sd_dif_prepare(struct request *rq, sector_t hw_sector,
+                   unsigned int sector_sz)
 {
        const int tuple_sz = sizeof(struct sd_dif_tuple);
        struct bio *bio;
@@ -378,7 +379,7 @@ int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_s
        sdkp = rq->bio->bi_bdev->bd_disk->private_data;
 
        if (sdkp->protection_type == SD_DIF_TYPE3_PROTECTION)
-               return 0;
+               return;
 
        phys = hw_sector & 0xffffffff;
 
@@ -397,10 +398,9 @@ int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_s
 
                        for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
 
-                               if (be32_to_cpu(sdt->ref_tag) != virt)
-                                       goto error;
+                               if (be32_to_cpu(sdt->ref_tag) == virt)
+                                       sdt->ref_tag = cpu_to_be32(phys);
 
-                               sdt->ref_tag = cpu_to_be32(phys);
                                virt++;
                                phys++;
                        }
@@ -410,16 +410,6 @@ int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_s
 
                bio->bi_flags |= (1 << BIO_MAPPED_INTEGRITY);
        }
-
-       return 0;
-
-error:
-       kunmap_atomic(sdt);
-       sd_printk(KERN_ERR, sdkp, "%s: virt %u, phys %u, ref %u, app %4x\n",
-                 __func__, virt, phys, be32_to_cpu(sdt->ref_tag),
-                 be16_to_cpu(sdt->app_tag));
-
-       return -EILSEQ;
 }
 
 /*
@@ -463,10 +453,7 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)
                                        return;
                                }
 
-                               if (be32_to_cpu(sdt->ref_tag) != phys &&
-                                   sdt->app_tag != 0xffff)
-                                       sdt->ref_tag = 0xffffffff; /* Bad ref */
-                               else
+                               if (be32_to_cpu(sdt->ref_tag) == phys)
                                        sdt->ref_tag = cpu_to_be32(virt);
 
                                virt++;