Commit 715bf8d2 authored by Robert Love's avatar Robert Love Committed by Greg Kroah-Hartman

[PATCH] KOBJECT: add kobject_get_path

Add a new kobject helper, kobject_get_path(), which is the greatest
function ever.
Signed-Off-By: default avatarRobert Love <rml@ximian.com>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 95e07832
...@@ -58,6 +58,8 @@ extern void kobject_put(struct kobject *); ...@@ -58,6 +58,8 @@ extern void kobject_put(struct kobject *);
extern void kobject_hotplug(const char *action, struct kobject *); extern void kobject_hotplug(const char *action, struct kobject *);
extern char * kobject_get_path(struct kset *, struct kobject *, int);
struct kobj_type { struct kobj_type {
void (*release)(struct kobject *); void (*release)(struct kobject *);
struct sysfs_ops * sysfs_ops; struct sysfs_ops * sysfs_ops;
......
...@@ -58,14 +58,11 @@ static int create_dir(struct kobject * kobj) ...@@ -58,14 +58,11 @@ static int create_dir(struct kobject * kobj)
return error; return error;
} }
static inline struct kobject * to_kobj(struct list_head * entry) static inline struct kobject * to_kobj(struct list_head * entry)
{ {
return container_of(entry,struct kobject,entry); return container_of(entry,struct kobject,entry);
} }
#ifdef CONFIG_HOTPLUG
static int get_kobj_path_length(struct kset *kset, struct kobject *kobj) static int get_kobj_path_length(struct kset *kset, struct kobject *kobj)
{ {
int length = 1; int length = 1;
...@@ -98,6 +95,31 @@ static void fill_kobj_path(struct kset *kset, struct kobject *kobj, char *path, ...@@ -98,6 +95,31 @@ static void fill_kobj_path(struct kset *kset, struct kobject *kobj, char *path,
pr_debug("%s: path = '%s'\n",__FUNCTION__,path); pr_debug("%s: path = '%s'\n",__FUNCTION__,path);
} }
/**
* kobject_get_path - generate and return the path associated with a given kobj
* and kset pair. The result must be freed by the caller with kfree().
*
* @kset: kset in question, with which to build the path
* @kobj: kobject in question, with which to build the path
* @gfp_mask: the allocation type used to allocate the path
*/
char * kobject_get_path(struct kset *kset, struct kobject *kobj, int gfp_mask)
{
char *path;
int len;
len = get_kobj_path_length(kset, kobj);
path = kmalloc(len, gfp_mask);
if (!path)
return NULL;
memset(path, 0x00, len);
fill_kobj_path(kset, kobj, path, len);
return path;
}
#ifdef CONFIG_HOTPLUG
#define BUFFER_SIZE 1024 /* should be enough memory for the env */ #define BUFFER_SIZE 1024 /* should be enough memory for the env */
#define NUM_ENVP 32 /* number of env pointers */ #define NUM_ENVP 32 /* number of env pointers */
static unsigned long sequence_num; static unsigned long sequence_num;
...@@ -112,7 +134,6 @@ static void kset_hotplug(const char *action, struct kset *kset, ...@@ -112,7 +134,6 @@ static void kset_hotplug(const char *action, struct kset *kset,
char *scratch; char *scratch;
int i = 0; int i = 0;
int retval; int retval;
int kobj_path_length;
char *kobj_path = NULL; char *kobj_path = NULL;
char *name = NULL; char *name = NULL;
unsigned long seq; unsigned long seq;
...@@ -163,12 +184,9 @@ static void kset_hotplug(const char *action, struct kset *kset, ...@@ -163,12 +184,9 @@ static void kset_hotplug(const char *action, struct kset *kset,
envp [i++] = scratch; envp [i++] = scratch;
scratch += sprintf(scratch, "SEQNUM=%ld", seq) + 1; scratch += sprintf(scratch, "SEQNUM=%ld", seq) + 1;
kobj_path_length = get_kobj_path_length (kset, kobj); kobj_path = kobject_get_path(kset, kobj, GFP_KERNEL);
kobj_path = kmalloc (kobj_path_length, GFP_KERNEL);
if (!kobj_path) if (!kobj_path)
goto exit; goto exit;
memset (kobj_path, 0x00, kobj_path_length);
fill_kobj_path (kset, kobj, kobj_path, kobj_path_length);
envp [i++] = scratch; envp [i++] = scratch;
scratch += sprintf (scratch, "DEVPATH=%s", kobj_path) + 1; scratch += sprintf (scratch, "DEVPATH=%s", kobj_path) + 1;
...@@ -626,7 +644,7 @@ void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a) ...@@ -626,7 +644,7 @@ void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a)
} }
} }
EXPORT_SYMBOL(kobject_get_path);
EXPORT_SYMBOL(kobject_init); EXPORT_SYMBOL(kobject_init);
EXPORT_SYMBOL(kobject_register); EXPORT_SYMBOL(kobject_register);
EXPORT_SYMBOL(kobject_unregister); EXPORT_SYMBOL(kobject_unregister);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment