diff --git a/mm/slab.h b/mm/slab.h
index 67aeaa2d39cc0a4d4c30dafcc209a11deb68ca46..7deeb449a3013ea279fde16bf6935b9d23ba752a 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -38,13 +38,10 @@ extern int __kmem_cache_create(struct kmem_cache *, unsigned long flags);
 #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
 
 
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 651a3c60847a01ae02fbc5c6e300a3d86fc0f951..9c217255ac49374834689590f6e2bd9752e23da2 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -155,14 +155,6 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
 		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);
diff --git a/mm/slub.c b/mm/slub.c
index 0b122d8ec2169ab62dda8dc8abce7c0247a81ede..dafd465f7a3f32b4e28a9d95ec7d0aec15878b61 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -202,10 +202,12 @@ struct track {
 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) { }
@@ -3943,7 +3945,20 @@ struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
 
 int __kmem_cache_create(struct kmem_cache *s, unsigned long flags)
 {
-	return kmem_cache_open(s, flags);
+	int err;
+
+	err = kmem_cache_open(s, flags);
+	if (err)
+		return err;
+
+	mutex_unlock(&slab_mutex);
+	err = sysfs_slab_add(s);
+	mutex_lock(&slab_mutex);
+
+	if (err)
+		kmem_cache_close(s);
+
+	return err;
 }
 
 #ifdef CONFIG_SMP
@@ -5233,7 +5248,7 @@ static char *create_unique_id(struct kmem_cache *s)
 	return name;
 }
 
-int sysfs_slab_add(struct kmem_cache *s)
+static int sysfs_slab_add(struct kmem_cache *s)
 {
 	int err;
 	const char *name;