Merge tag 'kbuild-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[linux-2.6-microblaze.git] / drivers / scsi / sg.c
index 91e2221..8f05248 100644 (file)
@@ -166,7 +166,7 @@ typedef struct sg_device { /* holds the state of each scsi generic device */
        bool exclude;           /* 1->open(O_EXCL) succeeded and is active */
        int open_cnt;           /* count of opens (perhaps < num(sfds) ) */
        char sgdebug;           /* 0->off, 1->sense, 9->dump dev, 10-> all devs */
-       struct gendisk *disk;
+       char name[DISK_NAME_LEN];
        struct cdev * cdev;     /* char_dev [sysfs: /sys/cdev/major/sg<n>] */
        struct kref d_ref;
 } Sg_device;
@@ -202,8 +202,7 @@ static void sg_device_destroy(struct kref *kref);
 #define SZ_SG_REQ_INFO sizeof(sg_req_info_t)
 
 #define sg_printk(prefix, sdp, fmt, a...) \
-       sdev_prefix_printk(prefix, (sdp)->device,               \
-                          (sdp)->disk->disk_name, fmt, ##a)
+       sdev_prefix_printk(prefix, (sdp)->device, (sdp)->name, fmt, ##a)
 
 /*
  * The SCSI interfaces that use read() and write() as an asynchronous variant of
@@ -238,8 +237,9 @@ static int sg_allow_access(struct file *filp, unsigned char *cmd)
 
        if (sfp->parentdp->device->type == TYPE_SCANNER)
                return 0;
-
-       return blk_verify_command(cmd, filp->f_mode);
+       if (!scsi_cmd_allowed(cmd, filp->f_mode))
+               return -EPERM;
+       return 0;
 }
 
 static int
@@ -832,7 +832,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
 
        srp->rq->timeout = timeout;
        kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */
-       blk_execute_rq_nowait(sdp->disk, srp->rq, at_head, sg_rq_end_io);
+       blk_execute_rq_nowait(NULL, srp->rq, at_head, sg_rq_end_io);
        return 0;
 }
 
@@ -1108,7 +1108,7 @@ sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
        case SCSI_IOCTL_SEND_COMMAND:
                if (atomic_read(&sdp->detaching))
                        return -ENODEV;
-               return sg_scsi_ioctl(sdp->device->request_queue, NULL, filp->f_mode, p);
+               return scsi_ioctl(sdp->device, NULL, filp->f_mode, cmd_in, p);
        case SG_SET_DEBUG:
                result = get_user(val, ip);
                if (result)
@@ -1119,8 +1119,7 @@ sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
                return put_user(max_sectors_bytes(sdp->device->request_queue),
                                ip);
        case BLKTRACESETUP:
-               return blk_trace_setup(sdp->device->request_queue,
-                                      sdp->disk->disk_name,
+               return blk_trace_setup(sdp->device->request_queue, sdp->name,
                                       MKDEV(SCSI_GENERIC_MAJOR, sdp->index),
                                       NULL, p);
        case BLKTRACESTART:
@@ -1165,29 +1164,9 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
        ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
        if (ret != -ENOIOCTLCMD)
                return ret;
-
-       return scsi_ioctl(sdp->device, cmd_in, p);
+       return scsi_ioctl(sdp->device, NULL, filp->f_mode, cmd_in, p);
 }
 
-#ifdef CONFIG_COMPAT
-static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
-{
-       void __user *p = compat_ptr(arg);
-       Sg_device *sdp;
-       Sg_fd *sfp;
-       int ret;
-
-       if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
-               return -ENXIO;
-
-       ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
-       if (ret != -ENOIOCTLCMD)
-               return ret;
-
-       return scsi_compat_ioctl(sdp->device, cmd_in, p);
-}
-#endif
-
 static __poll_t
 sg_poll(struct file *filp, poll_table * wait)
 {
@@ -1441,9 +1420,7 @@ static const struct file_operations sg_fops = {
        .write = sg_write,
        .poll = sg_poll,
        .unlocked_ioctl = sg_ioctl,
-#ifdef CONFIG_COMPAT
-       .compat_ioctl = sg_compat_ioctl,
-#endif
+       .compat_ioctl = compat_ptr_ioctl,
        .open = sg_open,
        .mmap = sg_mmap,
        .release = sg_release,
@@ -1456,7 +1433,7 @@ static struct class *sg_sysfs_class;
 static int sg_sysfs_valid = 0;
 
 static Sg_device *
-sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
+sg_alloc(struct scsi_device *scsidp)
 {
        struct request_queue *q = scsidp->request_queue;
        Sg_device *sdp;
@@ -1492,9 +1469,7 @@ sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
 
        SCSI_LOG_TIMEOUT(3, sdev_printk(KERN_INFO, scsidp,
                                        "sg_alloc: dev=%d \n", k));
-       sprintf(disk->disk_name, "sg%d", k);
-       disk->first_minor = k;
-       sdp->disk = disk;
+       sprintf(sdp->name, "sg%d", k);
        sdp->device = scsidp;
        mutex_init(&sdp->open_rel_lock);
        INIT_LIST_HEAD(&sdp->sfds);
@@ -1521,19 +1496,11 @@ static int
 sg_add_device(struct device *cl_dev, struct class_interface *cl_intf)
 {
        struct scsi_device *scsidp = to_scsi_device(cl_dev->parent);
-       struct gendisk *disk;
        Sg_device *sdp = NULL;
        struct cdev * cdev = NULL;
        int error;
        unsigned long iflags;
 
-       disk = alloc_disk(1);
-       if (!disk) {
-               pr_warn("%s: alloc_disk failed\n", __func__);
-               return -ENOMEM;
-       }
-       disk->major = SCSI_GENERIC_MAJOR;
-
        error = -ENOMEM;
        cdev = cdev_alloc();
        if (!cdev) {
@@ -1543,7 +1510,7 @@ sg_add_device(struct device *cl_dev, struct class_interface *cl_intf)
        cdev->owner = THIS_MODULE;
        cdev->ops = &sg_fops;
 
-       sdp = sg_alloc(disk, scsidp);
+       sdp = sg_alloc(scsidp);
        if (IS_ERR(sdp)) {
                pr_warn("%s: sg_alloc failed\n", __func__);
                error = PTR_ERR(sdp);
@@ -1561,7 +1528,7 @@ sg_add_device(struct device *cl_dev, struct class_interface *cl_intf)
                sg_class_member = device_create(sg_sysfs_class, cl_dev->parent,
                                                MKDEV(SCSI_GENERIC_MAJOR,
                                                      sdp->index),
-                                               sdp, "%s", disk->disk_name);
+                                               sdp, "%s", sdp->name);
                if (IS_ERR(sg_class_member)) {
                        pr_err("%s: device_create failed\n", __func__);
                        error = PTR_ERR(sg_class_member);
@@ -1589,7 +1556,6 @@ cdev_add_err:
        kfree(sdp);
 
 out:
-       put_disk(disk);
        if (cdev)
                cdev_del(cdev);
        return error;
@@ -1613,7 +1579,6 @@ sg_device_destroy(struct kref *kref)
        SCSI_LOG_TIMEOUT(3,
                sg_printk(KERN_INFO, sdp, "sg_device_destroy\n"));
 
-       put_disk(sdp->disk);
        kfree(sdp);
 }
 
@@ -2606,7 +2571,7 @@ static int sg_proc_seq_show_debug(struct seq_file *s, void *v)
                goto skip;
        read_lock(&sdp->sfd_lock);
        if (!list_empty(&sdp->sfds)) {
-               seq_printf(s, " >>> device=%s ", sdp->disk->disk_name);
+               seq_printf(s, " >>> device=%s ", sdp->name);
                if (atomic_read(&sdp->detaching))
                        seq_puts(s, "detaching pending close ");
                else if (sdp->device) {