st: do not allocate a gendisk
st is a character driver and thus does not need to allocate a gendisk, which is only used for file system-like block layer I/O on block devices. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20210816131910.615153-3-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
5f432cceb3
Коммит
45938335d0
|
@ -309,13 +309,8 @@ static char * st_incompatible(struct scsi_device* SDp)
|
|||
}
|
||||
|
||||
|
||||
static inline char *tape_name(struct scsi_tape *tape)
|
||||
{
|
||||
return tape->disk->disk_name;
|
||||
}
|
||||
|
||||
#define st_printk(prefix, t, fmt, a...) \
|
||||
sdev_prefix_printk(prefix, (t)->device, tape_name(t), fmt, ##a)
|
||||
sdev_prefix_printk(prefix, (t)->device, (t)->name, fmt, ##a)
|
||||
#ifdef DEBUG
|
||||
#define DEBC_printk(t, fmt, a...) \
|
||||
if (debugging) { st_printk(ST_DEB_MSG, t, fmt, ##a ); }
|
||||
|
@ -363,7 +358,7 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
|
|||
int result = SRpnt->result;
|
||||
u8 scode;
|
||||
DEB(const char *stp;)
|
||||
char *name = tape_name(STp);
|
||||
char *name = STp->name;
|
||||
struct st_cmdstatus *cmdstatp;
|
||||
|
||||
if (!result)
|
||||
|
@ -3841,8 +3836,9 @@ static long st_ioctl_common(struct file *file, unsigned int cmd_in, void __user
|
|||
!capable(CAP_SYS_RAWIO))
|
||||
i = -EPERM;
|
||||
else
|
||||
i = scsi_cmd_ioctl(STp->disk->queue, STp->disk,
|
||||
file->f_mode, cmd_in, p);
|
||||
i = scsi_cmd_ioctl(STp->device->request_queue,
|
||||
NULL, file->f_mode, cmd_in,
|
||||
p);
|
||||
if (i != -ENOTTY)
|
||||
return i;
|
||||
break;
|
||||
|
@ -4216,7 +4212,7 @@ static int create_one_cdev(struct scsi_tape *tape, int mode, int rew)
|
|||
|
||||
i = mode << (4 - ST_NBR_MODE_BITS);
|
||||
snprintf(name, 10, "%s%s%s", rew ? "n" : "",
|
||||
tape->disk->disk_name, st_formats[i]);
|
||||
tape->name, st_formats[i]);
|
||||
|
||||
dev = device_create(&st_sysfs_class, &tape->device->sdev_gendev,
|
||||
cdev_devno, &tape->modes[mode], "%s", name);
|
||||
|
@ -4271,7 +4267,6 @@ static void remove_cdevs(struct scsi_tape *tape)
|
|||
static int st_probe(struct device *dev)
|
||||
{
|
||||
struct scsi_device *SDp = to_scsi_device(dev);
|
||||
struct gendisk *disk = NULL;
|
||||
struct scsi_tape *tpnt = NULL;
|
||||
struct st_modedef *STm;
|
||||
struct st_partstat *STps;
|
||||
|
@ -4301,27 +4296,13 @@ static int st_probe(struct device *dev)
|
|||
goto out;
|
||||
}
|
||||
|
||||
disk = alloc_disk(1);
|
||||
if (!disk) {
|
||||
sdev_printk(KERN_ERR, SDp,
|
||||
"st: out of memory. Device not attached.\n");
|
||||
goto out_buffer_free;
|
||||
}
|
||||
|
||||
tpnt = kzalloc(sizeof(struct scsi_tape), GFP_KERNEL);
|
||||
if (tpnt == NULL) {
|
||||
sdev_printk(KERN_ERR, SDp,
|
||||
"st: Can't allocate device descriptor.\n");
|
||||
goto out_put_disk;
|
||||
goto out_buffer_free;
|
||||
}
|
||||
kref_init(&tpnt->kref);
|
||||
tpnt->disk = disk;
|
||||
disk->private_data = &tpnt->driver;
|
||||
/* SCSI tape doesn't register this gendisk via add_disk(). Manually
|
||||
* take queue reference that release_disk() expects. */
|
||||
if (!blk_get_queue(SDp->request_queue))
|
||||
goto out_put_disk;
|
||||
disk->queue = SDp->request_queue;
|
||||
tpnt->driver = &st_template;
|
||||
|
||||
tpnt->device = SDp;
|
||||
|
@ -4394,10 +4375,10 @@ 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_queue;
|
||||
goto out_free_tape;
|
||||
}
|
||||
tpnt->index = error;
|
||||
sprintf(disk->disk_name, "st%d", tpnt->index);
|
||||
sprintf(tpnt->name, "st%d", tpnt->index);
|
||||
tpnt->stats = kzalloc(sizeof(struct scsi_tape_stats), GFP_KERNEL);
|
||||
if (tpnt->stats == NULL) {
|
||||
sdev_printk(KERN_ERR, SDp,
|
||||
|
@ -4414,9 +4395,9 @@ static int st_probe(struct device *dev)
|
|||
scsi_autopm_put_device(SDp);
|
||||
|
||||
sdev_printk(KERN_NOTICE, SDp,
|
||||
"Attached scsi tape %s\n", tape_name(tpnt));
|
||||
"Attached scsi tape %s\n", tpnt->name);
|
||||
sdev_printk(KERN_INFO, SDp, "%s: try direct i/o: %s (alignment %d B)\n",
|
||||
tape_name(tpnt), tpnt->try_dio ? "yes" : "no",
|
||||
tpnt->name, tpnt->try_dio ? "yes" : "no",
|
||||
queue_dma_alignment(SDp->request_queue) + 1);
|
||||
|
||||
return 0;
|
||||
|
@ -4428,10 +4409,7 @@ out_idr_remove:
|
|||
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);
|
||||
out_free_tape:
|
||||
kfree(tpnt);
|
||||
out_buffer_free:
|
||||
kfree(buffer);
|
||||
|
@ -4470,7 +4448,6 @@ static int st_remove(struct device *dev)
|
|||
static void scsi_tape_release(struct kref *kref)
|
||||
{
|
||||
struct scsi_tape *tpnt = to_scsi_tape(kref);
|
||||
struct gendisk *disk = tpnt->disk;
|
||||
|
||||
tpnt->device = NULL;
|
||||
|
||||
|
@ -4480,8 +4457,6 @@ static void scsi_tape_release(struct kref *kref)
|
|||
kfree(tpnt->buffer);
|
||||
}
|
||||
|
||||
disk->private_data = NULL;
|
||||
put_disk(disk);
|
||||
kfree(tpnt->stats);
|
||||
kfree(tpnt);
|
||||
return;
|
||||
|
|
|
@ -187,7 +187,7 @@ struct scsi_tape {
|
|||
unsigned char last_cmnd[6];
|
||||
unsigned char last_sense[16];
|
||||
#endif
|
||||
struct gendisk *disk;
|
||||
char name[DISK_NAME_LEN];
|
||||
struct kref kref;
|
||||
struct scsi_tape_stats *stats;
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче