pstore/ram: Factor ramoops_get_next_prz() out of ramoops_pstore_read()
authorAnton Vorontsov <anton.vorontsov@linaro.org>
Sat, 26 May 2012 13:20:22 +0000 (06:20 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Jun 2012 23:59:28 +0000 (16:59 -0700)
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>
fs/pstore/ram.c

index 6b767673849371f51fdcc4b46293dd4d0f91856e..d770d7266e96084dfa8fc8d2d0ceaa3adee438b0 100644 (file)
@@ -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,
@@ -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)