mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-16 07:07:44 +07:00
netlink: Pass extack to dump handlers
Declare extack in netlink_dump and pass to dump handlers via netlink_callback. Add any extack message after the dump_done_errno allowing error messages to be returned. This will be useful when strict checking is done on dump requests, returning why the dump fails EINVAL. Signed-off-by: David Ahern <dsahern@gmail.com> Acked-by: Christian Brauner <christian@brauner.io> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
272a66173b
commit
4a19edb60d
@ -176,6 +176,7 @@ struct netlink_callback {
|
|||||||
void *data;
|
void *data;
|
||||||
/* the module that dump function belong to */
|
/* the module that dump function belong to */
|
||||||
struct module *module;
|
struct module *module;
|
||||||
|
struct netlink_ext_ack *extack;
|
||||||
u16 family;
|
u16 family;
|
||||||
u16 min_dump_alloc;
|
u16 min_dump_alloc;
|
||||||
unsigned int prev_seq, seq;
|
unsigned int prev_seq, seq;
|
||||||
|
@ -2171,6 +2171,7 @@ EXPORT_SYMBOL(__nlmsg_put);
|
|||||||
static int netlink_dump(struct sock *sk)
|
static int netlink_dump(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct netlink_sock *nlk = nlk_sk(sk);
|
struct netlink_sock *nlk = nlk_sk(sk);
|
||||||
|
struct netlink_ext_ack extack = {};
|
||||||
struct netlink_callback *cb;
|
struct netlink_callback *cb;
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb = NULL;
|
||||||
struct nlmsghdr *nlh;
|
struct nlmsghdr *nlh;
|
||||||
@ -2222,8 +2223,11 @@ static int netlink_dump(struct sock *sk)
|
|||||||
skb_reserve(skb, skb_tailroom(skb) - alloc_size);
|
skb_reserve(skb, skb_tailroom(skb) - alloc_size);
|
||||||
netlink_skb_set_owner_r(skb, sk);
|
netlink_skb_set_owner_r(skb, sk);
|
||||||
|
|
||||||
if (nlk->dump_done_errno > 0)
|
if (nlk->dump_done_errno > 0) {
|
||||||
|
cb->extack = &extack;
|
||||||
nlk->dump_done_errno = cb->dump(skb, cb);
|
nlk->dump_done_errno = cb->dump(skb, cb);
|
||||||
|
cb->extack = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (nlk->dump_done_errno > 0 ||
|
if (nlk->dump_done_errno > 0 ||
|
||||||
skb_tailroom(skb) < nlmsg_total_size(sizeof(nlk->dump_done_errno))) {
|
skb_tailroom(skb) < nlmsg_total_size(sizeof(nlk->dump_done_errno))) {
|
||||||
@ -2246,6 +2250,12 @@ static int netlink_dump(struct sock *sk)
|
|||||||
memcpy(nlmsg_data(nlh), &nlk->dump_done_errno,
|
memcpy(nlmsg_data(nlh), &nlk->dump_done_errno,
|
||||||
sizeof(nlk->dump_done_errno));
|
sizeof(nlk->dump_done_errno));
|
||||||
|
|
||||||
|
if (extack._msg && nlk->flags & NETLINK_F_EXT_ACK) {
|
||||||
|
nlh->nlmsg_flags |= NLM_F_ACK_TLVS;
|
||||||
|
if (!nla_put_string(skb, NLMSGERR_ATTR_MSG, extack._msg))
|
||||||
|
nlmsg_end(skb, nlh);
|
||||||
|
}
|
||||||
|
|
||||||
if (sk_filter(sk, skb))
|
if (sk_filter(sk, skb))
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user