Skip to content

Commit

Permalink
pstore/ram: Factor ramoops_get_next_prz() out of ramoops_pstore_read()
Browse files Browse the repository at this point in the history
This will help make code clearer when we'll add support for other
message types.

The patch also changes return value from -EINVAL to 0 in case of
end-of-records. The exact value doesn't matter for pstore (it should
be just <= 0), but 0 feels more correct.

Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Acked-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Anton Vorontsov authored and Greg Kroah-Hartman committed Jun 13, 2012
1 parent f4c5d24 commit 755d66b
Showing 1 changed file with 32 additions and 9 deletions.
41 changes: 32 additions & 9 deletions fs/pstore/ram.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,33 @@ static int ramoops_pstore_open(struct pstore_info *psi)
return 0;
}

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 (update) {
/* Update old/shadowed buffer. */
persistent_ram_save_old(prz);
if (!persistent_ram_old_size(prz))
return NULL;
}

*typep = type;
*id = i;

return prz;
}

static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
struct timespec *time,
char **buf,
Expand All @@ -94,20 +121,16 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
struct ramoops_context *cxt = psi->data;
struct persistent_ram_zone *prz;

if (cxt->dump_read_cnt >= cxt->max_dump_cnt)
return -EINVAL;

*id = cxt->dump_read_cnt++;
prz = cxt->przs[*id];
prz = ramoops_get_next_prz(cxt->przs, &cxt->dump_read_cnt,
cxt->max_dump_cnt, id, type,
PSTORE_TYPE_DMESG, 1);
if (!prz)
return 0;

/* Only supports dmesg output so far. */
*type = PSTORE_TYPE_DMESG;
/* TODO(kees): Bogus time for the moment. */
time->tv_sec = 0;
time->tv_nsec = 0;

/* Update old/shadowed buffer. */
persistent_ram_save_old(prz);
size = persistent_ram_old_size(prz);
*buf = kmalloc(size, GFP_KERNEL);
if (*buf == NULL)
Expand Down

0 comments on commit 755d66b

Please sign in to comment.