]> www.infradead.org Git - users/hch/block.git/commitdiff
sd: consolidate compat ioctl handling
authorChristoph Hellwig <hch@lst.de>
Tue, 29 Jun 2021 06:07:51 +0000 (08:07 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 23 Jul 2021 05:06:19 +0000 (07:06 +0200)
Merge the native and compat ioctl handlers into a single one using
in_compat_syscall(), and also simplify the calling conventions
by mergin sd_ioctl_common into sd_ioctl.

Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/sd.c

index b8d55af763f92ddc62f0ca5d546dd03801a6fc1e..3fc06ccb12ccc33afbe8f8832e1d91eeb1a72fb8 100644 (file)
@@ -1529,11 +1529,11 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 }
 
 /**
- *     sd_ioctl_common - process an ioctl
+ *     sd_ioctl - process an ioctl
  *     @bdev: target block device
  *     @mode: FMODE_* mask
  *     @cmd: ioctl command number
- *     @p: this is third argument given to ioctl(2) system call.
+ *     @arg: this is third argument given to ioctl(2) system call.
  *     Often contains a pointer.
  *
  *     Returns 0 if successful (some ioctls return positive numbers on
@@ -1542,12 +1542,13 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
  *     Note: most ioctls are forward onto the block subsystem or further
  *     down in the scsi subsystem.
  **/
-static int sd_ioctl_common(struct block_device *bdev, fmode_t mode,
-                          unsigned int cmd, void __user *p)
+static int sd_ioctl(struct block_device *bdev, fmode_t mode,
+                   unsigned int cmd, unsigned long arg)
 {
        struct gendisk *disk = bdev->bd_disk;
        struct scsi_disk *sdkp = scsi_disk(disk);
        struct scsi_device *sdp = sdkp->device;
+       void __user *p = (void __user *)arg;
        int error;
     
        SCSI_LOG_IOCTL(1, sd_printk(KERN_INFO, sdkp, "sd_ioctl: disk=%s, "
@@ -1566,7 +1567,7 @@ static int sd_ioctl_common(struct block_device *bdev, fmode_t mode,
        error = scsi_ioctl_block_when_processing_errors(sdp, cmd,
                        (mode & FMODE_NDELAY) != 0);
        if (error)
-               goto out;
+               return error;
 
        if (is_sed_ioctl(cmd))
                return sed_ioctl(sdkp->opal_dev, cmd, p);
@@ -1577,16 +1578,18 @@ static int sd_ioctl_common(struct block_device *bdev, fmode_t mode,
         * resolved.
         */
        switch (cmd) {
-               case SCSI_IOCTL_GET_IDLUN:
-               case SCSI_IOCTL_GET_BUS_NUMBER:
-                       error = scsi_ioctl(sdp, cmd, p);
-                       break;
-               default:
-                       error = scsi_cmd_blk_ioctl(bdev, mode, cmd, p);
-                       break;
+       case SCSI_IOCTL_GET_IDLUN:
+       case SCSI_IOCTL_GET_BUS_NUMBER:
+               break;
+       default:
+               error = scsi_cmd_blk_ioctl(bdev, mode, cmd, p);
+               if (error != -ENOTTY)
+                       return error;
        }
-out:
-       return error;
+
+       if (in_compat_syscall())
+               return scsi_compat_ioctl(sdp, cmd, p);
+       return scsi_ioctl(sdp, cmd, p);
 }
 
 static void set_media_not_present(struct scsi_disk *sdkp)
@@ -1769,34 +1772,6 @@ static void sd_rescan(struct device *dev)
        sd_revalidate_disk(sdkp->disk);
 }
 
-static int sd_ioctl(struct block_device *bdev, fmode_t mode,
-                   unsigned int cmd, unsigned long arg)
-{
-       void __user *p = (void __user *)arg;
-       int ret;
-
-       ret = sd_ioctl_common(bdev, mode, cmd, p);
-       if (ret != -ENOTTY)
-               return ret;
-
-       return scsi_ioctl(scsi_disk(bdev->bd_disk)->device, cmd, p);
-}
-
-#ifdef CONFIG_COMPAT
-static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
-                          unsigned int cmd, unsigned long arg)
-{
-       void __user *p = compat_ptr(arg);
-       int ret;
-
-       ret = sd_ioctl_common(bdev, mode, cmd, p);
-       if (ret != -ENOTTY)
-               return ret;
-
-       return scsi_compat_ioctl(scsi_disk(bdev->bd_disk)->device, cmd, p);
-}
-#endif
-
 static char sd_pr_type(enum pr_type type)
 {
        switch (type) {
@@ -1897,9 +1872,7 @@ static const struct block_device_operations sd_fops = {
        .release                = sd_release,
        .ioctl                  = sd_ioctl,
        .getgeo                 = sd_getgeo,
-#ifdef CONFIG_COMPAT
-       .compat_ioctl           = sd_compat_ioctl,
-#endif
+       .compat_ioctl           = blkdev_compat_ptr_ioctl,
        .check_events           = sd_check_events,
        .unlock_native_capacity = sd_unlock_native_capacity,
        .report_zones           = sd_zbc_report_zones,