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:
parent
5f432cceb3
commit
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...) \
|
#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
|
#ifdef DEBUG
|
||||||
#define DEBC_printk(t, fmt, a...) \
|
#define DEBC_printk(t, fmt, a...) \
|
||||||
if (debugging) { st_printk(ST_DEB_MSG, 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;
|
int result = SRpnt->result;
|
||||||
u8 scode;
|
u8 scode;
|
||||||
DEB(const char *stp;)
|
DEB(const char *stp;)
|
||||||
char *name = tape_name(STp);
|
char *name = STp->name;
|
||||||
struct st_cmdstatus *cmdstatp;
|
struct st_cmdstatus *cmdstatp;
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
|
@ -3841,8 +3836,9 @@ static long st_ioctl_common(struct file *file, unsigned int cmd_in, void __user
|
||||||
!capable(CAP_SYS_RAWIO))
|
!capable(CAP_SYS_RAWIO))
|
||||||
i = -EPERM;
|
i = -EPERM;
|
||||||
else
|
else
|
||||||
i = scsi_cmd_ioctl(STp->disk->queue, STp->disk,
|
i = scsi_cmd_ioctl(STp->device->request_queue,
|
||||||
file->f_mode, cmd_in, p);
|
NULL, file->f_mode, cmd_in,
|
||||||
|
p);
|
||||||
if (i != -ENOTTY)
|
if (i != -ENOTTY)
|
||||||
return i;
|
return i;
|
||||||
break;
|
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);
|
i = mode << (4 - ST_NBR_MODE_BITS);
|
||||||
snprintf(name, 10, "%s%s%s", rew ? "n" : "",
|
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,
|
dev = device_create(&st_sysfs_class, &tape->device->sdev_gendev,
|
||||||
cdev_devno, &tape->modes[mode], "%s", name);
|
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)
|
static int st_probe(struct device *dev)
|
||||||
{
|
{
|
||||||
struct scsi_device *SDp = to_scsi_device(dev);
|
struct scsi_device *SDp = to_scsi_device(dev);
|
||||||
struct gendisk *disk = NULL;
|
|
||||||
struct scsi_tape *tpnt = NULL;
|
struct scsi_tape *tpnt = NULL;
|
||||||
struct st_modedef *STm;
|
struct st_modedef *STm;
|
||||||
struct st_partstat *STps;
|
struct st_partstat *STps;
|
||||||
|
@ -4301,27 +4296,13 @@ static int st_probe(struct device *dev)
|
||||||
goto out;
|
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);
|
tpnt = kzalloc(sizeof(struct scsi_tape), GFP_KERNEL);
|
||||||
if (tpnt == NULL) {
|
if (tpnt == NULL) {
|
||||||
sdev_printk(KERN_ERR, SDp,
|
sdev_printk(KERN_ERR, SDp,
|
||||||
"st: Can't allocate device descriptor.\n");
|
"st: Can't allocate device descriptor.\n");
|
||||||
goto out_put_disk;
|
goto out_buffer_free;
|
||||||
}
|
}
|
||||||
kref_init(&tpnt->kref);
|
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->driver = &st_template;
|
||||||
|
|
||||||
tpnt->device = SDp;
|
tpnt->device = SDp;
|
||||||
|
@ -4394,10 +4375,10 @@ static int st_probe(struct device *dev)
|
||||||
idr_preload_end();
|
idr_preload_end();
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
pr_warn("st: idr allocation failed: %d\n", error);
|
pr_warn("st: idr allocation failed: %d\n", error);
|
||||||
goto out_put_queue;
|
goto out_free_tape;
|
||||||
}
|
}
|
||||||
tpnt->index = error;
|
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);
|
tpnt->stats = kzalloc(sizeof(struct scsi_tape_stats), GFP_KERNEL);
|
||||||
if (tpnt->stats == NULL) {
|
if (tpnt->stats == NULL) {
|
||||||
sdev_printk(KERN_ERR, SDp,
|
sdev_printk(KERN_ERR, SDp,
|
||||||
|
@ -4414,9 +4395,9 @@ static int st_probe(struct device *dev)
|
||||||
scsi_autopm_put_device(SDp);
|
scsi_autopm_put_device(SDp);
|
||||||
|
|
||||||
sdev_printk(KERN_NOTICE, 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",
|
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);
|
queue_dma_alignment(SDp->request_queue) + 1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -4428,10 +4409,7 @@ out_idr_remove:
|
||||||
spin_lock(&st_index_lock);
|
spin_lock(&st_index_lock);
|
||||||
idr_remove(&st_index_idr, tpnt->index);
|
idr_remove(&st_index_idr, tpnt->index);
|
||||||
spin_unlock(&st_index_lock);
|
spin_unlock(&st_index_lock);
|
||||||
out_put_queue:
|
out_free_tape:
|
||||||
blk_put_queue(disk->queue);
|
|
||||||
out_put_disk:
|
|
||||||
put_disk(disk);
|
|
||||||
kfree(tpnt);
|
kfree(tpnt);
|
||||||
out_buffer_free:
|
out_buffer_free:
|
||||||
kfree(buffer);
|
kfree(buffer);
|
||||||
|
@ -4470,7 +4448,6 @@ static int st_remove(struct device *dev)
|
||||||
static void scsi_tape_release(struct kref *kref)
|
static void scsi_tape_release(struct kref *kref)
|
||||||
{
|
{
|
||||||
struct scsi_tape *tpnt = to_scsi_tape(kref);
|
struct scsi_tape *tpnt = to_scsi_tape(kref);
|
||||||
struct gendisk *disk = tpnt->disk;
|
|
||||||
|
|
||||||
tpnt->device = NULL;
|
tpnt->device = NULL;
|
||||||
|
|
||||||
|
@ -4480,8 +4457,6 @@ static void scsi_tape_release(struct kref *kref)
|
||||||
kfree(tpnt->buffer);
|
kfree(tpnt->buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
disk->private_data = NULL;
|
|
||||||
put_disk(disk);
|
|
||||||
kfree(tpnt->stats);
|
kfree(tpnt->stats);
|
||||||
kfree(tpnt);
|
kfree(tpnt);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -187,7 +187,7 @@ struct scsi_tape {
|
||||||
unsigned char last_cmnd[6];
|
unsigned char last_cmnd[6];
|
||||||
unsigned char last_sense[16];
|
unsigned char last_sense[16];
|
||||||
#endif
|
#endif
|
||||||
struct gendisk *disk;
|
char name[DISK_NAME_LEN];
|
||||||
struct kref kref;
|
struct kref kref;
|
||||||
struct scsi_tape_stats *stats;
|
struct scsi_tape_stats *stats;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue