From: Dragos Tatulea <dragos.tatu...@intel.com>

Added pstore_type_id in message header when storing to ram.
On write, take into account the contents of this header and
set the type accordingly.

Signed-off-by: Dragos Tatulea <dragos.tatu...@intel.com>
---
 fs/pstore/ram.c |   18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index 1a4f6da..e1684ef 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -157,23 +157,30 @@ static ssize_t ramoops_pstore_read(u64 *id, enum 
pstore_type_id *type,
        time->tv_nsec = 0;
 
        size = persistent_ram_old_size(prz);
+       if (!size)
+               return 0;
        *buf = kmalloc(size, GFP_KERNEL);
        if (*buf == NULL)
                return -ENOMEM;
        memcpy(*buf, persistent_ram_old(prz), size);
+       /* Read header. */
+       sscanf(*buf, "%u" RAMOOPS_KERNMSG_HDR "%lu.%lu",
+               type, &time->tv_sec, &time->tv_nsec);
+       time->tv_nsec *= 1000;
 
        return size;
 }
 
-static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz)
+static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz,
+                                    enum pstore_type_id type)
 {
        char *hdr;
        struct timeval timestamp;
        size_t len;
 
        do_gettimeofday(&timestamp);
-       hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR "%lu.%lu\n",
-               (long)timestamp.tv_sec, (long)timestamp.tv_usec);
+       hdr = kasprintf(GFP_ATOMIC, "%u" RAMOOPS_KERNMSG_HDR "%lu.%lu\n",
+               type, (long)timestamp.tv_sec, (long)timestamp.tv_usec);
        WARN_ON_ONCE(!hdr);
        len = hdr ? strlen(hdr) : 0;
        persistent_ram_write(prz, hdr, len);
@@ -204,9 +211,6 @@ static int notrace ramoops_pstore_write_buf(enum 
pstore_type_id type,
                return 0;
        }
 
-       if (type != PSTORE_TYPE_DMESG)
-               return -EINVAL;
-
        /* Out of the various dmesg dump types, ramoops is currently designed
         * to only store crash logs, rather than storing general kernel logs.
         */
@@ -226,7 +230,7 @@ static int notrace ramoops_pstore_write_buf(enum 
pstore_type_id type,
        if (part != 1)
                return -ENOSPC;
 
-       hlen = ramoops_write_kmsg_hdr(prz);
+       hlen = ramoops_write_kmsg_hdr(prz, type);
        if (size + hlen > prz->buffer_size)
                size = prz->buffer_size - hlen;
        persistent_ram_write(prz, buf, size);
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to