Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8691a729 authored by Richard Purdie's avatar Richard Purdie Committed by David Woodhouse
Browse files

[MTD] Add sync/unblank function to mtdoops



mtdoops wasn't ensuring data was flushed to flash in crash situations
after recent changes in mainline kernels as tracking the
oops_in_progress variable was no longer enough. We can use the "unblank"
console call as a sync call to tell us to write out the buffer though.

Therefore add a sync function to mtdoops and call this when console
unblank events occur.

Signed-off-by: default avatarRichard Purdie <rpurdie@openedhand.com>
Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
parent a2e96b62
Loading
Loading
Loading
Loading
+34 −23
Original line number Diff line number Diff line
@@ -250,19 +250,19 @@ static void mtdoops_notify_remove(struct mtd_info *mtd)
	flush_scheduled_work();
}


static void
mtdoops_console_write(struct console *co, const char *s, unsigned int count)
static void mtdoops_console_sync(void)
{
	struct mtdoops_context *cxt = co->data;
	struct mtdoops_context *cxt = &oops_cxt;
	struct mtd_info *mtd = cxt->mtd;
	int i, ret;
	size_t retlen;
	int ret;

	if (!cxt->ready || !mtd)
		return;

	if (!oops_in_progress && cxt->writecount != 0) {
		size_t retlen;
	if (cxt->writecount == 0)
		return;

	if (cxt->writecount < OOPS_PAGE_SIZE)
		memset(cxt->oops_buf + cxt->writecount, 0xff,
					OOPS_PAGE_SIZE - cxt->writecount);
@@ -273,17 +273,27 @@ mtdoops_console_write(struct console *co, const char *s, unsigned int count)
	cxt->writecount = 0;

	if ((retlen != OOPS_PAGE_SIZE) || (ret < 0))
			printk(KERN_ERR "mtdoops: Write failure at %d (%d of %d"
				" written), err %d.\n",
				cxt->nextpage * OOPS_PAGE_SIZE, retlen,
				OOPS_PAGE_SIZE, ret);
		printk(KERN_ERR "mtdoops: Write failure at %d (%d of %d written), err %d.\n",
			cxt->nextpage * OOPS_PAGE_SIZE, retlen,	OOPS_PAGE_SIZE, ret);

	ret = mtdoops_inc_counter(cxt);
	if (ret == 1)
		schedule_work(&cxt->work);
}

	if (!oops_in_progress)
static void
mtdoops_console_write(struct console *co, const char *s, unsigned int count)
{
	struct mtdoops_context *cxt = co->data;
	struct mtd_info *mtd = cxt->mtd;
	int i;

	if (!oops_in_progress) {
		mtdoops_console_sync();
		return;
	}

	if (!cxt->ready || !mtd)
		return;

	if (cxt->writecount == 0) {
@@ -323,6 +333,7 @@ static struct console mtdoops_console = {
	.name		= "ttyMTD",
	.write		= mtdoops_console_write,
	.setup		= mtdoops_console_setup,
	.unblank	= mtdoops_console_sync,
	.flags		= CON_PRINTBUFFER,
	.index		= -1,
	.data		= &oops_cxt,