lkml.org 
[lkml]   [2019]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 19/24] compat_ioctl: scsi: handle HDIO commands from drivers
    Date
    The ata_sas_scsi_ioctl() function implements a number of HDIO_* commands
    for SCSI devices, it is used by all libata drivers as well as a few
    drivers that support SAS attached SATA drives.

    The only command that is not safe for compat ioctls here is
    HDIO_GET_32BIT. Change the implementation to check for in_compat_syscall()
    in order to do both cases correctly, and change all callers to use it
    as both native and compat callback pointers, including the indirect
    callers through sas_ioctl and ata_scsi_ioctl.

    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    ---
    drivers/ata/libata-scsi.c | 9 +++++++++
    drivers/scsi/aic94xx/aic94xx_init.c | 3 +++
    drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 3 +++
    drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 3 +++
    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +++
    drivers/scsi/ipr.c | 3 +++
    drivers/scsi/isci/init.c | 3 +++
    drivers/scsi/mvsas/mv_init.c | 3 +++
    drivers/scsi/pm8001/pm8001_init.c | 3 +++
    include/linux/libata.h | 6 ++++++
    10 files changed, 39 insertions(+)

    diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
    index 58e09ffe8b9c..eb2eb599e602 100644
    --- a/drivers/ata/libata-scsi.c
    +++ b/drivers/ata/libata-scsi.c
    @@ -17,6 +17,7 @@
    * - http://www.t13.org/
    */

    +#include <linux/compat.h>
    #include <linux/slab.h>
    #include <linux/kernel.h>
    #include <linux/blkdev.h>
    @@ -761,6 +762,10 @@ static int ata_ioc32(struct ata_port *ap)
    return 0;
    }

    +/*
    + * This handles both native and compat commands, so anything added
    + * here must have a compatible argument, or check in_compat_syscall()
    + */
    int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *scsidev,
    unsigned int cmd, void __user *arg)
    {
    @@ -773,6 +778,10 @@ int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *scsidev,
    spin_lock_irqsave(ap->lock, flags);
    val = ata_ioc32(ap);
    spin_unlock_irqrestore(ap->lock, flags);
    +#ifdef CONFIG_COMPAT
    + if (in_compat_syscall())
    + return put_user(val, (compat_ulong_t __user *)arg);
    +#endif
    return put_user(val, (unsigned long __user *)arg);

    case HDIO_SET_32BIT:
    diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
    index f5781e31f57c..d022407e5645 100644
    --- a/drivers/scsi/aic94xx/aic94xx_init.c
    +++ b/drivers/scsi/aic94xx/aic94xx_init.c
    @@ -54,6 +54,9 @@ static struct scsi_host_template aic94xx_sht = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .track_queue_depth = 1,
    };

    diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
    index 3af53cc42bd6..fa25766502a2 100644
    --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
    +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
    @@ -1772,6 +1772,9 @@ static struct scsi_host_template sht_v1_hw = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .shost_attrs = host_attrs_v1_hw,
    .host_reset = hisi_sas_host_reset,
    };
    diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
    index 61b1e2693b08..545eaff5f3ee 100644
    --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
    +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
    @@ -3551,6 +3551,9 @@ static struct scsi_host_template sht_v2_hw = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .shost_attrs = host_attrs_v2_hw,
    .host_reset = hisi_sas_host_reset,
    };
    diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
    index bf5d5f138437..fa05e612d85a 100644
    --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
    +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
    @@ -3075,6 +3075,9 @@ static struct scsi_host_template sht_v3_hw = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .shost_attrs = host_attrs_v3_hw,
    .tag_alloc_policy = BLK_TAG_ALLOC_RR,
    .host_reset = hisi_sas_host_reset,
    diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
    index 079c04bc448a..ae45cbe98ae2 100644
    --- a/drivers/scsi/ipr.c
    +++ b/drivers/scsi/ipr.c
    @@ -6727,6 +6727,9 @@ static struct scsi_host_template driver_template = {
    .name = "IPR",
    .info = ipr_ioa_info,
    .ioctl = ipr_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = ipr_ioctl,
    +#endif
    .queuecommand = ipr_queuecommand,
    .eh_abort_handler = ipr_eh_abort,
    .eh_device_reset_handler = ipr_eh_dev_reset,
    diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
    index 1727d0c71b12..b48aac8dfcb8 100644
    --- a/drivers/scsi/isci/init.c
    +++ b/drivers/scsi/isci/init.c
    @@ -168,6 +168,9 @@ static struct scsi_host_template isci_sht = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .shost_attrs = isci_host_attrs,
    .track_queue_depth = 1,
    };
    diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
    index da719b0694dc..7af9173c4925 100644
    --- a/drivers/scsi/mvsas/mv_init.c
    +++ b/drivers/scsi/mvsas/mv_init.c
    @@ -47,6 +47,9 @@ static struct scsi_host_template mvs_sht = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .shost_attrs = mvst_host_attrs,
    .track_queue_depth = 1,
    };
    diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
    index ff618ad80ebd..3c6076e4c6d2 100644
    --- a/drivers/scsi/pm8001/pm8001_init.c
    +++ b/drivers/scsi/pm8001/pm8001_init.c
    @@ -101,6 +101,9 @@ static struct scsi_host_template pm8001_sht = {
    .eh_target_reset_handler = sas_eh_target_reset_handler,
    .target_destroy = sas_target_destroy,
    .ioctl = sas_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = sas_ioctl,
    +#endif
    .shost_attrs = pm8001_host_attrs,
    .track_queue_depth = 1,
    };
    diff --git a/include/linux/libata.h b/include/linux/libata.h
    index d3bbfddf616a..e68d05febe5a 100644
    --- a/include/linux/libata.h
    +++ b/include/linux/libata.h
    @@ -1109,6 +1109,11 @@ extern void ata_host_init(struct ata_host *, struct device *, struct ata_port_op
    extern int ata_scsi_detect(struct scsi_host_template *sht);
    extern int ata_scsi_ioctl(struct scsi_device *dev, unsigned int cmd,
    void __user *arg);
    +#ifdef CONFIG_COMPAT
    +#define ATA_SCSI_COMPAT_IOCTL .compat_ioctl = ata_scsi_ioctl,
    +#else
    +#define ATA_SCSI_COMPAT_IOCTL /* empty */
    +#endif
    extern int ata_scsi_queuecmd(struct Scsi_Host *h, struct scsi_cmnd *cmd);
    extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,
    unsigned int cmd, void __user *arg);
    @@ -1340,6 +1345,7 @@ extern struct device_attribute *ata_common_sdev_attrs[];
    .module = THIS_MODULE, \
    .name = drv_name, \
    .ioctl = ata_scsi_ioctl, \
    + ATA_SCSI_COMPAT_IOCTL \
    .queuecommand = ata_scsi_queuecmd, \
    .can_queue = ATA_DEF_QUEUE, \
    .tag_alloc_policy = BLK_TAG_ALLOC_RR, \
    --
    2.20.0
    \
     
     \ /
      Last update: 2019-12-11 21:53    [W:4.209 / U:1.504 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site