kernel: generic: Add kernel 4.14 support
[openwrt/openwrt.git] / target / linux / generic / hack-4.14 / 911-kobject_add_broadcast_uevent.patch
diff --git a/target/linux/generic/hack-4.14/911-kobject_add_broadcast_uevent.patch b/target/linux/generic/hack-4.14/911-kobject_add_broadcast_uevent.patch
new file mode 100644 (file)
index 0000000..abacfc3
--- /dev/null
@@ -0,0 +1,76 @@
+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[];
+@@ -224,4 +226,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
+@@ -599,6 +599,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_init(struct net *net)
+ {
+       struct uevent_sock *ue_sk;