|
@@ -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);
|