sysfs: Implement sysfs tagged directory support.
[safe/jmp/linux-2.6] / lib / kobject_uevent.c
index e68e743..7b48d44 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/string.h>
 #include <linux/kobject.h>
 #include <linux/module.h>
+#include <linux/slab.h>
 
 #include <linux/socket.h>
 #include <linux/skbuff.h>
@@ -95,7 +96,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
        const char *subsystem;
        struct kobject *top_kobj;
        struct kset *kset;
-       struct kset_uevent_ops *uevent_ops;
+       const struct kset_uevent_ops *uevent_ops;
        u64 seq;
        int i = 0;
        int retval = 0;
@@ -234,6 +235,9 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
                        NETLINK_CB(skb).dst_group = 1;
                        retval = netlink_broadcast(uevent_sock, skb, 0, 1,
                                                   GFP_KERNEL);
+                       /* ENOBUFS should be handled in userspace */
+                       if (retval == -ENOBUFS)
+                               retval = 0;
                } else
                        retval = -ENOMEM;
        }
@@ -255,7 +259,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
                        goto exit;
 
                retval = call_usermodehelper(argv[0], argv,
-                                            env->envp, UMH_NO_WAIT);
+                                            env->envp, UMH_WAIT_EXEC);
        }
 
 exit:
@@ -325,7 +329,7 @@ static int __init kobject_uevent_init(void)
                       "kobject_uevent: unable to create netlink socket!\n");
                return -ENODEV;
        }
-
+       netlink_set_nonroot(NETLINK_KOBJECT_UEVENT, NL_NONROOT_RECV);
        return 0;
 }