{
struct kmem_cache *s = NULL;
int err = 0;
+ char *n;
get_online_cpus();
mutex_lock(&slab_mutex);
goto out_locked;
- s = __kmem_cache_create(name, size, align, flags, ctor);
- if (!s)
- err = -ENOSYS; /* Until __kmem_cache_create returns code */
+ n = kstrdup(name, GFP_KERNEL);
+ if (!n) {
+ err = -ENOMEM;
+ goto out_locked;
+ }
+
+ s = __kmem_cache_create(n, size, align, flags, ctor);
+
+ if (s) {
+ /*
+ * Check if the slab has actually been created and if it was a
+ * real instatiation. Aliases do not belong on the list
+ */
+ if (s->refcount == 1)
+ list_add(&s->list, &slab_caches);
- /*
- * Check if the slab has actually been created and if it was a
- * real instatiation. Aliases do not belong on the list
- */
- if (s && s->refcount == 1)
- list_add(&s->list, &slab_caches);
+ } else {
+ kfree(n);
+ err = -ENOSYS; /* Until __kmem_cache_create returns code */
+ }
out_locked:
mutex_unlock(&slab_mutex);
if (s->flags & SLAB_DESTROY_BY_RCU)
rcu_barrier();
+ kfree(s->name);
kmem_cache_free(kmem_cache, s);
} else {
list_add(&s->list, &slab_caches);
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)
-{
- kfree(s->name);
-}
+static inline void sysfs_slab_remove(struct kmem_cache *s) { }
#endif
size_t align, unsigned long flags, void (*ctor)(void *))
{
struct kmem_cache *s;
- char *n;
s = find_mergeable(size, align, flags, name, ctor);
if (s) {
return s;
}
- n = kstrdup(name, GFP_KERNEL);
- if (!n)
- return NULL;
-
s = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
if (s) {
- if (kmem_cache_open(s, n,
+ if (kmem_cache_open(s, name,
size, align, flags, ctor)) {
int r;
}
kmem_cache_free(kmem_cache, s);
}
- kfree(n);
return NULL;
}
return err;
}
-static void kmem_cache_release(struct kobject *kobj)
-{
- struct kmem_cache *s = to_slab(kobj);
-
- kfree(s->name);
-}
-
static const struct sysfs_ops slab_sysfs_ops = {
.show = slab_attr_show,
.store = slab_attr_store,
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)