Skip to content

Commit

Permalink
pstore/ram: Read and write to the 'compressed' flag of pstore
Browse files Browse the repository at this point in the history
In pstore write, add character 'C'(compressed) or 'D'(decompressed)
in the header while writing to Ram persistent buffer. In pstore read,
read the header and update the 'compressed' flag accordingly.

Signed-off-by: Aruna Balakrishnaiah <aruna@linux.vnet.ibm.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Tony Luck <tony.luck@intel.com>
  • Loading branch information
Aruna Balakrishnaiah authored and Tony Luck committed Aug 19, 2013
1 parent f8c62f3 commit 3f8f80f
Showing 1 changed file with 28 additions and 8 deletions.
36 changes: 28 additions & 8 deletions fs/pstore/ram.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,27 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,
return prz;
}

static void ramoops_read_kmsg_hdr(char *buffer, struct timespec *time,
bool *compressed)
{
char data_type;

if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lu.%lu-%c\n",
&time->tv_sec, &time->tv_nsec, &data_type) == 3) {
if (data_type == 'C')
*compressed = true;
else
*compressed = false;
} else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lu.%lu\n",
&time->tv_sec, &time->tv_nsec) == 2) {
*compressed = false;
} else {
time->tv_sec = 0;
time->tv_nsec = 0;
*compressed = false;
}
}

static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
int *count, struct timespec *time,
char **buf, bool *compressed,
Expand All @@ -153,10 +174,6 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
if (!prz)
return 0;

/* TODO(kees): Bogus time for the moment. */
time->tv_sec = 0;
time->tv_nsec = 0;

size = persistent_ram_old_size(prz);

/* ECC correction notice */
Expand All @@ -167,12 +184,14 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
return -ENOMEM;

memcpy(*buf, persistent_ram_old(prz), size);
ramoops_read_kmsg_hdr(*buf, time, compressed);
persistent_ram_ecc_string(prz, *buf + size, ecc_notice_size + 1);

return size + ecc_notice_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,
bool compressed)
{
char *hdr;
struct timespec timestamp;
Expand All @@ -183,8 +202,9 @@ static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz)
timestamp.tv_sec = 0;
timestamp.tv_nsec = 0;
}
hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR "%lu.%lu\n",
(long)timestamp.tv_sec, (long)(timestamp.tv_nsec / 1000));
hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR "%lu.%lu-%c\n",
(long)timestamp.tv_sec, (long)(timestamp.tv_nsec / 1000),
compressed ? 'C' : 'D');
WARN_ON_ONCE(!hdr);
len = hdr ? strlen(hdr) : 0;
persistent_ram_write(prz, hdr, len);
Expand Down Expand Up @@ -243,7 +263,7 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type,

prz = cxt->przs[cxt->dump_write_cnt];

hlen = ramoops_write_kmsg_hdr(prz);
hlen = ramoops_write_kmsg_hdr(prz, compressed);
if (size + hlen > prz->buffer_size)
size = prz->buffer_size - hlen;
persistent_ram_write(prz, buf, size);
Expand Down

0 comments on commit 3f8f80f

Please sign in to comment.