return rc;
 }
 
-static int smp_rescan_cpus(void)
+static int __smp_rescan_cpus(void)
 {
        cpumask_t avail;
 
        kfree(info);
        printk(KERN_INFO "CPUs: %d configured, %d standby\n", c_cpus, s_cpus);
        get_online_cpus();
-       smp_rescan_cpus();
+       __smp_rescan_cpus();
        put_online_cpus();
 }
 
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-static ssize_t __ref rescan_store(struct sys_device *dev,
-                                 const char *buf, size_t count)
+
+int smp_rescan_cpus(void)
 {
        cpumask_t newcpus;
        int cpu;
        get_online_cpus();
        mutex_lock(&smp_cpu_state_mutex);
        newcpus = cpu_present_map;
-       rc = smp_rescan_cpus();
+       rc = __smp_rescan_cpus();
        if (rc)
                goto out;
        cpus_andnot(newcpus, cpu_present_map, newcpus);
        put_online_cpus();
        if (!cpus_empty(newcpus))
                topology_schedule_update();
+       return rc;
+}
+
+static ssize_t __ref rescan_store(struct sys_device *dev, const char *buf,
+                                 size_t count)
+{
+       int rc;
+
+       rc = smp_rescan_cpus();
        return rc ? rc : count;
 }
 static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store);
 
 #include <linux/cpu.h>
 #include <linux/sysdev.h>
 #include <linux/workqueue.h>
+#include <asm/smp.h>
 #include "sclp.h"
 
 #define TAG    "sclp_config: "
        u8 ev_qualifier;
 } __attribute__((packed));
 
+#define EV_QUAL_CPU_CHANGE     1
 #define EV_QUAL_CAP_CHANGE     3
 
 static struct work_struct sclp_cpu_capability_work;
+static struct work_struct sclp_cpu_change_work;
 
 static void sclp_cpu_capability_notify(struct work_struct *work)
 {
        put_online_cpus();
 }
 
+static void sclp_cpu_change_notify(struct work_struct *work)
+{
+       smp_rescan_cpus();
+}
+
 static void sclp_conf_receiver_fn(struct evbuf_header *evbuf)
 {
        struct conf_mgm_data *cdata;
 
        cdata = (struct conf_mgm_data *)(evbuf + 1);
-       if (cdata->ev_qualifier == EV_QUAL_CAP_CHANGE)
+       switch (cdata->ev_qualifier) {
+       case EV_QUAL_CPU_CHANGE:
+               schedule_work(&sclp_cpu_change_work);
+               break;
+       case EV_QUAL_CAP_CHANGE:
                schedule_work(&sclp_cpu_capability_work);
+               break;
+       }
 }
 
 static struct sclp_register sclp_conf_register =
        int rc;
 
        INIT_WORK(&sclp_cpu_capability_work, sclp_cpu_capability_notify);
+       INIT_WORK(&sclp_cpu_change_work, sclp_cpu_change_notify);
 
        rc = sclp_register(&sclp_conf_register);
        if (rc) {
 
 #define smp_cpu_not_running(cpu)       1
 #endif
 
+#ifdef CONFIG_HOTPLUG_CPU
+extern int smp_rescan_cpus(void);
+#else
+static inline int smp_rescan_cpus(void) { return 0; }
+#endif
+
 extern union save_area *zfcpdump_save_areas[NR_CPUS + 1];
 #endif