RDMA/core: Align write and ioctl checks of QP types
authorLeon Romanovsky <leonro@nvidia.com>
Sat, 26 Sep 2020 10:24:47 +0000 (13:24 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 29 Sep 2020 16:11:06 +0000 (13:11 -0300)
The ioctl flow checks that the user provides only a supported list of QP
types, while write flow didn't do it and relied on the driver to check
it. Align those flows to fail as early as possible.

Link: https://lore.kernel.org/r/20200926102450.2966017-8-leon@kernel.org
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/uverbs_cmd.c

index 7b8d6b3..418d133 100644 (file)
@@ -1256,8 +1256,21 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
        bool has_sq = true;
        struct ib_device *ib_dev;
 
-       if (cmd->qp_type == IB_QPT_RAW_PACKET && !capable(CAP_NET_RAW))
-               return -EPERM;
+       switch (cmd->qp_type) {
+       case IB_QPT_RAW_PACKET:
+               if (!capable(CAP_NET_RAW))
+                       return -EPERM;
+               break;
+       case IB_QPT_RC:
+       case IB_QPT_UC:
+       case IB_QPT_UD:
+       case IB_QPT_XRC_INI:
+       case IB_QPT_XRC_TGT:
+       case IB_QPT_DRIVER:
+               break;
+       default:
+               return -EINVAL;
+       }
 
        obj = (struct ib_uqp_object *)uobj_alloc(UVERBS_OBJECT_QP, attrs,
                                                 &ib_dev);