| From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001 |
| From: Felix Fietkau <nbd@nbd.name> |
| Date: Sun, 16 Jul 2017 16:56:10 +0200 |
| Subject: lib: add uevent_next_seqnum() |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| --- |
| include/linux/kobject.h | 5 +++++ |
| lib/kobject_uevent.c | 37 +++++++++++++++++++++++++++++++++++++ |
| 2 files changed, 42 insertions(+) |
| |
| --- a/include/linux/kobject.h |
| +++ b/include/linux/kobject.h |
| @@ -32,6 +32,8 @@ |
| #define UEVENT_NUM_ENVP 32 /* number of env pointers */ |
| #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */ |
| |
| +struct sk_buff; |
| + |
| #ifdef CONFIG_UEVENT_HELPER |
| /* path to the userspace helper executed on an event */ |
| extern char uevent_helper[]; |
| @@ -245,4 +247,7 @@ int kobject_synth_uevent(struct kobject |
| __printf(2, 3) |
| int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...); |
| |
| +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, |
| + gfp_t allocation); |
| + |
| #endif /* _KOBJECT_H_ */ |
| --- a/lib/kobject_uevent.c |
| +++ b/lib/kobject_uevent.c |
| @@ -691,6 +691,43 @@ int add_uevent_var(struct kobj_uevent_en |
| EXPORT_SYMBOL_GPL(add_uevent_var); |
| |
| #if defined(CONFIG_NET) |
| +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, |
| + gfp_t allocation) |
| +{ |
| + struct uevent_sock *ue_sk; |
| + int err = 0; |
| + |
| + /* send netlink message */ |
| + mutex_lock(&uevent_sock_mutex); |
| + list_for_each_entry(ue_sk, &uevent_sock_list, list) { |
| + struct sock *uevent_sock = ue_sk->sk; |
| + struct sk_buff *skb2; |
| + |
| + skb2 = skb_clone(skb, allocation); |
| + if (!skb2) |
| + break; |
| + |
| + err = netlink_broadcast(uevent_sock, skb2, pid, group, |
| + allocation); |
| + if (err) |
| + break; |
| + } |
| + mutex_unlock(&uevent_sock_mutex); |
| + |
| + kfree_skb(skb); |
| + return err; |
| +} |
| +#else |
| +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, |
| + gfp_t allocation) |
| +{ |
| + kfree_skb(skb); |
| + return 0; |
| +} |
| +#endif |
| +EXPORT_SYMBOL_GPL(broadcast_uevent); |
| + |
| +#if defined(CONFIG_NET) |
| static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb, |
| struct netlink_ext_ack *extack) |
| { |