On Wed, Jan 16, 2019 at 01:59:10PM +0200, Leon Romanovsky wrote: > From: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > Implement doit callbacks > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > --- > drivers/infiniband/core/nldev.c | 112 ++++++++++++++++++++++++++++---- > include/rdma/restrack.h | 2 +- > 2 files changed, 99 insertions(+), 15 deletions(-) > > diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c > index 7f9d0be47122..14d2359199b5 100644 > --- a/drivers/infiniband/core/nldev.c > +++ b/drivers/infiniband/core/nldev.c > @@ -913,6 +913,7 @@ struct nldev_fill_res_entry { > enum rdma_nldev_attr nldev_attr; > enum rdma_nldev_command nldev_cmd; > u8 flags; > + u32 id; > }; > > enum nldev_res_flags { > @@ -941,7 +942,6 @@ static const struct nldev_fill_res_entry fill_entries[RDMA_RESTRACK_MAX] = { > .nldev_cmd = RDMA_NLDEV_CMD_RES_MR_GET, > .nldev_attr = RDMA_NLDEV_ATTR_RES_MR, > .flags = NLDEV_PER_DEV, > - > }, > [RDMA_RESTRACK_PD] = { > .fill_res_func = fill_res_pd_entry, > @@ -964,6 +964,89 @@ static bool is_visible_in_pid_ns(struct rdma_restrack_entry *res) > return task_active_pid_ns(current) == task_active_pid_ns(res->task); > } > > +static int res_get_common_doit(struct sk_buff *skb, struct nlmsghdr *nlh, > + struct netlink_ext_ack *extack, > + enum rdma_restrack_type res_type) > +{ > + const struct nldev_fill_res_entry *fe = &fill_entries[res_type]; > + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX]; > + struct rdma_restrack_entry *res; > + struct ib_device *device; > + u32 index, id, port = 0; > + bool has_cap_net_admin; > + struct sk_buff *msg; > + int ret; > + > + ret = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1, > + nldev_policy, extack); > + if (ret || !tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !fe->id || !tb[fe->id]) > + return -EINVAL; > + > + index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); > + device = ib_device_get_by_index(index); > + if (!device) > + return -EINVAL; > + > + if (tb[RDMA_NLDEV_ATTR_PORT_INDEX]) { > + port = nla_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); > + if (!rdma_is_port_valid(device, port)) { > + ret = -EINVAL; > + goto err; > + } > + } > + > + if ((port && fe->flags & NLDEV_PER_DEV) || > + (!port && ~fe->flags & NLDEV_PER_DEV)) { > + ret = -EINVAL; > + goto err; > + } > + > + id = nla_get_u32(tb[fe->id]); > + res = rdma_restrack_get_byid(device, res_type, id); > + if (IS_ERR(res)) { > + ret = PTR_ERR(res); > + goto err; > + } > + > + if (!is_visible_in_pid_ns(res)) { > + ret = -ENOENT; > + goto err_get; > + } > + > + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); > + if (!msg) { > + ret = -ENOMEM; > + goto err; > + } > + > + nlh = nlmsg_put(skb, NETLINK_CB(skb).portid, nlh->nlmsg_seq, ^^^ it should be msg. I'll resend this series. Thanks
Attachment:
signature.asc
Description: PGP signature