diff options
Diffstat (limited to 'drivers/scsi/sd.c')
| -rw-r--r-- | drivers/scsi/sd.c | 64 | 
1 files changed, 16 insertions, 48 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 6b78476d04bb..79beebf53302 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -564,10 +564,12 @@ static int sd_major(int major_idx)  	}  } -static struct scsi_disk *__scsi_disk_get(struct gendisk *disk) +static struct scsi_disk *scsi_disk_get(struct gendisk *disk)  {  	struct scsi_disk *sdkp = NULL; +	mutex_lock(&sd_ref_mutex); +  	if (disk->private_data) {  		sdkp = scsi_disk(disk);  		if (scsi_device_get(sdkp->device) == 0) @@ -575,27 +577,6 @@ static struct scsi_disk *__scsi_disk_get(struct gendisk *disk)  		else  			sdkp = NULL;  	} -	return sdkp; -} - -static struct scsi_disk *scsi_disk_get(struct gendisk *disk) -{ -	struct scsi_disk *sdkp; - -	mutex_lock(&sd_ref_mutex); -	sdkp = __scsi_disk_get(disk); -	mutex_unlock(&sd_ref_mutex); -	return sdkp; -} - -static struct scsi_disk *scsi_disk_get_from_dev(struct device *dev) -{ -	struct scsi_disk *sdkp; - -	mutex_lock(&sd_ref_mutex); -	sdkp = dev_get_drvdata(dev); -	if (sdkp) -		sdkp = __scsi_disk_get(sdkp->disk);  	mutex_unlock(&sd_ref_mutex);  	return sdkp;  } @@ -610,8 +591,6 @@ static void scsi_disk_put(struct scsi_disk *sdkp)  	mutex_unlock(&sd_ref_mutex);  } - -  static unsigned char sd_setup_protect_cmnd(struct scsi_cmnd *scmd,  					   unsigned int dix, unsigned int dif)  { @@ -1525,12 +1504,9 @@ static int sd_sync_cache(struct scsi_disk *sdkp)  static void sd_rescan(struct device *dev)  { -	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); +	struct scsi_disk *sdkp = dev_get_drvdata(dev); -	if (sdkp) { -		revalidate_disk(sdkp->disk); -		scsi_disk_put(sdkp); -	} +	revalidate_disk(sdkp->disk);  } @@ -2235,11 +2211,11 @@ got_data:  	{  		char cap_str_2[10], cap_str_10[10]; -		u64 sz = (u64)sdkp->capacity << ilog2(sector_size); -		string_get_size(sz, STRING_UNITS_2, cap_str_2, -				sizeof(cap_str_2)); -		string_get_size(sz, STRING_UNITS_10, cap_str_10, +		string_get_size(sdkp->capacity, sector_size, +				STRING_UNITS_2, cap_str_2, sizeof(cap_str_2)); +		string_get_size(sdkp->capacity, sector_size, +				STRING_UNITS_10, cap_str_10,  				sizeof(cap_str_10));  		if (sdkp->first_scan || old_capacity != sdkp->capacity) { @@ -3100,6 +3076,7 @@ static void scsi_disk_release(struct device *dev)  	ida_remove(&sd_index_ida, sdkp->index);  	spin_unlock(&sd_index_lock); +	blk_integrity_unregister(disk);  	disk->private_data = NULL;  	put_disk(disk);  	put_device(&sdkp->device->sdev_gendev); @@ -3149,13 +3126,13 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)   */  static void sd_shutdown(struct device *dev)  { -	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); +	struct scsi_disk *sdkp = dev_get_drvdata(dev);  	if (!sdkp)  		return;         /* this can happen */  	if (pm_runtime_suspended(dev)) -		goto exit; +		return;  	if (sdkp->WCE && sdkp->media_present) {  		sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); @@ -3166,14 +3143,11 @@ static void sd_shutdown(struct device *dev)  		sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");  		sd_start_stop_device(sdkp, 0);  	} - -exit: -	scsi_disk_put(sdkp);  }  static int sd_suspend_common(struct device *dev, bool ignore_stop_errors)  { -	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); +	struct scsi_disk *sdkp = dev_get_drvdata(dev);  	int ret = 0;  	if (!sdkp) @@ -3199,7 +3173,6 @@ static int sd_suspend_common(struct device *dev, bool ignore_stop_errors)  	}  done: -	scsi_disk_put(sdkp);  	return ret;  } @@ -3215,18 +3188,13 @@ static int sd_suspend_runtime(struct device *dev)  static int sd_resume(struct device *dev)  { -	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); -	int ret = 0; +	struct scsi_disk *sdkp = dev_get_drvdata(dev);  	if (!sdkp->device->manage_start_stop) -		goto done; +		return 0;  	sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); -	ret = sd_start_stop_device(sdkp, 1); - -done: -	scsi_disk_put(sdkp); -	return ret; +	return sd_start_stop_device(sdkp, 1);  }  /**  |