summaryrefslogtreecommitdiff
path: root/fs/char_dev.c
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2008-12-01 11:14:22 +1100
committerStephen Rothwell <sfr@canb.auug.org.au>2008-12-01 11:14:22 +1100
commitfe2c729b903a03f3a1fa448a7ea7c303726c1346 (patch)
tree20a0d92ea7a5c584ca7fd01e281e62e4fcc9341a /fs/char_dev.c
parent5ae15180975d9c7bfb5bd7d53a430d047efa0a46 (diff)
parent3a527f0233de893902300424ec2fd7c09dde6f2a (diff)
Merge branch 'quilt/driver-core'
Conflicts: drivers/mtd/maps/integrator-flash.c
Diffstat (limited to 'fs/char_dev.c')
-rw-r--r--fs/char_dev.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/fs/char_dev.c b/fs/char_dev.c
index 700697a72618..5ce907c4364f 100644
--- a/fs/char_dev.c
+++ b/fs/char_dev.c
@@ -482,26 +482,22 @@ void cdev_del(struct cdev *p)
}
-static void cdev_default_release(struct kobject *kobj)
+static void cdev_release(struct kobject *kobj)
{
struct cdev *p = container_of(kobj, struct cdev, kobj);
cdev_purge(p);
+ if (p->release)
+ p->release(p);
}
-static void cdev_dynamic_release(struct kobject *kobj)
-{
- struct cdev *p = container_of(kobj, struct cdev, kobj);
- cdev_purge(p);
- kfree(p);
-}
-
-static struct kobj_type ktype_cdev_default = {
- .release = cdev_default_release,
+static struct kobj_type cdev_ktype = {
+ .release = cdev_release,
};
-static struct kobj_type ktype_cdev_dynamic = {
- .release = cdev_dynamic_release,
-};
+static void cdev_alloc_release(struct cdev *cdev)
+{
+ kfree(cdev);
+}
/**
* cdev_alloc() - allocate a cdev structure
@@ -510,10 +506,10 @@ static struct kobj_type ktype_cdev_dynamic = {
*/
struct cdev *cdev_alloc(void)
{
- struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);
+ struct cdev *p = kmalloc(sizeof(struct cdev), GFP_KERNEL);
if (p) {
- INIT_LIST_HEAD(&p->list);
- kobject_init(&p->kobj, &ktype_cdev_dynamic);
+ cdev_init(p, NULL);
+ p->release = cdev_alloc_release;
}
return p;
}
@@ -530,7 +526,7 @@ void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
- kobject_init(&cdev->kobj, &ktype_cdev_default);
+ kobject_init(&cdev->kobj, &cdev_ktype);
cdev->ops = fops;
}