#ifdef CONFIG_SLUB
 struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
        size_t align, unsigned long flags, void (*ctor)(void *));
+extern int sysfs_slab_add(struct kmem_cache *s);
 #else
 static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
        size_t align, unsigned long flags, void (*ctor)(void *))
 { return NULL; }
+static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; }
+
 #endif
 
 
 
                return NULL;
        }
 
+       if (s->refcount == 1) {
+               err = sysfs_slab_add(s);
+               if (err)
+                       printk(KERN_WARNING "kmem_cache_create(%s) failed to"
+                               " create sysfs entry. Error %d\n",
+                                       name, err);
+       }
+
        return s;
 }
 EXPORT_SYMBOL(kmem_cache_create);
 
 enum track_item { TRACK_ALLOC, TRACK_FREE };
 
 #ifdef CONFIG_SYSFS
-static int sysfs_slab_add(struct kmem_cache *);
 static int sysfs_slab_alias(struct kmem_cache *, const char *);
 static void sysfs_slab_remove(struct kmem_cache *);
 
 #else
-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) { }
        if (s) {
                if (kmem_cache_open(s, name,
                                size, align, flags, ctor)) {
-                       int r;
-
-                       mutex_unlock(&slab_mutex);
-                       r = sysfs_slab_add(s);
-                       mutex_lock(&slab_mutex);
-
-                       if (!r)
-                               return s;
-
-                       kmem_cache_close(s);
+                       return s;
                }
                kmem_cache_free(kmem_cache, s);
        }
        return name;
 }
 
-static int sysfs_slab_add(struct kmem_cache *s)
+int sysfs_slab_add(struct kmem_cache *s)
 {
        int err;
        const char *name;