/* Returns the success/failure of the operation. (NOTIFY_OK, NOTIFY_BAD)  */
static int __cpuinit relay_hotcpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu)
/* Returns the success/failure of the operation. (NOTIFY_OK, NOTIFY_BAD)  */
static int __cpuinit relay_hotcpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu)
{
	unsigned int hotcpu = (unsigned long)hcpu;
	struct rchan *chan;
	switch(action) {
	case CPU_UP_PREPARE:
	case CPU_UP_PREPARE_FROZEN:
		mutex_lock(&relay_channels_mutex);
		list_for_each_entry(chan, &relay_channels, list) {
			if (chan->buf[hotcpu])
				continue;
			chan->buf[hotcpu] = relay_open_buf(chan, hotcpu);
			if(!chan->buf[hotcpu]) {
				printk(KERN_ERR
					"relay_hotcpu_callback: cpu %d buffer "
					"creation failed\n", hotcpu);
				mutex_unlock(&relay_channels_mutex);
				return NOTIFY_BAD;
			}
		}
		mutex_unlock(&relay_channels_mutex);
		break;
	case CPU_DEAD:
	case CPU_DEAD_FROZEN:
		break;
	}
	return NOTIFY_OK;
}