]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: sd: enable compat ioctls for sed-opal
authorArnd Bergmann <arnd@arndb.de>
Fri, 15 Mar 2019 12:46:11 +0000 (13:46 +0100)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 14 Feb 2020 05:29:37 +0000 (00:29 -0500)
BugLink: https://bugs.launchpad.net/bugs/1861934
commit 142b2ac82e31c174936c5719fa12ae28f51a55b7 upstream.

The sed_ioctl() function is written to be compatible between
32-bit and 64-bit processes, however compat mode is only
wired up for nvme, not for sd.

Add the missing call to sed_ioctl() in sd_compat_ioctl().

Fixes: d80210f25ff0 ("sd: add support for TCG OPAL self encrypting disks")
Cc: linux-scsi@vger.kernel.org
Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/scsi/sd.c

index 9f0bae378e5926d6241a37d847d8a31956213c01..8a951598d633fae1bd570b19a09d939d599a4a7b 100644 (file)
@@ -1717,20 +1717,30 @@ static void sd_rescan(struct device *dev)
 static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
                           unsigned int cmd, unsigned long arg)
 {
-       struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device;
+       struct gendisk *disk = bdev->bd_disk;
+       struct scsi_disk *sdkp = scsi_disk(disk);
+       struct scsi_device *sdev = sdkp->device;
+       void __user *p = compat_ptr(arg);
        int error;
 
+       error = scsi_verify_blk_ioctl(bdev, cmd);
+       if (error < 0)
+               return error;
+
        error = scsi_ioctl_block_when_processing_errors(sdev, cmd,
                        (mode & FMODE_NDELAY) != 0);
        if (error)
                return error;
+
+       if (is_sed_ioctl(cmd))
+               return sed_ioctl(sdkp->opal_dev, cmd, p);
               
        /* 
         * Let the static ioctl translation table take care of it.
         */
        if (!sdev->host->hostt->compat_ioctl)
                return -ENOIOCTLCMD; 
-       return sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
+       return sdev->host->hostt->compat_ioctl(sdev, cmd, p);
 }
 #endif