IB/uverbs: Add an ib_uobject getter to ioctl() infrastructure
authorMatan Barak <matanb@mellanox.com>
Thu, 31 May 2018 13:43:28 +0000 (16:43 +0300)
committerLeon Romanovsky <leonro@mellanox.com>
Sat, 2 Jun 2018 04:33:53 +0000 (07:33 +0300)
Previously, the user had to dig inside the attribute to get the uobject.
Add a helper function that correctly extract it (and do the required
checks) for him/her.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/uverbs_std_types_cq.c
drivers/infiniband/core/uverbs_std_types_flow_action.c
include/rdma/uverbs_ioctl.h

index b0dbae9..3d293d0 100644 (file)
@@ -65,7 +65,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev,
        struct ib_cq_init_attr attr = {};
        struct ib_cq                   *cq;
        struct ib_uverbs_completion_event_file    *ev_file = NULL;
-       const struct uverbs_attr *ev_file_attr;
        struct ib_uobject *ev_file_uobj;
 
        if (!(ib_dev->uverbs_cmd_mask & 1ULL << IB_USER_VERBS_CMD_CREATE_CQ))
@@ -87,10 +86,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev,
                                                UVERBS_ATTR_CREATE_CQ_FLAGS)))
                return -EFAULT;
 
-       ev_file_attr = uverbs_attr_get(attrs, UVERBS_ATTR_CREATE_CQ_COMP_CHANNEL);
-       if (!IS_ERR(ev_file_attr)) {
-               ev_file_uobj = ev_file_attr->obj_attr.uobject;
-
+       ev_file_uobj = uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_CQ_COMP_CHANNEL);
+       if (!IS_ERR(ev_file_uobj)) {
                ev_file = container_of(ev_file_uobj,
                                       struct ib_uverbs_completion_event_file,
                                       uobj_file.uobj);
@@ -102,8 +99,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev,
                goto err_event_file;
        }
 
-       obj = container_of(uverbs_attr_get(attrs,
-                                          UVERBS_ATTR_CREATE_CQ_HANDLE)->obj_attr.uobject,
+       obj = container_of(uverbs_attr_get_uobject(attrs,
+                                                  UVERBS_ATTR_CREATE_CQ_HANDLE),
                           typeof(*obj), uobject);
        obj->uverbs_file           = ucontext->ufile;
        obj->comp_events_reported  = 0;
@@ -170,13 +167,17 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(struct ib_device *ib_dev,
                                                    struct ib_uverbs_file *file,
                                                    struct uverbs_attr_bundle *attrs)
 {
-       struct ib_uverbs_destroy_cq_resp resp;
        struct ib_uobject *uobj =
-               uverbs_attr_get(attrs, UVERBS_ATTR_DESTROY_CQ_HANDLE)->obj_attr.uobject;
-       struct ib_ucq_object *obj = container_of(uobj, struct ib_ucq_object,
-                                                uobject);
+               uverbs_attr_get_uobject(attrs, UVERBS_ATTR_DESTROY_CQ_HANDLE);
+       struct ib_uverbs_destroy_cq_resp resp;
+       struct ib_ucq_object *obj;
        int ret;
 
+       if (IS_ERR(uobj))
+               return PTR_ERR(uobj);
+
+       obj = container_of(uobj, struct ib_ucq_object, uobject);
+
        if (!(ib_dev->uverbs_cmd_mask & 1ULL << IB_USER_VERBS_CMD_DESTROY_CQ))
                return -EOPNOTSUPP;
 
index cbcec3d..00e6b34 100644 (file)
@@ -320,7 +320,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE)(struct ib_device
                return ret;
 
        /* No need to check as this attribute is marked as MANDATORY */
-       uobj = uverbs_attr_get(attrs, UVERBS_ATTR_FLOW_ACTION_ESP_HANDLE)->obj_attr.uobject;
+       uobj = uverbs_attr_get_uobject(attrs, UVERBS_ATTR_FLOW_ACTION_ESP_HANDLE);
        action = ib_dev->create_flow_action_esp(ib_dev, &esp_attr.hdr, attrs);
        if (IS_ERR(action))
                return PTR_ERR(action);
@@ -350,7 +350,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY)(struct ib_device
        if (ret)
                return ret;
 
-       uobj = uverbs_attr_get(attrs, UVERBS_ATTR_FLOW_ACTION_ESP_HANDLE)->obj_attr.uobject;
+       uobj = uverbs_attr_get_uobject(attrs, UVERBS_ATTR_FLOW_ACTION_ESP_HANDLE);
        action = uobj->object;
 
        if (action->type != IB_FLOW_ACTION_ESP)
index 4a4201d..7ac6271 100644 (file)
@@ -420,6 +420,17 @@ static inline void *uverbs_attr_get_obj(const struct uverbs_attr_bundle *attrs_b
        return uobj->object;
 }
 
+static inline struct ib_uobject *uverbs_attr_get_uobject(const struct uverbs_attr_bundle *attrs_bundle,
+                                                        u16 idx)
+{
+       const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
+
+       if (IS_ERR(attr))
+               return ERR_CAST(attr);
+
+       return attr->obj_attr.uobject;
+}
+
 static inline int uverbs_copy_to(const struct uverbs_attr_bundle *attrs_bundle,
                                 size_t idx, const void *from, size_t size)
 {