greybus: manifest: remove extra loop for finding module descriptor
authorViresh Kumar <viresh.kumar@linaro.org>
Thu, 13 Nov 2014 12:44:40 +0000 (18:14 +0530)
committerGreg Kroah-Hartman <greg@kroah.com>
Fri, 14 Nov 2014 21:19:16 +0000 (13:19 -0800)
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/manifest.c

index 777abf400325826a996c01747d52ddc88067b78d..6b2c5ee03458cc31aa19b5d2e1f402092620710c 100644 (file)
@@ -54,7 +54,8 @@ static void release_manifest_descriptors(void)
  * Returns the number of bytes consumed by the descriptor, or a
  * negative errno.
  */
-static int identify_descriptor(struct greybus_descriptor *desc, size_t size)
+static int identify_descriptor(struct greybus_descriptor *desc, size_t size,
+                              bool *is_module)
 {
        struct greybus_descriptor_header *desc_header = &desc->header;
        struct manifest_desc *descriptor;
@@ -79,6 +80,7 @@ static int identify_descriptor(struct greybus_descriptor *desc, size_t size)
                                desc_size);
                        return -EINVAL;
                }
+               *is_module = true;
                break;
        case GREYBUS_TYPE_STRING:
                expected_size = sizeof(struct greybus_descriptor_header);
@@ -309,7 +311,7 @@ out_free_vendor_string:
  * the descriptors it contains, keeping track for each its type
  * and the location size of its data in the buffer.
  *
- * Next we scan the descriptors, looking for a module descriptor;
+ * We also identify the module descriptor during this iteration,
  * there must be exactly one of those.  When found, we record the
  * information it contains, and then remove that descriptor (and any
  * string descriptors it refers to) from further consideration.
@@ -359,8 +361,9 @@ bool gb_manifest_parse(struct gb_module *gmod, void *data, size_t size)
        size -= sizeof(*header);
        while (size) {
                int desc_size;
+               bool is_module = false;
 
-               desc_size = identify_descriptor(desc, size);
+               desc_size = identify_descriptor(desc, size, &is_module);
                if (desc_size <= 0) {
                        if (!desc_size)
                                pr_err("zero-sized manifest descriptor\n");
@@ -369,19 +372,17 @@ bool gb_manifest_parse(struct gb_module *gmod, void *data, size_t size)
                }
                desc = (struct greybus_descriptor *)((char *)desc + desc_size);
                size -= desc_size;
-       }
 
-       /* There must be a single module descriptor */
-       list_for_each_entry(descriptor, &manifest_descs, links) {
-               if (descriptor->type == GREYBUS_TYPE_MODULE)
-                       if (!found++)
+               if (is_module) {
+                       if (++found > 1) {
+                               pr_err("manifest must have 1 module descriptor (%u found)\n",
+                                       found);
+                               result = false;
+                               goto out;
+                       } else {
                                module_desc = descriptor;
-       }
-       if (found != 1) {
-               pr_err("manifest must have 1 module descriptor (%u found)\n",
-                       found);
-               result = false;
-               goto out;
+                       }
+               }
        }
 
        /* Parse the module manifest, starting with the module descriptor */