diff options
Diffstat (limited to 'drivers/scsi/sd_zbc.c')
| -rw-r--r-- | drivers/scsi/sd_zbc.c | 7 | 
1 files changed, 6 insertions, 1 deletions
| 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) |