From 6c1d3b0a79b659e47f8f826f0bc5f197706e949c Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
Date: Tue, 31 Aug 2010 20:06:25 +0000
Subject: [PATCH] generic: introduce broadcast_uevent function

SVN-Revision: 22858
---
 .../223-kobject-add-broadcast_uevent.patch    | 69 +++++++++++++++
 .../223-kobject-add-broadcast_uevent.patch    | 69 +++++++++++++++
 .../223-kobject-add-broadcast_uevent.patch    | 69 +++++++++++++++
 .../223-kobject-add-broadcast_uevent.patch    | 85 +++++++++++++++++++
 .../223-kobject-add-broadcast_uevent.patch    | 85 +++++++++++++++++++
 5 files changed, 377 insertions(+)
 create mode 100644 target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch
 create mode 100644 target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch
 create mode 100644 target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch
 create mode 100644 target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch
 create mode 100644 target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch

diff --git a/target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch
new file mode 100644
index 0000000000..393668b8af
--- /dev/null
+++ b/target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch
@@ -0,0 +1,69 @@
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -30,6 +30,8 @@
+ #define UEVENT_NUM_ENVP			32	/* number of env pointers */
+ #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
+ 
++struct sk_buff;
++
+ /* path to the userspace helper executed on an event */
+ extern char uevent_helper[];
+ 
+@@ -208,6 +210,10 @@ int add_uevent_var(struct kobj_uevent_en
+ 
+ int kobject_action_type(const char *buf, size_t count,
+ 			enum kobject_action *type);
++
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     gfp_t allocation);
++
+ #else
+ static inline int kobject_uevent(struct kobject *kobj,
+ 				 enum kobject_action action)
+@@ -224,6 +230,16 @@ static inline int add_uevent_var(struct 
+ static inline int kobject_action_type(const char *buf, size_t count,
+ 				      enum kobject_action *type)
+ { return -EINVAL; }
++
++void kfree_skb(struct sk_buff *);
++
++static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++				   gfp_t allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++
+ #endif
+ 
+ #endif /* _KOBJECT_H_ */
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -330,6 +330,27 @@ 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)
++{
++	if (!uevent_sock) {
++		kfree_skb(skb);
++		return -ENODEV;
++	}
++
++	return netlink_broadcast(uevent_sock, skb, pid, group, allocation);;
++}
++#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 __init kobject_uevent_init(void)
+ {
+ 	uevent_sock = netlink_kernel_create(&init_net, NETLINK_KOBJECT_UEVENT,
diff --git a/target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch
new file mode 100644
index 0000000000..f1b6a8fce8
--- /dev/null
+++ b/target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch
@@ -0,0 +1,69 @@
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -30,6 +30,8 @@
+ #define UEVENT_NUM_ENVP			32	/* number of env pointers */
+ #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
+ 
++struct sk_buff;
++
+ /* path to the userspace helper executed on an event */
+ extern char uevent_helper[];
+ 
+@@ -208,6 +210,10 @@ int add_uevent_var(struct kobj_uevent_en
+ 
+ int kobject_action_type(const char *buf, size_t count,
+ 			enum kobject_action *type);
++
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     int allocation);
++
+ #else
+ static inline int kobject_uevent(struct kobject *kobj,
+ 				 enum kobject_action action)
+@@ -224,6 +230,16 @@ static inline int add_uevent_var(struct 
+ static inline int kobject_action_type(const char *buf, size_t count,
+ 				      enum kobject_action *type)
+ { return -EINVAL; }
++
++void kfree_skb(struct sk_buff *);
++
++static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++				   int allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++
+ #endif
+ 
+ #endif /* _KOBJECT_H_ */
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -330,6 +330,27 @@ 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,
++		     int allocation)
++{
++	if (!uevent_sock) {
++		kfree_skb(skb);
++		return -ENODEV;
++	}
++
++	return netlink_broadcast(uevent_sock, skb, pid, group, allocation);;
++}
++#else
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     int allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++#endif
++EXPORT_SYMBOL_GPL(broadcast_uevent);
++
++#if defined(CONFIG_NET)
+ static int __init kobject_uevent_init(void)
+ {
+ 	uevent_sock = netlink_kernel_create(&init_net, NETLINK_KOBJECT_UEVENT,
diff --git a/target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch
new file mode 100644
index 0000000000..d851d313ee
--- /dev/null
+++ b/target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch
@@ -0,0 +1,69 @@
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -30,6 +30,8 @@
+ #define UEVENT_NUM_ENVP			32	/* number of env pointers */
+ #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
+ 
++struct sk_buff;
++
+ /* path to the userspace helper executed on an event */
+ extern char uevent_helper[];
+ 
+@@ -208,6 +210,10 @@ int add_uevent_var(struct kobj_uevent_en
+ 
+ int kobject_action_type(const char *buf, size_t count,
+ 			enum kobject_action *type);
++
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     int allocation);
++
+ #else
+ static inline int kobject_uevent(struct kobject *kobj,
+ 				 enum kobject_action action)
+@@ -224,6 +230,16 @@ static inline int add_uevent_var(struct 
+ static inline int kobject_action_type(const char *buf, size_t count,
+ 				      enum kobject_action *type)
+ { return -EINVAL; }
++
++void kfree_skb(struct sk_buff *);
++
++static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++				   int allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++
+ #endif
+ 
+ #endif /* _KOBJECT_H_ */
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -331,6 +331,27 @@ 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,
++		     int allocation)
++{
++	if (!uevent_sock) {
++		kfree_skb(skb);
++		return -ENODEV;
++	}
++
++	return netlink_broadcast(uevent_sock, skb, pid, group, allocation);;
++}
++#else
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     int allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++#endif
++EXPORT_SYMBOL_GPL(broadcast_uevent);
++
++#if defined(CONFIG_NET)
+ static int __init kobject_uevent_init(void)
+ {
+ 	uevent_sock = netlink_kernel_create(&init_net, NETLINK_KOBJECT_UEVENT,
diff --git a/target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch
new file mode 100644
index 0000000000..c09e13e11c
--- /dev/null
+++ b/target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch
@@ -0,0 +1,85 @@
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -30,6 +30,8 @@
+ #define UEVENT_NUM_ENVP			32	/* number of env pointers */
+ #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
+ 
++struct sk_buff;
++
+ /* path to the userspace helper executed on an event */
+ extern char uevent_helper[];
+ 
+@@ -246,6 +248,10 @@ int add_uevent_var(struct kobj_uevent_en
+ 
+ int kobject_action_type(const char *buf, size_t count,
+ 			enum kobject_action *type);
++
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     gfp_t allocation);
++
+ #else
+ static inline int kobject_uevent(struct kobject *kobj,
+ 				 enum kobject_action action)
+@@ -262,6 +268,16 @@ static inline int add_uevent_var(struct 
+ static inline int kobject_action_type(const char *buf, size_t count,
+ 				      enum kobject_action *type)
+ { return -EINVAL; }
++
++void kfree_skb(struct sk_buff *);
++
++static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++				   gfp_t allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++
+ #endif
+ 
+ #endif /* _KOBJECT_H_ */
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -377,6 +377,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;
diff --git a/target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch
new file mode 100644
index 0000000000..7f50a199d4
--- /dev/null
+++ b/target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch
@@ -0,0 +1,85 @@
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -31,6 +31,8 @@
+ #define UEVENT_NUM_ENVP			32	/* number of env pointers */
+ #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
+ 
++struct sk_buff;
++
+ /* path to the userspace helper executed on an event */
+ extern char uevent_helper[];
+ 
+@@ -213,6 +215,10 @@ int add_uevent_var(struct kobj_uevent_en
+ 
+ int kobject_action_type(const char *buf, size_t count,
+ 			enum kobject_action *type);
++
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     gfp_t allocation);
++
+ #else
+ static inline int kobject_uevent(struct kobject *kobj,
+ 				 enum kobject_action action)
+@@ -229,6 +235,16 @@ static inline int add_uevent_var(struct 
+ static inline int kobject_action_type(const char *buf, size_t count,
+ 				      enum kobject_action *type)
+ { return -EINVAL; }
++
++void kfree_skb(struct sk_buff *);
++
++static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++				   gfp_t allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++
+ #endif
+ 
+ #endif /* _KOBJECT_H_ */
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -377,6 +377,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;
-- 
GitLab