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; }