On Tue, Sep 25, 2018 at 07:15:14PM +0300, Mark Bloch wrote: > > > On 9/25/2018 5:10 AM, Leon Romanovsky wrote: > > From: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > > > Provide an option to rename IB device name through RDMA netlink and > > limit it to users with ADMIN capability only. > > > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > --- > > drivers/infiniband/core/nldev.c | 33 +++++++++++++++++++++++++++++++++ > > include/uapi/rdma/rdma_netlink.h | 3 ++- > > 2 files changed, 35 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c > > index ba5403fbcd88..e841725a0ee0 100644 > > --- a/drivers/infiniband/core/nldev.c > > +++ b/drivers/infiniband/core/nldev.c > > @@ -646,6 +646,35 @@ static int nldev_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh, > > return err; > > } > > > > +static int nldev_set_doit(struct sk_buff *skb, struct nlmsghdr *nlh, > > + struct netlink_ext_ack *extack) > > +{ > > + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX]; > > + struct ib_device *device; > > + u32 index; > > + int err; > > + > > + err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1, nldev_policy, > > + extack); > > + if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX]) > > + 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_DEV_NAME]) { > > + char name[IB_DEVICE_NAME_MAX] = {}; > > + > > + nla_strlcpy(name, tb[RDMA_NLDEV_ATTR_DEV_NAME], > > + IB_DEVICE_NAME_MAX); > > I wonder if we want to check the length here, as we need it to be > IB_DEVICE_NAME_MAX - 1 + \0, nla_strlcpy will copy at most IB_DEVICE_NAME_MAX - 1 > which might be less than what the user passed. It is supposed to be covered by nla_policy, RDMA_NLDEV_ATTR_DEV_NAME is declared as NLA_NUL_STRING, so I think it is ok do not check size again. Thanks > > > + return ib_device_rename(device, name); > > + } > > + > > + return 0; > > +} > > + > > static int _nldev_get_dumpit(struct ib_device *device, > > struct sk_buff *skb, > > struct netlink_callback *cb, > > @@ -1078,6 +1107,10 @@ static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = { > > .doit = nldev_get_doit, > > .dump = nldev_get_dumpit, > > }, > > + [RDMA_NLDEV_CMD_SET] = { > > + .doit = nldev_set_doit, > > + .flags = RDMA_NL_ADMIN_PERM, > > + }, > > [RDMA_NLDEV_CMD_PORT_GET] = { > > .doit = nldev_port_get_doit, > > .dump = nldev_port_get_dumpit, > > diff --git a/include/uapi/rdma/rdma_netlink.h b/include/uapi/rdma/rdma_netlink.h > > index edba6351ac13..f9c41bf59efc 100644 > > --- a/include/uapi/rdma/rdma_netlink.h > > +++ b/include/uapi/rdma/rdma_netlink.h > > @@ -227,8 +227,9 @@ enum rdma_nldev_command { > > RDMA_NLDEV_CMD_UNSPEC, > > > > RDMA_NLDEV_CMD_GET, /* can dump */ > > + RDMA_NLDEV_CMD_SET, > > > > - /* 2 - 4 are free to use */ > > + /* 3 - 4 are free to use */ > > > > RDMA_NLDEV_CMD_PORT_GET = 5, /* can dump */ > > > > > > Mark