Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f8f80f0 authored by Aruna Balakrishnaiah's avatar Aruna Balakrishnaiah Committed by Tony Luck
Browse files

pstore/ram: Read and write to the 'compressed' flag of pstore



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: default avatarAruna Balakrishnaiah <aruna@linux.vnet.ibm.com>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent f8c62f34
Loading
Loading
Loading
Loading
+28 −8
Original line number Original line Diff line number Diff line
@@ -131,6 +131,27 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,
	return prz;
	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,
static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
				   int *count, struct timespec *time,
				   int *count, struct timespec *time,
				   char **buf, bool *compressed,
				   char **buf, bool *compressed,
@@ -153,10 +174,6 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
	if (!prz)
	if (!prz)
		return 0;
		return 0;


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

	size = persistent_ram_old_size(prz);
	size = persistent_ram_old_size(prz);


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


	memcpy(*buf, persistent_ram_old(prz), size);
	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);
	persistent_ram_ecc_string(prz, *buf + size, ecc_notice_size + 1);


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


	prz = cxt->przs[cxt->dump_write_cnt];
	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)
	if (size + hlen > prz->buffer_size)
		size = prz->buffer_size - hlen;
		size = prz->buffer_size - hlen;
	persistent_ram_write(prz, buf, size);
	persistent_ram_write(prz, buf, size);