svn commit: r292986 - in head/sys/compat/linuxkpi/common: include/linux src
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Dec 31 11:27:37 UTC 2015
Author: hselasky
Date: Thu Dec 31 11:27:36 2015
New Revision: 292986
URL: https://svnweb.freebsd.org/changeset/base/292986
Log:
Make the kobject refcounting compliant with Linux. Refcounting on the
parent kobject cannot be factored out and must be done by the kobject
consumers.
MFC after: 1 week
Sponsored by: Mellanox Technologies
Modified:
head/sys/compat/linuxkpi/common/include/linux/cdev.h
head/sys/compat/linuxkpi/common/src/linux_compat.c
Modified: head/sys/compat/linuxkpi/common/include/linux/cdev.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/cdev.h Thu Dec 31 11:25:45 2015 (r292985)
+++ head/sys/compat/linuxkpi/common/include/linux/cdev.h Thu Dec 31 11:27:36 2015 (r292986)
@@ -54,21 +54,27 @@ static inline void
cdev_release(struct kobject *kobj)
{
struct linux_cdev *cdev;
+ struct kobject *parent;
cdev = container_of(kobj, struct linux_cdev, kobj);
+ parent = kobj->parent;
if (cdev->cdev)
destroy_dev(cdev->cdev);
kfree(cdev);
+ kobject_put(parent);
}
static inline void
cdev_static_release(struct kobject *kobj)
{
struct linux_cdev *cdev;
+ struct kobject *parent;
cdev = container_of(kobj, struct linux_cdev, kobj);
+ parent = kobj->parent;
if (cdev->cdev)
destroy_dev(cdev->cdev);
+ kobject_put(parent);
}
static struct kobj_type cdev_ktype = {
@@ -114,6 +120,7 @@ cdev_add(struct linux_cdev *cdev, dev_t
cdev->dev = dev;
cdev->cdev->si_drv1 = cdev;
+ kobject_get(cdev->kobj.parent);
return (0);
}
Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c Thu Dec 31 11:25:45 2015 (r292985)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c Thu Dec 31 11:27:36 2015 (r292986)
@@ -157,7 +157,7 @@ kobject_add_complete(struct kobject *kob
struct kobj_type *t;
int error;
- kobj->parent = kobject_get(parent);
+ kobj->parent = parent;
error = sysfs_create_dir(kobj);
if (error == 0 && kobj->ktype && kobj->ktype->default_attrs) {
struct attribute **attr;
@@ -198,9 +198,6 @@ kobject_release(struct kref *kref)
kobj = container_of(kref, struct kobject, kref);
sysfs_remove_dir(kobj);
- if (kobj->parent)
- kobject_put(kobj->parent);
- kobj->parent = NULL;
name = kobj->name;
if (kobj->ktype && kobj->ktype->release)
kobj->ktype->release(kobj);
More information about the svn-src-head
mailing list