svn commit: r210095 - projects/ofed/head/sys/ofed/include/linux
Jeff Roberson
jeff at FreeBSD.org
Thu Jul 15 01:18:37 UTC 2010
Author: jeff
Date: Thu Jul 15 01:18:37 2010
New Revision: 210095
URL: http://svn.freebsd.org/changeset/base/210095
Log:
- Fill out more of the kobject api.
Sponsored by: Isilon Systems, iX Systems, and Panasas.
Modified:
projects/ofed/head/sys/ofed/include/linux/kobject.h
projects/ofed/head/sys/ofed/include/linux/linux_compat.c
Modified: projects/ofed/head/sys/ofed/include/linux/kobject.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/kobject.h Thu Jul 15 01:17:40 2010 (r210094)
+++ projects/ofed/head/sys/ofed/include/linux/kobject.h Thu Jul 15 01:18:37 2010 (r210095)
@@ -29,6 +29,8 @@
#define _LINUX_KOBJECT_H_
#include <machine/stdarg.h>
+
+#include <linux/kernel.h>
#include <linux/kref.h>
#include <linux/slab.h>
@@ -47,30 +49,41 @@ struct kobject {
struct kobj_type *ktype;
};
-static inline int
-kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
- struct kobject *parent, const char *fmt, ...)
+static inline void
+kobject_init(struct kobject *kobj, struct kobj_type *ktype)
{
kref_init(&kobj->kref);
kobj->ktype = ktype;
kobj->name = NULL;
kobj->parent = NULL;
- return 0;
}
static inline void
-kobject_init(struct kobject *kobj, struct kobj_type *ktype)
+kobject_release(struct kref *kref)
{
- kref_init(&kobj->kref);
- kobj->ktype = ktype;
- kobj->name = NULL;
- kobj->parent = NULL;
+ struct kobject *kobj;
+
+ kobj = container_of(kref, struct kobject, kref);
+ if (kobj->ktype && kobj->ktype->release)
+ kobj->ktype->release(kobj);
}
static inline void
kobject_put(struct kobject *kobj)
{
+
+ if (kobj)
+ kref_put(&kobj->kref, kobject_release);
+}
+
+static inline struct kobject *
+kobject_get(struct kobject *kobj)
+{
+
+ if (kobj)
+ kref_get(&kobj->kref);
+ return kobj;
}
static inline int
@@ -117,6 +130,8 @@ kobject_name(const struct kobject *kobj)
return kobj->name;
}
-int kobject_set_name(struct kobject *kobj, const char *fmt, ...);
+int kobject_set_name(struct kobject *kobj, const char *fmt, ...);
+int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
+ struct kobject *parent, const char *fmt, ...);
#endif /* _LINUX_KOBJECT_H_ */
Modified: projects/ofed/head/sys/ofed/include/linux/linux_compat.c
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/linux_compat.c Thu Jul 15 01:17:40 2010 (r210094)
+++ projects/ofed/head/sys/ofed/include/linux/linux_compat.c Thu Jul 15 01:18:37 2010 (r210095)
@@ -33,19 +33,26 @@
#include <sys/sysctl.h>
#include <sys/lock.h>
#include <sys/mutex.h>
+#include <sys/bus.h>
#include <machine/stdarg.h>
#include <linux/kobject.h>
+#include <linux/device.h>
#include <linux/slab.h>
+#include <linux/module.h>
MALLOC_DEFINE(M_KMALLOC, "linux", "Linux kmalloc compat");
+MALLOC_DEFINE(M_LINUX_DMA, "lnxdma", "Linux DMA compat");
#include <linux/rbtree.h>
/* Undo Linux compat change. */
#undef RB_ROOT
#define RB_ROOT(head) (head)->rbh_root
+struct class miscclass;
+struct linux_device miscroot;
+
int
panic_cmp(struct rb_node *one, struct rb_node *two)
{
@@ -66,3 +73,51 @@ kobject_set_name(struct kobject *kobj, c
return (error);
}
+
+struct device *
+device_create(struct class *class, struct device *parent, dev_t devt,
+ void *drvdata, const char *fmt, ...)
+{
+ struct device *dev;
+ va_list args;
+
+ dev = kzalloc(sizeof(*dev), M_WAITOK);
+ dev->parent = parent;
+ dev->devt = devt;
+ dev->driver_data = drvdata;
+ va_start(args, fmt);
+ kobject_set_name_vargs(&dev->kobj, fmt, args);
+ va_end(args);
+ device_register(dev);
+
+ return (dev);
+}
+
+int
+kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
+ struct kobject *parent, const char *fmt, ...)
+{
+ va_list args;
+ int error;
+
+ kobject_init(kobj, ktype);
+ kobj->ktype = ktype;
+ kobj->parent = parent;
+ kobj->name = NULL;
+
+ va_start(args, fmt);
+ error = kobject_set_name_vargs(kobj, fmt, args);
+ va_end(args);
+
+ return error;
+}
+
+static void
+linux_compat_init(void)
+{
+ miscclass.name = "misc";
+ class_register(&miscclass);
+ miscroot.bsddev = root_bus;
+}
+
+module_init(linux_compat_init);
More information about the svn-src-projects
mailing list