diff options
Diffstat (limited to 'drivers/scsi/sd_dif.c')
| -rw-r--r-- | drivers/scsi/sd_dif.c | 71 | 
1 files changed, 26 insertions, 45 deletions
diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c index 0cb39ff2117..a7a691d0af7 100644 --- a/drivers/scsi/sd_dif.c +++ b/drivers/scsi/sd_dif.c @@ -93,14 +93,6 @@ static int sd_dif_type1_verify(struct blk_integrity_exchg *bix, csum_fn *fn)  		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", @@ -366,60 +358,51 @@ 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;  	struct scsi_disk *sdkp;  	struct sd_dif_tuple *sdt; -	unsigned int i, j;  	u32 phys, virt;  	sdkp = rq->bio->bi_bdev->bd_disk->private_data;  	if (sdkp->protection_type == SD_DIF_TYPE3_PROTECTION) -		return 0; +		return;  	phys = hw_sector & 0xffffffff;  	__rq_for_each_bio(bio, rq) { -		struct bio_vec *iv; +		struct bio_vec iv; +		struct bvec_iter iter; +		unsigned int j;  		/* Already remapped? */  		if (bio_flagged(bio, BIO_MAPPED_INTEGRITY))  			break; -		virt = bio->bi_integrity->bip_sector & 0xffffffff; +		virt = bio->bi_integrity->bip_iter.bi_sector & 0xffffffff; -		bip_for_each_vec(iv, bio->bi_integrity, i) { -			sdt = kmap_atomic(iv->bv_page, KM_USER0) -				+ iv->bv_offset; +		bip_for_each_vec(iv, bio->bi_integrity, iter) { +			sdt = kmap_atomic(iv.bv_page) +				+ iv.bv_offset; -			for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) { +			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++;  			} -			kunmap_atomic(sdt, KM_USER0); +			kunmap_atomic(sdt);  		} -		bio->bi_flags |= BIO_MAPPED_INTEGRITY; +		bio->bi_flags |= (1 << BIO_MAPPED_INTEGRITY);  	} - -	return 0; - -error: -	kunmap_atomic(sdt, KM_USER0); -	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;  }  /* @@ -432,7 +415,7 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)  	struct scsi_disk *sdkp;  	struct bio *bio;  	struct sd_dif_tuple *sdt; -	unsigned int i, j, sectors, sector_sz; +	unsigned int j, sectors, sector_sz;  	u32 phys, virt;  	sdkp = scsi_disk(scmd->request->rq_disk); @@ -448,25 +431,23 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)  		phys >>= 3;  	__rq_for_each_bio(bio, scmd->request) { -		struct bio_vec *iv; +		struct bio_vec iv; +		struct bvec_iter iter; -		virt = bio->bi_integrity->bip_sector & 0xffffffff; +		virt = bio->bi_integrity->bip_iter.bi_sector & 0xffffffff; -		bip_for_each_vec(iv, bio->bi_integrity, i) { -			sdt = kmap_atomic(iv->bv_page, KM_USER0) -				+ iv->bv_offset; +		bip_for_each_vec(iv, bio->bi_integrity, iter) { +			sdt = kmap_atomic(iv.bv_page) +				+ iv.bv_offset; -			for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) { +			for (j = 0; j < iv.bv_len; j += tuple_sz, sdt++) {  				if (sectors == 0) { -					kunmap_atomic(sdt, KM_USER0); +					kunmap_atomic(sdt);  					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++; @@ -474,7 +455,7 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)  				sectors--;  			} -			kunmap_atomic(sdt, KM_USER0); +			kunmap_atomic(sdt);  		}  	}  }  | 
