--- /dev/null
+From 91b973f90c1220d71923e7efe1e61f5329806380 Mon Sep 17 00:00:00 2001
+From: Paul Mackerras <paulus@samba.org>
+Date: Sat, 18 Jan 2014 21:14:47 +1100
+Subject: powerpc: Make sure "cache" directory is removed when offlining cpu
+
+From: Paul Mackerras <paulus@samba.org>
+
+commit 91b973f90c1220d71923e7efe1e61f5329806380 upstream.
+
+The code in remove_cache_dir() is supposed to remove the "cache"
+subdirectory from the sysfs directory for a CPU when that CPU is
+being offlined. It tries to do this by calling kobject_put() on
+the kobject for the subdirectory. However, the subdirectory only
+gets removed once the last reference goes away, and the reference
+being put here may well not be the last reference. That means
+that the "cache" subdirectory may still exist when the offlining
+operation has finished. If the same CPU subsequently gets onlined,
+the code tries to add a new "cache" subdirectory. If the old
+subdirectory has not yet been removed, we get a WARN_ON in the
+sysfs code, with stack trace, and an error message printed on the
+console. Further, we ultimately end up with an online cpu with no
+"cache" subdirectory.
+
+This fixes it by doing an explicit kobject_del() at the point where
+we want the subdirectory to go away. kobject_del() removes the sysfs
+directory even though the object still exists in memory. The object
+will get freed at some point in the future. A subsequent onlining
+operation can create a new sysfs directory, even if the old object
+still exists in memory, without causing any problems.
+
+Signed-off-by: Paul Mackerras <paulus@samba.org>
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/powerpc/kernel/cacheinfo.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/arch/powerpc/kernel/cacheinfo.c
++++ b/arch/powerpc/kernel/cacheinfo.c
+@@ -788,6 +788,9 @@ static void remove_cache_dir(struct cach
+ {
+ remove_index_dirs(cache_dir);
+
++ /* Remove cache dir from sysfs */
++ kobject_del(cache_dir->kobj);
++
+ kobject_put(cache_dir->kobj);
+
+ kfree(cache_dir);