Messages in this thread | | | Date | Fri, 7 Jul 2023 10:00:11 -0400 | From | "Liam R. Howlett" <> | Subject | Re: [PATCH v7 2/6] netlink: Add new netlink_release function |
| |
* Anjali Kulkarni <anjali.k.kulkarni@oracle.com> [691231 23:00]: > A new function netlink_release is added in netlink_sock to store the > protocol's release function. This is called when the socket is deleted. > This can be supplied by the protocol via the release function in > netlink_kernel_cfg. This is being added for the NETLINK_CONNECTOR > protocol, so it can free it's data when socket is deleted. > > Signed-off-by: Anjali Kulkarni <anjali.k.kulkarni@oracle.com>
Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
> --- > include/linux/netlink.h | 1 + > net/netlink/af_netlink.c | 6 ++++++ > net/netlink/af_netlink.h | 4 ++++ > 3 files changed, 11 insertions(+) > > diff --git a/include/linux/netlink.h b/include/linux/netlink.h > index d73cfe5b6bc2..0db4ffe6186b 100644 > --- a/include/linux/netlink.h > +++ b/include/linux/netlink.h > @@ -50,6 +50,7 @@ struct netlink_kernel_cfg { > struct mutex *cb_mutex; > int (*bind)(struct net *net, int group); > void (*unbind)(struct net *net, int group); > + void (*release) (struct sock *sk, unsigned long *groups); > }; > > struct sock *__netlink_kernel_create(struct net *net, int unit, > diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c > index e75e5156e4ac..383c10c6e6e3 100644 > --- a/net/netlink/af_netlink.c > +++ b/net/netlink/af_netlink.c > @@ -677,6 +677,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, > struct netlink_sock *nlk; > int (*bind)(struct net *net, int group); > void (*unbind)(struct net *net, int group); > + void (*release)(struct sock *sock, unsigned long *groups); > int err = 0; > > sock->state = SS_UNCONNECTED; > @@ -704,6 +705,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, > cb_mutex = nl_table[protocol].cb_mutex; > bind = nl_table[protocol].bind; > unbind = nl_table[protocol].unbind; > + release = nl_table[protocol].release; > netlink_unlock_table(); > > if (err < 0) > @@ -719,6 +721,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, > nlk->module = module; > nlk->netlink_bind = bind; > nlk->netlink_unbind = unbind; > + nlk->netlink_release = release; > out: > return err; > > @@ -763,6 +766,8 @@ static int netlink_release(struct socket *sock) > * OK. Socket is unlinked, any packets that arrive now > * will be purged. > */ > + if (nlk->netlink_release) > + nlk->netlink_release(sk, nlk->groups); > > /* must not acquire netlink_table_lock in any way again before unbind > * and notifying genetlink is done as otherwise it might deadlock > @@ -2091,6 +2096,7 @@ __netlink_kernel_create(struct net *net, int unit, struct module *module, > if (cfg) { > nl_table[unit].bind = cfg->bind; > nl_table[unit].unbind = cfg->unbind; > + nl_table[unit].release = cfg->release; > nl_table[unit].flags = cfg->flags; > } > nl_table[unit].registered = 1; > diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h > index 90a3198a9b7f..fd424cd63f31 100644 > --- a/net/netlink/af_netlink.h > +++ b/net/netlink/af_netlink.h > @@ -42,6 +42,8 @@ struct netlink_sock { > void (*netlink_rcv)(struct sk_buff *skb); > int (*netlink_bind)(struct net *net, int group); > void (*netlink_unbind)(struct net *net, int group); > + void (*netlink_release)(struct sock *sk, > + unsigned long *groups); > struct module *module; > > struct rhash_head node; > @@ -64,6 +66,8 @@ struct netlink_table { > struct module *module; > int (*bind)(struct net *net, int group); > void (*unbind)(struct net *net, int group); > + void (*release)(struct sock *sk, > + unsigned long *groups); > int registered; > }; > > -- > 2.41.0 >
| |