diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:05 +0200 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:18 +0200 | 
| commit | e060c38434b2caa78efe7cedaff4191040b65a15 (patch) | |
| tree | 407361230bf6733f63d8e788e4b5e6566ee04818 /arch/s390/kernel/ipl.c | |
| parent | 10e4ac572eeffe5317019bd7330b6058a400dfc2 (diff) | |
| parent | cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941 (diff) | |
| download | olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.tar.xz olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.zip  | |
Merge branch 'master' into for-next
Fast-forward merge with Linus to be able to merge patches
based on more recent version of the tree.
Diffstat (limited to 'arch/s390/kernel/ipl.c')
| -rw-r--r-- | arch/s390/kernel/ipl.c | 50 | 
1 files changed, 47 insertions, 3 deletions
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index a689070be28..48c71020636 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c @@ -45,11 +45,13 @@   * - halt   * - power off   * - reipl + * - restart   */  #define ON_PANIC_STR		"on_panic"  #define ON_HALT_STR		"on_halt"  #define ON_POFF_STR		"on_poff"  #define ON_REIPL_STR		"on_reboot" +#define ON_RESTART_STR		"on_restart"  struct shutdown_action;  struct shutdown_trigger { @@ -1218,7 +1220,7 @@ static int __init reipl_fcp_init(void)  	/* sysfs: create fcp kset for mixing attr group and bin attrs */  	reipl_fcp_kset = kset_create_and_add(IPL_FCP_STR, NULL,  					     &reipl_kset->kobj); -	if (!reipl_kset) { +	if (!reipl_fcp_kset) {  		free_page((unsigned long) reipl_block_fcp);  		return -ENOMEM;  	} @@ -1544,17 +1546,20 @@ static char vmcmd_on_reboot[128];  static char vmcmd_on_panic[128];  static char vmcmd_on_halt[128];  static char vmcmd_on_poff[128]; +static char vmcmd_on_restart[128];  DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot);  DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic);  DEFINE_IPL_ATTR_STR_RW(vmcmd, on_halt, "%s\n", "%s\n", vmcmd_on_halt);  DEFINE_IPL_ATTR_STR_RW(vmcmd, on_poff, "%s\n", "%s\n", vmcmd_on_poff); +DEFINE_IPL_ATTR_STR_RW(vmcmd, on_restart, "%s\n", "%s\n", vmcmd_on_restart);  static struct attribute *vmcmd_attrs[] = {  	&sys_vmcmd_on_reboot_attr.attr,  	&sys_vmcmd_on_panic_attr.attr,  	&sys_vmcmd_on_halt_attr.attr,  	&sys_vmcmd_on_poff_attr.attr, +	&sys_vmcmd_on_restart_attr.attr,  	NULL,  }; @@ -1576,6 +1581,8 @@ static void vmcmd_run(struct shutdown_trigger *trigger)  		cmd = vmcmd_on_halt;  	else if (strcmp(trigger->name, ON_POFF_STR) == 0)  		cmd = vmcmd_on_poff; +	else if (strcmp(trigger->name, ON_RESTART_STR) == 0) +		cmd = vmcmd_on_restart;  	else  		return; @@ -1611,7 +1618,8 @@ static struct shutdown_action vmcmd_action = {SHUTDOWN_ACTION_VMCMD_STR,  static void stop_run(struct shutdown_trigger *trigger)  { -	if (strcmp(trigger->name, ON_PANIC_STR) == 0) +	if (strcmp(trigger->name, ON_PANIC_STR) == 0 || +	    strcmp(trigger->name, ON_RESTART_STR) == 0)  		disabled_wait((unsigned long) __builtin_return_address(0));  	while (sigp(smp_processor_id(), sigp_stop) == sigp_busy)  		cpu_relax(); @@ -1707,6 +1715,34 @@ static void do_panic(void)  	stop_run(&on_panic_trigger);  } +/* on restart */ + +static struct shutdown_trigger on_restart_trigger = {ON_RESTART_STR, +	&stop_action}; + +static ssize_t on_restart_show(struct kobject *kobj, +			       struct kobj_attribute *attr, char *page) +{ +	return sprintf(page, "%s\n", on_restart_trigger.action->name); +} + +static ssize_t on_restart_store(struct kobject *kobj, +				struct kobj_attribute *attr, +				const char *buf, size_t len) +{ +	return set_trigger(buf, &on_restart_trigger, len); +} + +static struct kobj_attribute on_restart_attr = +	__ATTR(on_restart, 0644, on_restart_show, on_restart_store); + +void do_restart(void) +{ +	smp_send_stop(); +	on_restart_trigger.action->fn(&on_restart_trigger); +	stop_run(&on_restart_trigger); +} +  /* on halt */  static struct shutdown_trigger on_halt_trigger = {ON_HALT_STR, &stop_action}; @@ -1783,7 +1819,9 @@ static void __init shutdown_triggers_init(void)  	if (sysfs_create_file(&shutdown_actions_kset->kobj,  			      &on_poff_attr.attr))  		goto fail; - +	if (sysfs_create_file(&shutdown_actions_kset->kobj, +			      &on_restart_attr.attr)) +		goto fail;  	return;  fail:  	panic("shutdown_triggers_init failed\n"); @@ -1959,6 +1997,12 @@ static void do_reset_calls(void)  {  	struct reset_call *reset; +#ifdef CONFIG_64BIT +	if (diag308_set_works) { +		diag308_reset(); +		return; +	} +#endif  	list_for_each_entry(reset, &rcall, list)  		reset->fn();  }  |