aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/netlink.c
diff options
context:
space:
mode:
authorLeon Romanovsky <leonro@mellanox.com>2017-06-15 12:46:33 +0300
committerLeon Romanovsky <leon@kernel.org>2017-08-10 13:21:55 +0300
commit1830ba21b9a475cfc6159e6cfe532c75fe7682a4 (patch)
tree9ef08711eecc814a53b2bc2ebf6f7b212183ac05 /drivers/infiniband/core/netlink.c
parentRDMA/core: Add and expose static device index (diff)
downloadlinux-dev-1830ba21b9a475cfc6159e6cfe532c75fe7682a4.tar.xz
linux-dev-1830ba21b9a475cfc6159e6cfe532c75fe7682a4.zip
RDMA/netlink: Add and implement doit netlink callback
The .doit callback is used by netlink core to differentiate between get and set operations. Common convention is to use that call for command operations like (SET, ADD, e.t.c.) and/or access without NLF_M_DUMP flag. This commit adds proper declaration and implementation to RDMA netlink. Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Diffstat (limited to 'drivers/infiniband/core/netlink.c')
-rw-r--r--drivers/infiniband/core/netlink.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c
index a7082adae16b..484d6a8a2811 100644
--- a/drivers/infiniband/core/netlink.c
+++ b/drivers/infiniband/core/netlink.c
@@ -76,9 +76,13 @@ static bool is_nl_msg_valid(unsigned int type, unsigned int op)
static bool is_nl_valid(unsigned int type, unsigned int op)
{
- if (!is_nl_msg_valid(type, op) ||
- !rdma_nl_types[type].cb_table ||
- !rdma_nl_types[type].cb_table[op].dump)
+ const struct rdma_nl_cbs *cb_table;
+
+ if (!is_nl_msg_valid(type, op))
+ return false;
+
+ cb_table = rdma_nl_types[type].cb_table;
+ if (!cb_table || (!cb_table[op].dump && !cb_table[op].doit))
return false;
return true;
}
@@ -151,6 +155,7 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
unsigned int op = RDMA_NL_GET_OP(type);
struct netlink_callback cb = {};
struct netlink_dump_control c = {};
+ int ret;
if (!is_nl_valid(index, op))
return -EINVAL;
@@ -169,10 +174,14 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
cb.nlh = nlh;
cb.dump = rdma_nl_types[index].cb_table[op].dump;
return cb.dump(skb, &cb);
+ } else {
+ c.dump = rdma_nl_types[index].cb_table[op].dump;
+ return netlink_dump_start(nls, skb, nlh, &c);
}
+ if (rdma_nl_types[index].cb_table[op].doit)
+ ret = rdma_nl_types[index].cb_table[op].doit(skb, nlh, extack);
+ return ret;
- c.dump = rdma_nl_types[index].cb_table[op].dump;
- return netlink_dump_start(nls, skb, nlh, &c);
}
/*