| From a5b85db8339e4490a272fa3969f19085c6b8372e Mon Sep 17 00:00:00 2001 |
| From: Aleksandr Yashkin <a.yashkin@inango-systems.com> |
| Date: Mon, 23 Dec 2019 18:38:16 +0500 |
| Subject: [PATCH] pstore/ram: Write new dumps to start of recycled zones |
| |
| commit 9e5f1c19800b808a37fb9815a26d382132c26c3d upstream. |
| |
| The ram_core.c routines treat przs as circular buffers. When writing a |
| new crash dump, the old buffer needs to be cleared so that the new dump |
| doesn't end up in the wrong place (i.e. at the end). |
| |
| The solution to this problem is to reset the circular buffer state before |
| writing a new Oops dump. |
| |
| Signed-off-by: Aleksandr Yashkin <a.yashkin@inango-systems.com> |
| Signed-off-by: Nikolay Merinov <n.merinov@inango-systems.com> |
| Signed-off-by: Ariel Gilman <a.gilman@inango-systems.com> |
| Link: https://lore.kernel.org/r/20191223133816.28155-1-n.merinov@inango-systems.com |
| Fixes: 896fc1f0c4c6 ("pstore/ram: Switch to persistent_ram routines") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Kees Cook <keescook@chromium.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c |
| index db9f67d34af3..b345f8b6d255 100644 |
| --- a/fs/pstore/ram.c |
| +++ b/fs/pstore/ram.c |
| @@ -407,6 +407,17 @@ static int notrace ramoops_pstore_write(struct pstore_record *record) |
| |
| prz = cxt->dprzs[cxt->dump_write_cnt]; |
| |
| + /* |
| + * Since this is a new crash dump, we need to reset the buffer in |
| + * case it still has an old dump present. Without this, the new dump |
| + * will get appended, which would seriously confuse anything trying |
| + * to check dump file contents. Specifically, ramoops_read_kmsg_hdr() |
| + * expects to find a dump header in the beginning of buffer data, so |
| + * we must to reset the buffer values, in order to ensure that the |
| + * header will be written to the beginning of the buffer. |
| + */ |
| + persistent_ram_zap(prz); |
| + |
| /* Build header and append record contents. */ |
| hlen = ramoops_write_kmsg_hdr(prz, record); |
| if (!hlen) |
| -- |
| 2.7.4 |
| |