diff options
-rw-r--r-- | mm/slab_common.c | 30 | ||||
-rw-r--r-- | mm/slub.c | 21 |
2 files changed, 23 insertions, 28 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c index 7df814e8fbea..f18c06fd97c7 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
@@ -100,6 +100,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align | |||
100 | { | 100 | { |
101 | struct kmem_cache *s = NULL; | 101 | struct kmem_cache *s = NULL; |
102 | int err = 0; | 102 | int err = 0; |
103 | char *n; | ||
103 | 104 | ||
104 | get_online_cpus(); | 105 | get_online_cpus(); |
105 | mutex_lock(&slab_mutex); | 106 | mutex_lock(&slab_mutex); |
@@ -108,16 +109,26 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align | |||
108 | goto out_locked; | 109 | goto out_locked; |
109 | 110 | ||
110 | 111 | ||
111 | s = __kmem_cache_create(name, size, align, flags, ctor); | 112 | n = kstrdup(name, GFP_KERNEL); |
112 | if (!s) | 113 | if (!n) { |
113 | err = -ENOSYS; /* Until __kmem_cache_create returns code */ | 114 | err = -ENOMEM; |
115 | goto out_locked; | ||
116 | } | ||
117 | |||
118 | s = __kmem_cache_create(n, size, align, flags, ctor); | ||
119 | |||
120 | if (s) { | ||
121 | /* | ||
122 | * Check if the slab has actually been created and if it was a | ||
123 | * real instatiation. Aliases do not belong on the list | ||
124 | */ | ||
125 | if (s->refcount == 1) | ||
126 | list_add(&s->list, &slab_caches); | ||
114 | 127 | ||
115 | /* | 128 | } else { |
116 | * Check if the slab has actually been created and if it was a | 129 | kfree(n); |
117 | * real instatiation. Aliases do not belong on the list | 130 | err = -ENOSYS; /* Until __kmem_cache_create returns code */ |
118 | */ | 131 | } |
119 | if (s && s->refcount == 1) | ||
120 | list_add(&s->list, &slab_caches); | ||
121 | 132 | ||
122 | out_locked: | 133 | out_locked: |
123 | mutex_unlock(&slab_mutex); | 134 | mutex_unlock(&slab_mutex); |
@@ -153,6 +164,7 @@ void kmem_cache_destroy(struct kmem_cache *s) | |||
153 | if (s->flags & SLAB_DESTROY_BY_RCU) | 164 | if (s->flags & SLAB_DESTROY_BY_RCU) |
154 | rcu_barrier(); | 165 | rcu_barrier(); |
155 | 166 | ||
167 | kfree(s->name); | ||
156 | kmem_cache_free(kmem_cache, s); | 168 | kmem_cache_free(kmem_cache, s); |
157 | } else { | 169 | } else { |
158 | list_add(&s->list, &slab_caches); | 170 | list_add(&s->list, &slab_caches); |
@@ -210,10 +210,7 @@ static void sysfs_slab_remove(struct kmem_cache *); | |||
210 | static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; } | 210 | static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; } |
211 | static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p) | 211 | static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p) |
212 | { return 0; } | 212 | { return 0; } |
213 | static inline void sysfs_slab_remove(struct kmem_cache *s) | 213 | static inline void sysfs_slab_remove(struct kmem_cache *s) { } |
214 | { | ||
215 | kfree(s->name); | ||
216 | } | ||
217 | 214 | ||
218 | #endif | 215 | #endif |
219 | 216 | ||
@@ -3929,7 +3926,6 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size, | |||
3929 | size_t align, unsigned long flags, void (*ctor)(void *)) | 3926 | size_t align, unsigned long flags, void (*ctor)(void *)) |
3930 | { | 3927 | { |
3931 | struct kmem_cache *s; | 3928 | struct kmem_cache *s; |
3932 | char *n; | ||
3933 | 3929 | ||
3934 | s = find_mergeable(size, align, flags, name, ctor); | 3930 | s = find_mergeable(size, align, flags, name, ctor); |
3935 | if (s) { | 3931 | if (s) { |
@@ -3948,13 +3944,9 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size, | |||
3948 | return s; | 3944 | return s; |
3949 | } | 3945 | } |
3950 | 3946 | ||
3951 | n = kstrdup(name, GFP_KERNEL); | ||
3952 | if (!n) | ||
3953 | return NULL; | ||
3954 | |||
3955 | s = kmem_cache_alloc(kmem_cache, GFP_KERNEL); | 3947 | s = kmem_cache_alloc(kmem_cache, GFP_KERNEL); |
3956 | if (s) { | 3948 | if (s) { |
3957 | if (kmem_cache_open(s, n, | 3949 | if (kmem_cache_open(s, name, |
3958 | size, align, flags, ctor)) { | 3950 | size, align, flags, ctor)) { |
3959 | int r; | 3951 | int r; |
3960 | 3952 | ||
@@ -3969,7 +3961,6 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size, | |||
3969 | } | 3961 | } |
3970 | kmem_cache_free(kmem_cache, s); | 3962 | kmem_cache_free(kmem_cache, s); |
3971 | } | 3963 | } |
3972 | kfree(n); | ||
3973 | return NULL; | 3964 | return NULL; |
3974 | } | 3965 | } |
3975 | 3966 | ||
@@ -5200,13 +5191,6 @@ static ssize_t slab_attr_store(struct kobject *kobj, | |||
5200 | return err; | 5191 | return err; |
5201 | } | 5192 | } |
5202 | 5193 | ||
5203 | static void kmem_cache_release(struct kobject *kobj) | ||
5204 | { | ||
5205 | struct kmem_cache *s = to_slab(kobj); | ||
5206 | |||
5207 | kfree(s->name); | ||
5208 | } | ||
5209 | |||
5210 | static const struct sysfs_ops slab_sysfs_ops = { | 5194 | static const struct sysfs_ops slab_sysfs_ops = { |
5211 | .show = slab_attr_show, | 5195 | .show = slab_attr_show, |
5212 | .store = slab_attr_store, | 5196 | .store = slab_attr_store, |
@@ -5214,7 +5198,6 @@ static const struct sysfs_ops slab_sysfs_ops = { | |||
5214 | 5198 | ||
5215 | static struct kobj_type slab_ktype = { | 5199 | static struct kobj_type slab_ktype = { |
5216 | .sysfs_ops = &slab_sysfs_ops, | 5200 | .sysfs_ops = &slab_sysfs_ops, |
5217 | .release = kmem_cache_release | ||
5218 | }; | 5201 | }; |
5219 | 5202 | ||
5220 | static int uevent_filter(struct kset *kset, struct kobject *kobj) | 5203 | static int uevent_filter(struct kset *kset, struct kobject *kobj) |