From ba705a7f769b80c3ac38e31db0e3cac003fa1052 Mon Sep 17 00:00:00 2001 From: Anton Vorontsov Date: Sat, 26 May 2012 06:07:49 -0700 Subject: [PATCH] --- yaml --- r: 311159 b: refs/heads/master c: 201e4aca5aa179e6c69a4dcd36a3562e56b8d670 h: refs/heads/master i: 311157: 8a09ffddba059c2cfc08bf686d49d4ab87caf97a 311155: 5b02d97e14dd485fbfc0aff109eda85c5720b8a0 311151: 3222b2bddc92fbf2b4e08df67891c288da8114a5 v: v3 --- [refs] | 2 +- trunk/fs/pstore/ram.c | 2 ++ trunk/fs/pstore/ram_core.c | 15 ++++++++------- trunk/include/linux/pstore_ram.h | 1 + 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index e28f171a2de7..6dab8c015151 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 33735a94afdfb39c550b952a40f77c60afdddfa5 +refs/heads/master: 201e4aca5aa179e6c69a4dcd36a3562e56b8d670 diff --git a/trunk/fs/pstore/ram.c b/trunk/fs/pstore/ram.c index 9123cce28c1e..16ff7332eae0 100644 --- a/trunk/fs/pstore/ram.c +++ b/trunk/fs/pstore/ram.c @@ -106,6 +106,8 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type, time->tv_sec = 0; time->tv_nsec = 0; + /* Update old/shadowed buffer. */ + persistent_ram_save_old(prz); size = persistent_ram_old_size(prz); *buf = kmalloc(size, GFP_KERNEL); if (*buf == NULL) diff --git a/trunk/fs/pstore/ram_core.c b/trunk/fs/pstore/ram_core.c index 31f8d184f3a0..235513c46aaf 100644 --- a/trunk/fs/pstore/ram_core.c +++ b/trunk/fs/pstore/ram_core.c @@ -250,23 +250,24 @@ static void notrace persistent_ram_update(struct persistent_ram_zone *prz, persistent_ram_update_ecc(prz, start, count); } -static void __init -persistent_ram_save_old(struct persistent_ram_zone *prz) +void persistent_ram_save_old(struct persistent_ram_zone *prz) { struct persistent_ram_buffer *buffer = prz->buffer; size_t size = buffer_size(prz); size_t start = buffer_start(prz); - char *dest; - persistent_ram_ecc_old(prz); + if (!size) + return; - dest = kmalloc(size, GFP_KERNEL); - if (dest == NULL) { + if (!prz->old_log) { + persistent_ram_ecc_old(prz); + prz->old_log = kmalloc(size, GFP_KERNEL); + } + if (!prz->old_log) { pr_err("persistent_ram: failed to allocate buffer\n"); return; } - prz->old_log = dest; prz->old_log_size = size; memcpy(prz->old_log, &buffer->data[start], size - start); memcpy(prz->old_log + size - start, &buffer->data[0], start); diff --git a/trunk/include/linux/pstore_ram.h b/trunk/include/linux/pstore_ram.h index 7ed7fd4dba49..4491e8ff36e6 100644 --- a/trunk/include/linux/pstore_ram.h +++ b/trunk/include/linux/pstore_ram.h @@ -75,6 +75,7 @@ struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev, int persistent_ram_write(struct persistent_ram_zone *prz, const void *s, unsigned int count); +void persistent_ram_save_old(struct persistent_ram_zone *prz); size_t persistent_ram_old_size(struct persistent_ram_zone *prz); void *persistent_ram_old(struct persistent_ram_zone *prz); void persistent_ram_free_old(struct persistent_ram_zone *prz);