|
@@ -247,7 +247,10 @@ static void sysfs_slab_remove(struct kmem_cache *);
|
|
|
static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; }
|
|
|
static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p)
|
|
|
{ return 0; }
|
|
|
-static inline void sysfs_slab_remove(struct kmem_cache *s) {}
|
|
|
+static inline void sysfs_slab_remove(struct kmem_cache *s)
|
|
|
+{
|
|
|
+ kfree(s);
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
/********************************************************************
|
|
@@ -2322,7 +2325,6 @@ void kmem_cache_destroy(struct kmem_cache *s)
|
|
|
if (kmem_cache_close(s))
|
|
|
WARN_ON(1);
|
|
|
sysfs_slab_remove(s);
|
|
|
- kfree(s);
|
|
|
} else
|
|
|
up_write(&slub_lock);
|
|
|
}
|
|
@@ -3937,6 +3939,13 @@ static ssize_t slab_attr_store(struct kobject *kobj,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static void kmem_cache_release(struct kobject *kobj)
|
|
|
+{
|
|
|
+ struct kmem_cache *s = to_slab(kobj);
|
|
|
+
|
|
|
+ kfree(s);
|
|
|
+}
|
|
|
+
|
|
|
static struct sysfs_ops slab_sysfs_ops = {
|
|
|
.show = slab_attr_show,
|
|
|
.store = slab_attr_store,
|
|
@@ -3944,6 +3953,7 @@ static struct sysfs_ops slab_sysfs_ops = {
|
|
|
|
|
|
static struct kobj_type slab_ktype = {
|
|
|
.sysfs_ops = &slab_sysfs_ops,
|
|
|
+ .release = kmem_cache_release
|
|
|
};
|
|
|
|
|
|
static int uevent_filter(struct kset *kset, struct kobject *kobj)
|
|
@@ -4045,6 +4055,7 @@ static void sysfs_slab_remove(struct kmem_cache *s)
|
|
|
{
|
|
|
kobject_uevent(&s->kobj, KOBJ_REMOVE);
|
|
|
kobject_del(&s->kobj);
|
|
|
+ kobject_put(&s->kobj);
|
|
|
}
|
|
|
|
|
|
/*
|