{
        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)