Skip to content

Commit 3d9a1f5

Browse files
Christoph HellwigJames Bottomley
Christoph Hellwig
authored and
James Bottomley
committed
sd: don't grab a device references from driver methods
The device model already takes care of races between ->remove and ->shutdown vs its other methods, and we now take care about locking them out for ->rescan as well. This is a partial revert of commit 39b7f1 ("[SCSI] sd: Fix refcounting"). Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: James Bottomley <[email protected]>
1 parent e27829d commit 3d9a1f5

File tree

1 file changed

+11
-44
lines changed

1 file changed

+11
-44
lines changed

drivers/scsi/sd.c

+11-44
Original file line numberDiff line numberDiff line change
@@ -564,38 +564,19 @@ static int sd_major(int major_idx)
564564
}
565565
}
566566

567-
static struct scsi_disk *__scsi_disk_get(struct gendisk *disk)
567+
static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
568568
{
569569
struct scsi_disk *sdkp = NULL;
570570

571+
mutex_lock(&sd_ref_mutex);
572+
571573
if (disk->private_data) {
572574
sdkp = scsi_disk(disk);
573575
if (scsi_device_get(sdkp->device) == 0)
574576
get_device(&sdkp->dev);
575577
else
576578
sdkp = NULL;
577579
}
578-
return sdkp;
579-
}
580-
581-
static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
582-
{
583-
struct scsi_disk *sdkp;
584-
585-
mutex_lock(&sd_ref_mutex);
586-
sdkp = __scsi_disk_get(disk);
587-
mutex_unlock(&sd_ref_mutex);
588-
return sdkp;
589-
}
590-
591-
static struct scsi_disk *scsi_disk_get_from_dev(struct device *dev)
592-
{
593-
struct scsi_disk *sdkp;
594-
595-
mutex_lock(&sd_ref_mutex);
596-
sdkp = dev_get_drvdata(dev);
597-
if (sdkp)
598-
sdkp = __scsi_disk_get(sdkp->disk);
599580
mutex_unlock(&sd_ref_mutex);
600581
return sdkp;
601582
}
@@ -610,8 +591,6 @@ static void scsi_disk_put(struct scsi_disk *sdkp)
610591
mutex_unlock(&sd_ref_mutex);
611592
}
612593

613-
614-
615594
static unsigned char sd_setup_protect_cmnd(struct scsi_cmnd *scmd,
616595
unsigned int dix, unsigned int dif)
617596
{
@@ -1525,12 +1504,9 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
15251504

15261505
static void sd_rescan(struct device *dev)
15271506
{
1528-
struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
1507+
struct scsi_disk *sdkp = dev_get_drvdata(dev);
15291508

1530-
if (sdkp) {
1531-
revalidate_disk(sdkp->disk);
1532-
scsi_disk_put(sdkp);
1533-
}
1509+
revalidate_disk(sdkp->disk);
15341510
}
15351511

15361512

@@ -3149,13 +3125,13 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
31493125
*/
31503126
static void sd_shutdown(struct device *dev)
31513127
{
3152-
struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
3128+
struct scsi_disk *sdkp = dev_get_drvdata(dev);
31533129

31543130
if (!sdkp)
31553131
return; /* this can happen */
31563132

31573133
if (pm_runtime_suspended(dev))
3158-
goto exit;
3134+
return;
31593135

31603136
if (sdkp->WCE && sdkp->media_present) {
31613137
sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n");
@@ -3166,14 +3142,11 @@ static void sd_shutdown(struct device *dev)
31663142
sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");
31673143
sd_start_stop_device(sdkp, 0);
31683144
}
3169-
3170-
exit:
3171-
scsi_disk_put(sdkp);
31723145
}
31733146

31743147
static int sd_suspend_common(struct device *dev, bool ignore_stop_errors)
31753148
{
3176-
struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
3149+
struct scsi_disk *sdkp = dev_get_drvdata(dev);
31773150
int ret = 0;
31783151

31793152
if (!sdkp)
@@ -3199,7 +3172,6 @@ static int sd_suspend_common(struct device *dev, bool ignore_stop_errors)
31993172
}
32003173

32013174
done:
3202-
scsi_disk_put(sdkp);
32033175
return ret;
32043176
}
32053177

@@ -3215,18 +3187,13 @@ static int sd_suspend_runtime(struct device *dev)
32153187

32163188
static int sd_resume(struct device *dev)
32173189
{
3218-
struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
3219-
int ret = 0;
3190+
struct scsi_disk *sdkp = dev_get_drvdata(dev);
32203191

32213192
if (!sdkp->device->manage_start_stop)
3222-
goto done;
3193+
return 0;
32233194

32243195
sd_printk(KERN_NOTICE, sdkp, "Starting disk\n");
3225-
ret = sd_start_stop_device(sdkp, 1);
3226-
3227-
done:
3228-
scsi_disk_put(sdkp);
3229-
return ret;
3196+
return sd_start_stop_device(sdkp, 1);
32303197
}
32313198

32323199
/**

0 commit comments

Comments
 (0)