diff options
Diffstat (limited to 'drivers/scsi/sd.c')
| -rw-r--r-- | drivers/scsi/sd.c | 17 | 
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 428c03ef02b2..60bff78e9ead 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1398,11 +1398,15 @@ static int media_not_present(struct scsi_disk *sdkp,   **/  static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)  { -	struct scsi_disk *sdkp = scsi_disk(disk); -	struct scsi_device *sdp = sdkp->device; +	struct scsi_disk *sdkp = scsi_disk_get(disk); +	struct scsi_device *sdp;  	struct scsi_sense_hdr *sshdr = NULL;  	int retval; +	if (!sdkp) +		return 0; + +	sdp = sdkp->device;  	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n"));  	/* @@ -1459,6 +1463,7 @@ out:  	kfree(sshdr);  	retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0;  	sdp->changed = 0; +	scsi_disk_put(sdkp);  	return retval;  } @@ -2862,10 +2867,10 @@ static int sd_revalidate_disk(struct gendisk *disk)  	if (sdkp->opt_xfer_blocks &&  	    sdkp->opt_xfer_blocks <= dev_max &&  	    sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS && -	    sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_SIZE) -		rw_max = q->limits.io_opt = -			sdkp->opt_xfer_blocks * sdp->sector_size; -	else +	    logical_to_bytes(sdp, sdkp->opt_xfer_blocks) >= PAGE_SIZE) { +		q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); +		rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); +	} else  		rw_max = BLK_DEF_MAX_SECTORS;  	/* Combine with controller limits */  |