diff options
Diffstat (limited to 'drivers/scsi/st.c')
| -rw-r--r-- | drivers/scsi/st.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 86974471af6..2a32036a940 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -4112,6 +4112,10 @@ static int st_probe(struct device *dev)  	tpnt->disk = disk;  	disk->private_data = &tpnt->driver;  	disk->queue = SDp->request_queue; +	/* SCSI tape doesn't register this gendisk via add_disk().  Manually +	 * take queue reference that release_disk() expects. */ +	if (!blk_get_queue(disk->queue)) +		goto out_put_disk;  	tpnt->driver = &st_template;  	tpnt->device = SDp; @@ -4185,7 +4189,7 @@ static int st_probe(struct device *dev)  	idr_preload_end();  	if (error < 0) {  		pr_warn("st: idr allocation failed: %d\n", error); -		goto out_put_disk; +		goto out_put_queue;  	}  	tpnt->index = error;  	sprintf(disk->disk_name, "st%d", tpnt->index); @@ -4211,6 +4215,8 @@ out_remove_devs:  	spin_lock(&st_index_lock);  	idr_remove(&st_index_idr, tpnt->index);  	spin_unlock(&st_index_lock); +out_put_queue: +	blk_put_queue(disk->queue);  out_put_disk:  	put_disk(disk);  	kfree(tpnt);  |