summaryrefslogtreecommitdiff
path: root/lib/kobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kobject.c')
-rw-r--r--lib/kobject.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/kobject.c b/lib/kobject.c
new file mode 100644
index 000000000000..48e950c9e4ce
--- /dev/null
+++ b/lib/kobject.c
@@ -0,0 +1,98 @@
+/*
+ * kobject.c - library routines for handling generic kernel objects
+ */
+
+#define DEBUG 1
+
+#include <linux/kobject.h>
+#include <linux/module.h>
+#include <linux/stat.h>
+
+/**
+ * kobject_init - initialize object.
+ * @kobj: object in question.
+ */
+
+void kobject_init(struct kobject * kobj)
+{
+ atomic_set(&kobj->refcount,1);
+ INIT_LIST_HEAD(&kobj->entry);
+}
+
+/**
+ * kobject_register - register an object.
+ * @kobj: object in question.
+ *
+ * For now, fill in the replicated fields in the object's
+ * directory entry, and create a dir in sysfs.
+ * This stuff should go away in the future, as we move
+ * more implicit things to sysfs.
+ */
+
+int kobject_register(struct kobject * kobj)
+{
+ pr_debug("kobject %s: registering\n",kobj->name);
+ if (kobj->parent)
+ kobject_get(kobj->parent);
+ return 0;
+}
+
+/**
+ * kobject_unregister - unlink an object.
+ * @kobj: object going away.
+ *
+ * The device has been told to be removed, but may
+ * not necessarily be disappearing from the kernel.
+ * So, we remove the directory and decrement the refcount
+ * that we set with kobject_register().
+ *
+ * Eventually (maybe now), the refcount will hit 0, and
+ * put_device() will clean the device up.
+ */
+
+void kobject_unregister(struct kobject * kobj)
+{
+ pr_debug("kobject %s: unregistering\n",kobj->name);
+ kobject_put(kobj);
+}
+
+/**
+ * kobject_get - increment refcount for object.
+ * @kobj: object.
+ */
+
+struct kobject * kobject_get(struct kobject * kobj)
+{
+ struct kobject * ret = kobj;
+ if (atomic_read(&kobj->refcount) > 0)
+ atomic_inc(&kobj->refcount);
+ else
+ ret = NULL;
+ return ret;
+}
+
+/**
+ * kobject_put - decrement refcount for object.
+ * @kobj: object.
+ *
+ * Decrement the refcount, and check if 0. If it is, then
+ * we're gonna need to clean it up, and decrement the refcount
+ * of its parent.
+ */
+
+void kobject_put(struct kobject * kobj)
+{
+ struct kobject * parent = kobj->parent;
+
+ if (!atomic_dec_and_test(&kobj->refcount))
+ return;
+ pr_debug("kobject %s: cleaning up\n",kobj->name);
+ if (parent)
+ kobject_put(parent);
+}
+
+EXPORT_SYMBOL(kobject_init);
+EXPORT_SYMBOL(kobject_register);
+EXPORT_SYMBOL(kobject_unregister);
+EXPORT_SYMBOL(kobject_get);
+EXPORT_SYMBOL(kobject_put);