OSDN Git Service

RDMA/nldev: Allow IB device rename through RDMA netlink
authorLeon Romanovsky <leonro@mellanox.com>
Wed, 10 Oct 2018 06:19:12 +0000 (09:19 +0300)
committerDoug Ledford <dledford@redhat.com>
Tue, 16 Oct 2018 17:37:16 +0000 (13:37 -0400)
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@mellanox.com>
Reviewed-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/nldev.c
include/uapi/rdma/rdma_netlink.h

index ba5403f..573399e 100644 (file)
@@ -646,6 +646,36 @@ err:
        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);
+               err = ib_device_rename(device, name);
+       }
+
+       put_device(&device->dev);
+       return err;
+}
+
 static int _nldev_get_dumpit(struct ib_device *device,
                             struct sk_buff *skb,
                             struct netlink_callback *cb,
@@ -1078,6 +1108,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,
index edba635..f9c41bf 100644 (file)
@@ -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 */