Esempio n. 1
0
File: ram.c Progetto: acton393/linux
static struct persistent_ram_zone *
ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,
		     u64 *id,
		     enum pstore_type_id *typep, enum pstore_type_id type,
		     bool update)
{
	struct persistent_ram_zone *prz;
	int i = (*c)++;

	if (i >= max)
		return NULL;

	prz = przs[i];
	if (!prz)
		return NULL;

	/* Update old/shadowed buffer. */
	if (update)
		persistent_ram_save_old(prz);

	if (!persistent_ram_old_size(prz))
		return NULL;

	*typep = type;
	*id = i;

	return prz;
}
static int __init __persistent_ram_init(struct persistent_ram_zone *prz,
			       void __iomem *mem, size_t buffer_size, bool ecc)
{
	struct persistent_ram_buffer *buffer = mem;
	int ret;

	INIT_LIST_HEAD(&prz->node);

	prz->buffer = buffer;
	prz->buffer_size = buffer_size - sizeof(struct persistent_ram_buffer);

	if (prz->buffer_size > buffer_size) {
		pr_err("persistent_ram: buffer %p, invalid size %zu, datasize %zu\n",
		       buffer, buffer_size, prz->buffer_size);
		return -EINVAL;
	}

	prz->ecc = ecc;
	ret = persistent_ram_init_ecc(prz, buffer_size);
	if (ret)
		return ret;

	if (buffer->sig == PERSISTENT_RAM_SIG) {
		if (buffer->size > prz->buffer_size
		    || buffer->start > buffer->size)
			pr_info("persistent_ram: found existing invalid buffer, size %d, start %d\n",
			       buffer->size, buffer->start);
		else {
			pr_info("persistent_ram: found existing buffer, size %d, start %d\n",
			       buffer->size, buffer->start);
			persistent_ram_save_old(prz);
		}
	} else {
		pr_info("persistent_ram: no valid data in buffer (sig = 0x%08x)\n",
			buffer->sig);
	}

	buffer->sig = PERSISTENT_RAM_SIG;
	buffer->start = 0;
	buffer->size = 0;

	list_add_tail(&prz->node, &zone_list);

	return 0;
}