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. > + 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