diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/libfc/fc_disc.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sd_zbc.c | 7 | ||||
| -rw-r--r-- | drivers/scsi/sr.c | 2 | 
3 files changed, 9 insertions, 2 deletions
| diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c index 9c5f7c9178c6..2b865c6423e2 100644 --- a/drivers/scsi/libfc/fc_disc.c +++ b/drivers/scsi/libfc/fc_disc.c @@ -628,6 +628,8 @@ redisc:  	}  out:  	kref_put(&rdata->kref, fc_rport_destroy); +	if (!IS_ERR(fp)) +		fc_frame_free(fp);  }  /** diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c index e4282bce5834..f45c22b09726 100644 --- a/drivers/scsi/sd_zbc.c +++ b/drivers/scsi/sd_zbc.c @@ -161,6 +161,7 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,  			unsigned int nr_zones, report_zones_cb cb, void *data)  {  	struct scsi_disk *sdkp = scsi_disk(disk); +	sector_t capacity = logical_to_sectors(sdkp->device, sdkp->capacity);  	unsigned int nr, i;  	unsigned char *buf;  	size_t offset, buflen = 0; @@ -171,11 +172,15 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,  		/* Not a zoned device */  		return -EOPNOTSUPP; +	if (!capacity) +		/* Device gone or invalid */ +		return -ENODEV; +  	buf = sd_zbc_alloc_report_buffer(sdkp, nr_zones, &buflen);  	if (!buf)  		return -ENOMEM; -	while (zone_idx < nr_zones && sector < get_capacity(disk)) { +	while (zone_idx < nr_zones && sector < capacity) {  		ret = sd_zbc_do_report_zones(sdkp, buf, buflen,  				sectors_to_logical(sdkp->device, sector), true);  		if (ret) diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 0fbb8fe6e521..e4240e4ae8bb 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -688,7 +688,7 @@ static const struct block_device_operations sr_bdops =  	.release	= sr_block_release,  	.ioctl		= sr_block_ioctl,  #ifdef CONFIG_COMPAT -	.ioctl		= sr_block_compat_ioctl, +	.compat_ioctl	= sr_block_compat_ioctl,  #endif  	.check_events	= sr_block_check_events,  	.revalidate_disk = sr_block_revalidate_disk, |