On 9/25/2018 9:51 AM, Leon Romanovsky wrote: > 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 Right, brain fart! sorry for the noise :) Mark > >> >>> + 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