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; unsigned long flags; if (!oops_in_progress) { mtdoops_console_sync(); return; } if (!cxt->ready || !mtd) return; spin_lock_irqsave(&cxt->writecount_lock, flags); if (!cxt->ready) { spin_unlock_irqrestore(&cxt->writecount_lock, flags); return; } if (cxt->writecount == 0) { u32 *stamp = cxt->oops_buf; *stamp++ = cxt->nextcount; *stamp = MTDOOPS_KERNMSG_MAGIC; cxt->writecount = 8; } if ((count + cxt->writecount) > OOPS_PAGE_SIZE) count = OOPS_PAGE_SIZE - cxt->writecount; memcpy(cxt->oops_buf + cxt->writecount, s, count); cxt->writecount += count; spin_unlock_irqrestore(&cxt->writecount_lock, flags); if (cxt->writecount == OOPS_PAGE_SIZE) mtdoops_console_sync(); }
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; unsigned long flags; if (!oops_in_progress) { mtdoops_console_sync(); return; } if (!cxt->ready || !mtd) return; /* Locking on writecount ensures sequential writes to the buffer */ spin_lock_irqsave(&cxt->writecount_lock, flags); /* Check ready status didn't change whilst waiting for the lock */ if (!cxt->ready) { spin_unlock_irqrestore(&cxt->writecount_lock, flags); return; } if (cxt->writecount == 0) { u32 *stamp = cxt->oops_buf; *stamp++ = cxt->nextcount; *stamp = MTDOOPS_KERNMSG_MAGIC; cxt->writecount = 8; } if ((count + cxt->writecount) > OOPS_PAGE_SIZE) count = OOPS_PAGE_SIZE - cxt->writecount; memcpy(cxt->oops_buf + cxt->writecount, s, count); cxt->writecount += count; spin_unlock_irqrestore(&cxt->writecount_lock, flags); if (cxt->writecount == OOPS_PAGE_SIZE) mtdoops_console_sync(); }