diff options
Diffstat (limited to 'fs/pstore/platform.c')
| -rw-r--r-- | fs/pstore/platform.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 82c585f715e..61461ed9b6c 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -1,6 +1,7 @@  /*   * Persistent Storage - platform driver interface parts.   * + * Copyright (C) 2007-2008 Google, Inc.   * Copyright (C) 2010 Intel Corporation <tony.luck@intel.com>   *   *  This program is free software; you can redistribute it and/or modify @@ -22,6 +23,7 @@  #include <linux/errno.h>  #include <linux/init.h>  #include <linux/kmsg_dump.h> +#include <linux/console.h>  #include <linux/module.h>  #include <linux/pstore.h>  #include <linux/string.h> @@ -156,6 +158,40 @@ static struct kmsg_dumper pstore_dumper = {  	.dump = pstore_dump,  }; +#ifdef CONFIG_PSTORE_CONSOLE +static void pstore_console_write(struct console *con, const char *s, unsigned c) +{ +	const char *e = s + c; + +	while (s < e) { +		unsigned long flags; + +		if (c > psinfo->bufsize) +			c = psinfo->bufsize; +		spin_lock_irqsave(&psinfo->buf_lock, flags); +		memcpy(psinfo->buf, s, c); +		psinfo->write(PSTORE_TYPE_CONSOLE, 0, NULL, 0, c, psinfo); +		spin_unlock_irqrestore(&psinfo->buf_lock, flags); +		s += c; +		c = e - s; +	} +} + +static struct console pstore_console = { +	.name	= "pstore", +	.write	= pstore_console_write, +	.flags	= CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME, +	.index	= -1, +}; + +static void pstore_register_console(void) +{ +	register_console(&pstore_console); +} +#else +static void pstore_register_console(void) {} +#endif +  /*   * platform specific persistent storage driver registers with   * us here. If pstore is already mounted, call the platform @@ -193,6 +229,7 @@ int pstore_register(struct pstore_info *psi)  		pstore_get_records(0);  	kmsg_dump_register(&pstore_dumper); +	pstore_register_console();  	pstore_timer.expires = jiffies + PSTORE_INTERVAL;  	add_timer(&pstore_timer);  |