Messages in this thread Patch in this message | | | From | Peng Wang <> | Subject | [PATCH v4] pstore: Avoid duplicate call of persistent_ram_zap() | Date | Tue, 30 Oct 2018 15:52:34 +0800 |
| |
When initialing prz with invalid data in buffer(no PERSISTENT_RAM_SIG), function call path is like this:
ramoops_init_prz -> | |-> persistent_ram_new -> persistent_ram_post_init -> persistent_ram_zap | |-> persistent_ram_zap
As we can see, persistent_ram_zap() is called twice. We can avoid this by adding an option to persistent_ram_new(), and only call persistent_ram_zap() when it is needed.
Signed-off-by: Peng Wang <wangpeng15@xiaomi.com> --- fs/pstore/ram.c | 4 +--- fs/pstore/ram_core.c | 5 +++-- include/linux/pstore_ram.h | 1 + 3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index ffcff6516e89..b51901f97dc2 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -640,7 +640,7 @@ static int ramoops_init_prz(const char *name, label = kasprintf(GFP_KERNEL, "ramoops:%s", name); *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info, - cxt->memtype, 0, label); + cxt->memtype, PRZ_FLAG_ZAP_OLD, label); if (IS_ERR(*prz)) { int err = PTR_ERR(*prz); @@ -649,8 +649,6 @@ static int ramoops_init_prz(const char *name, return err; } - persistent_ram_zap(*prz); - *paddr += sz; return 0; diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index 12e21f789194..2ededd1ea1c2 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -505,15 +505,16 @@ static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig, pr_debug("found existing buffer, size %zu, start %zu\n", buffer_size(prz), buffer_start(prz)); persistent_ram_save_old(prz); - return 0; + if (!(prz->flags & PRZ_FLAG_ZAP_OLD)) + return 0; } } else { pr_debug("no valid data in buffer (sig = 0x%08x)\n", prz->buffer->sig); + prz->buffer->sig = sig; } /* Rewind missing or invalid memory area. */ - prz->buffer->sig = sig; persistent_ram_zap(prz); return 0; diff --git a/include/linux/pstore_ram.h b/include/linux/pstore_ram.h index 602d64725222..6e94980357d2 100644 --- a/include/linux/pstore_ram.h +++ b/include/linux/pstore_ram.h @@ -30,6 +30,7 @@ * PRZ_FLAG_NO_LOCK is used. For all other cases, locking is required. */ #define PRZ_FLAG_NO_LOCK BIT(0) +#define PRZ_FLAG_ZAP_OLD BIT(1) struct persistent_ram_buffer; struct rs_control; -- 2.19.1
| |