|
@@ -23,15 +23,31 @@
|
|
#include <linux/spinlock.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/rwsem.h>
|
|
#include <linux/rwsem.h>
|
|
#include <linux/kref.h>
|
|
#include <linux/kref.h>
|
|
-#include <linux/kobject_uevent.h>
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/atomic.h>
|
|
|
|
|
|
#define KOBJ_NAME_LEN 20
|
|
#define KOBJ_NAME_LEN 20
|
|
|
|
|
|
|
|
+#define HOTPLUG_PATH_LEN 256
|
|
|
|
+
|
|
|
|
+/* path to the userspace helper executed on an event */
|
|
|
|
+extern char hotplug_path[];
|
|
|
|
+
|
|
/* counter to tag the hotplug event, read only except for the kobject core */
|
|
/* counter to tag the hotplug event, read only except for the kobject core */
|
|
extern u64 hotplug_seqnum;
|
|
extern u64 hotplug_seqnum;
|
|
|
|
|
|
|
|
+/* the actions here must match the proper string in lib/kobject_uevent.c */
|
|
|
|
+typedef int __bitwise kobject_action_t;
|
|
|
|
+enum kobject_action {
|
|
|
|
+ KOBJ_ADD = (__force kobject_action_t) 0x01, /* add event, for hotplug */
|
|
|
|
+ KOBJ_REMOVE = (__force kobject_action_t) 0x02, /* remove event, for hotplug */
|
|
|
|
+ KOBJ_CHANGE = (__force kobject_action_t) 0x03, /* a sysfs attribute file has changed */
|
|
|
|
+ KOBJ_MOUNT = (__force kobject_action_t) 0x04, /* mount event for block devices */
|
|
|
|
+ KOBJ_UMOUNT = (__force kobject_action_t) 0x05, /* umount event for block devices */
|
|
|
|
+ KOBJ_OFFLINE = (__force kobject_action_t) 0x06, /* offline event for hotplug devices */
|
|
|
|
+ KOBJ_ONLINE = (__force kobject_action_t) 0x07, /* online event for hotplug devices */
|
|
|
|
+};
|
|
|
|
+
|
|
struct kobject {
|
|
struct kobject {
|
|
const char * k_name;
|
|
const char * k_name;
|
|
char name[KOBJ_NAME_LEN];
|
|
char name[KOBJ_NAME_LEN];
|
|
@@ -243,16 +259,33 @@ extern void subsys_remove_file(struct subsystem * , struct subsys_attribute *);
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG
|
|
#ifdef CONFIG_HOTPLUG
|
|
void kobject_hotplug(struct kobject *kobj, enum kobject_action action);
|
|
void kobject_hotplug(struct kobject *kobj, enum kobject_action action);
|
|
|
|
+
|
|
int add_hotplug_env_var(char **envp, int num_envp, int *cur_index,
|
|
int add_hotplug_env_var(char **envp, int num_envp, int *cur_index,
|
|
char *buffer, int buffer_size, int *cur_len,
|
|
char *buffer, int buffer_size, int *cur_len,
|
|
const char *format, ...)
|
|
const char *format, ...)
|
|
__attribute__((format (printf, 7, 8)));
|
|
__attribute__((format (printf, 7, 8)));
|
|
|
|
+
|
|
|
|
+int kobject_uevent(struct kobject *kobj,
|
|
|
|
+ enum kobject_action action,
|
|
|
|
+ struct attribute *attr);
|
|
|
|
+int kobject_uevent_atomic(struct kobject *kobj,
|
|
|
|
+ enum kobject_action action,
|
|
|
|
+ struct attribute *attr);
|
|
|
|
+
|
|
#else
|
|
#else
|
|
static inline void kobject_hotplug(struct kobject *kobj, enum kobject_action action) { }
|
|
static inline void kobject_hotplug(struct kobject *kobj, enum kobject_action action) { }
|
|
static inline int add_hotplug_env_var(char **envp, int num_envp, int *cur_index,
|
|
static inline int add_hotplug_env_var(char **envp, int num_envp, int *cur_index,
|
|
char *buffer, int buffer_size, int *cur_len,
|
|
char *buffer, int buffer_size, int *cur_len,
|
|
const char *format, ...)
|
|
const char *format, ...)
|
|
{ return 0; }
|
|
{ return 0; }
|
|
|
|
+int kobject_uevent(struct kobject *kobj,
|
|
|
|
+ enum kobject_action action,
|
|
|
|
+ struct attribute *attr)
|
|
|
|
+{ return 0; }
|
|
|
|
+int kobject_uevent_atomic(struct kobject *kobj,
|
|
|
|
+ enum kobject_action action,
|
|
|
|
+ struct attribute *attr)
|
|
|
|
+{ return 0; }
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* __KERNEL__ */
|