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;
}
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;
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);
}
/*
#include <uapi/rdma/rdma_netlink.h>
struct rdma_nl_cbs {
+ int (*doit)(struct sk_buff *skb, struct nlmsghdr *nlh,
+ struct netlink_ext_ack *extack);
int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb);
u8 flags;
};