Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806973/?format=api
{ "id": 806973, "url": "http://patchwork.ozlabs.org/api/patches/806973/?format=api", "web_url": "http://patchwork.ozlabs.org/project/skiboot/patch/20170829062506.8317-11-cyril.bur@au1.ibm.com/", "project": { "id": 44, "url": "http://patchwork.ozlabs.org/api/projects/44/?format=api", "name": "skiboot firmware development", "link_name": "skiboot", "list_id": "skiboot.lists.ozlabs.org", "list_email": "skiboot@lists.ozlabs.org", "web_url": "http://github.com/open-power/skiboot", "scm_url": "http://github.com/open-power/skiboot", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170829062506.8317-11-cyril.bur@au1.ibm.com>", "list_archive_url": null, "date": "2017-08-29T06:25:03", "name": "[RFC,10/13] libflash/libffs: Switch to storing header entries in an array", "commit_ref": null, "pull_url": null, "state": "rfc", "archived": false, "hash": "9db778ca8f37df50a656d8b83f70c66e9c087a87", "submitter": { "id": 64738, "url": "http://patchwork.ozlabs.org/api/people/64738/?format=api", "name": "Cyril Bur", "email": "cyril.bur@au1.ibm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/skiboot/patch/20170829062506.8317-11-cyril.bur@au1.ibm.com/mbox/", "series": [ { "id": 313, "url": "http://patchwork.ozlabs.org/api/series/313/?format=api", "web_url": "http://patchwork.ozlabs.org/project/skiboot/list/?series=313", "date": "2017-08-29T06:24:53", "name": "Rework flash TOC generation", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/313/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806973/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806973/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "skiboot@lists.ozlabs.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "skiboot@lists.ozlabs.org" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68])\n\t(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xhJxJ4XfYz9ryr\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 16:43:16 +1000 (AEST)", "from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 3xhJxJ2LyhzDrL5\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 16:43:16 +1000 (AEST)", "from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com\n\t[148.163.156.1])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 3xhJY6256FzDqZv\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 16:25:46 +1000 (AEST)", "from pps.filterd (m0098404.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv7T6ODtx118002\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 02:25:42 -0400", "from e23smtp07.au.ibm.com (e23smtp07.au.ibm.com [202.81.31.140])\n\tby mx0a-001b2d01.pphosted.com with ESMTP id 2cmwgam291-1\n\t(version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT)\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 02:25:41 -0400", "from localhost\n\tby e23smtp07.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use\n\tOnly! Violators will be prosecuted\n\tfor <skiboot@lists.ozlabs.org> from <cyril.bur@au1.ibm.com>;\n\tTue, 29 Aug 2017 16:25:39 +1000", "from d23relay08.au.ibm.com (202.81.31.227)\n\tby e23smtp07.au.ibm.com (202.81.31.204) with IBM ESMTP SMTP Gateway:\n\tAuthorized Use Only! Violators will be prosecuted; \n\tTue, 29 Aug 2017 16:25:37 +1000", "from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139])\n\tby d23relay08.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n\tv7T6PaYZ42991796\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 16:25:36 +1000", "from d23av04.au.ibm.com (localhost [127.0.0.1])\n\tby d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id\n\tv7T6PbQs017781\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 16:25:37 +1000", "from ozlabs.au.ibm.com (ozlabs.au.ibm.com [9.192.253.14])\n\tby d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id\n\tv7T6PaUA017743; Tue, 29 Aug 2017 16:25:36 +1000", "from camb691.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114])\n\t(using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby ozlabs.au.ibm.com (Postfix) with ESMTPSA id 89FB7A038A;\n\tTue, 29 Aug 2017 16:25:35 +1000 (AEST)" ], "From": "Cyril Bur <cyril.bur@au1.ibm.com>", "To": "skiboot@lists.ozlabs.org, stewart@linux.vnet.ibm.com", "Date": "Tue, 29 Aug 2017 16:25:03 +1000", "X-Mailer": "git-send-email 2.14.1", "In-Reply-To": "<20170829062506.8317-1-cyril.bur@au1.ibm.com>", "References": "<20170829062506.8317-1-cyril.bur@au1.ibm.com>", "X-TM-AS-MML": "disable", "x-cbid": "17082906-0044-0000-0000-0000028433F2", "X-IBM-AV-DETECTION": "SAVI=unused REMOTE=unused XFE=unused", "x-cbparentid": "17082906-0045-0000-0000-00000717AFD4", "Message-Id": "<20170829062506.8317-11-cyril.bur@au1.ibm.com>", "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10432:, ,\n\tdefinitions=2017-08-29_01:, , signatures=0", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n\tspamscore=0 suspectscore=2\n\tmalwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam\n\tadjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000\n\tdefinitions=main-1708290096", "Subject": "[Skiboot] [RFC PATCH 10/13] libflash/libffs: Switch to storing\n\theader entries in an array", "X-BeenThere": "skiboot@lists.ozlabs.org", "X-Mailman-Version": "2.1.23", "Precedence": "list", "List-Id": "Mailing list for skiboot development <skiboot.lists.ozlabs.org>", "List-Unsubscribe": "<https://lists.ozlabs.org/options/skiboot>,\n\t<mailto:skiboot-request@lists.ozlabs.org?subject=unsubscribe>", "List-Archive": "<http://lists.ozlabs.org/pipermail/skiboot/>", "List-Post": "<mailto:skiboot@lists.ozlabs.org>", "List-Help": "<mailto:skiboot-request@lists.ozlabs.org?subject=help>", "List-Subscribe": "<https://lists.ozlabs.org/listinfo/skiboot>,\n\t<mailto:skiboot-request@lists.ozlabs.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org", "Sender": "\"Skiboot\"\n\t<skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>" }, "content": "Since the libffs no longer needs to sort the entries as they get added\nit makes little sense to have the complexity of a linked list when an\narray will suffice.\n\nSigned-off-by: Cyril Bur <cyril.bur@au1.ibm.com>\n---\n external/ffspart/test/results/05-hdr-overlap.out | 1 -\n external/ffspart/test/results/06-small-flash.out | 1 -\n external/ffspart/test/results/07-big-files.out | 1 -\n external/ffspart/test/results/08-small-files.out | 1 -\n external/ffspart/test/results/10-bad-input.out | 1 -\n external/ffspart/test/results/11-long-name.out | 1 -\n .../ffspart/test/results/12-bad-numbers-base.out | 1 -\n .../ffspart/test/results/13-bad-numbers-size.out | 1 -\n .../ffspart/test/results/14-bad-input-flags.out | 1 -\n .../test/results/15-overlapping-partitions.out | 1 -\n libflash/ffs.h | 8 +-\n libflash/libffs.c | 128 +++++++++++----------\n 12 files changed, 70 insertions(+), 76 deletions(-)", "diff": "diff --git a/external/ffspart/test/results/05-hdr-overlap.out b/external/ffspart/test/results/05-hdr-overlap.out\nindex dbcdcb1d..2dbf5a43 100644\n--- a/external/ffspart/test/results/05-hdr-overlap.out\n+++ b/external/ffspart/test/results/05-hdr-overlap.out\n@@ -1,4 +1,3 @@\n Adding 'ONE' 0x00000200, 0x00000100\n Adding 'TWO' 0x00000300, 0x00000100\n Adding 'THREE' 0x00000400, 0x00000100\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/06-small-flash.out b/external/ffspart/test/results/06-small-flash.out\nindex c59579eb..25214672 100644\n--- a/external/ffspart/test/results/06-small-flash.out\n+++ b/external/ffspart/test/results/06-small-flash.out\n@@ -1,3 +1,2 @@\n Adding 'ONE' 0x00000300, 0x00000100\n Adding 'TWO' 0x00000400, 0x00000100\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/07-big-files.out b/external/ffspart/test/results/07-big-files.out\nindex 83929738..0555381e 100644\n--- a/external/ffspart/test/results/07-big-files.out\n+++ b/external/ffspart/test/results/07-big-files.out\n@@ -1,2 +1 @@\n Adding 'ONE' 0x00000300, 0x00000100\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/08-small-files.out b/external/ffspart/test/results/08-small-files.out\nindex 9c39b050..fdf70bf8 100644\n--- a/external/ffspart/test/results/08-small-files.out\n+++ b/external/ffspart/test/results/08-small-files.out\n@@ -2,4 +2,3 @@ Adding 'ONE' 0x00000300, 0x00000100\n Adding 'TWO' 0x00000400, 0x00000100\n Adding 'THREE' 0x00000500, 0x00000100\n Adding 'FOUR' 0x00000600, 0x00000100\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/10-bad-input.out b/external/ffspart/test/results/10-bad-input.out\nindex aad57ac2..e69de29b 100644\n--- a/external/ffspart/test/results/10-bad-input.out\n+++ b/external/ffspart/test/results/10-bad-input.out\n@@ -1 +0,0 @@\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/11-long-name.out b/external/ffspart/test/results/11-long-name.out\nindex 030fc11b..2d7dcb32 100644\n--- a/external/ffspart/test/results/11-long-name.out\n+++ b/external/ffspart/test/results/11-long-name.out\n@@ -2,4 +2,3 @@ Adding 'This_is_more_than_15_characters' 0x00000300, 0x00000100\n Adding 'This_is_exactly' 0x00000400, 0x00000100\n Adding 'This_is_one_le' 0x00000500, 0x00000100\n Adding 'This_is_one_more' 0x00000600, 0x00000100\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/12-bad-numbers-base.out b/external/ffspart/test/results/12-bad-numbers-base.out\nindex aad57ac2..e69de29b 100644\n--- a/external/ffspart/test/results/12-bad-numbers-base.out\n+++ b/external/ffspart/test/results/12-bad-numbers-base.out\n@@ -1 +0,0 @@\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/13-bad-numbers-size.out b/external/ffspart/test/results/13-bad-numbers-size.out\nindex aad57ac2..e69de29b 100644\n--- a/external/ffspart/test/results/13-bad-numbers-size.out\n+++ b/external/ffspart/test/results/13-bad-numbers-size.out\n@@ -1 +0,0 @@\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/14-bad-input-flags.out b/external/ffspart/test/results/14-bad-input-flags.out\nindex aad57ac2..e69de29b 100644\n--- a/external/ffspart/test/results/14-bad-input-flags.out\n+++ b/external/ffspart/test/results/14-bad-input-flags.out\n@@ -1 +0,0 @@\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/15-overlapping-partitions.out b/external/ffspart/test/results/15-overlapping-partitions.out\nindex 874953b2..04e04c30 100644\n--- a/external/ffspart/test/results/15-overlapping-partitions.out\n+++ b/external/ffspart/test/results/15-overlapping-partitions.out\n@@ -1,3 +1,2 @@\n Adding 'ONE' 0x00000300, 0x00000100\n Adding 'TWO' 0x00000350, 0x00000100\n-Freeing hdr\ndiff --git a/libflash/ffs.h b/libflash/ffs.h\nindex 957155b9..7a362215 100644\n--- a/libflash/ffs.h\n+++ b/libflash/ffs.h\n@@ -159,7 +159,6 @@ struct ffs_entry {\n \tenum ffs_type type;\n \tuint32_t flags;\n \tstruct ffs_entry_user user;\n-\tstruct list_node list;\n };\n \n \n@@ -204,7 +203,8 @@ struct __ffs_hdr {\n * @size:\t\tSize of partition table (in bytes)\n * @block_size:\t\tSize of block on device (in bytes)\n * @block_count:\tNumber of blocks on device.\n- * @entries:\t\tList of partition entries\n+ * @count:\t\tCount of the number of entires\n+ * @entries:\t\tArray of partition entries.\n */\n struct ffs_hdr {\n \tuint32_t version;\n@@ -212,8 +212,10 @@ struct ffs_hdr {\n \tuint32_t size;\n \tuint32_t block_size;\n \tuint32_t block_count;\n+\tuint32_t count;\n \tstruct ffs_entry *part;\n-\tstruct list_head entries;\n+\tstruct ffs_entry **entries;\n+\tunsigned int entries_size;\n };\n \n #endif /* __FFS_H__ */\ndiff --git a/libflash/libffs.c b/libflash/libffs.c\nindex 5888c73f..8c46ce7e 100644\n--- a/libflash/libffs.c\n+++ b/libflash/libffs.c\n@@ -36,6 +36,7 @@ static void *calloc(size_t num, size_t size)\n #include \"ffs.h\"\n \n #define __unused __attribute__((unused))\n+#define HDR_ENTRIES_NUM 30\n \n struct ffs_handle {\n \tstruct ffs_hdr\t\thdr;\t/* Converted header */\n@@ -73,13 +74,9 @@ static size_t ffs_hdr_raw_size(int num_entries)\n \n static int ffs_num_entries(struct ffs_hdr *hdr)\n {\n-\tstruct ffs_entry *ent;\n-\tint num_entries = 0;\n-\tlist_for_each(&hdr->entries, ent, list)\n-\t\tnum_entries++;\n-\tif (num_entries == 0)\n+\tif (hdr->count == 0)\n \t\tFL_DBG(\"%s returned zero!\\n\", __func__);\n-\treturn num_entries;\n+\treturn hdr->count;\n }\n \n static int ffs_check_convert_header(struct ffs_hdr *dst, struct __ffs_hdr *src)\n@@ -100,6 +97,7 @@ static int ffs_check_convert_header(struct ffs_hdr *dst, struct __ffs_hdr *src)\n \tdst->block_size = be32_to_cpu(src->block_size);\n \tdst->size = be32_to_cpu(src->size) * dst->block_size;\n \tdst->block_count = be32_to_cpu(src->block_count);\n+\tdst->entries_size = be32_to_cpu(src->entry_count);\n \n \treturn 0;\n }\n@@ -129,21 +127,16 @@ static int ffs_entry_user_to_cpu(struct ffs_hdr *hdr __unused,\n static int ffs_entry_to_flash(struct ffs_hdr *hdr,\n \t\tstruct __ffs_entry *dst, struct ffs_entry *src)\n {\n-\tint rc, index = 1; /* On flash indexes start at 1 */\n-\tstruct ffs_entry *ent = NULL;\n+\tint rc, index;\n \n \tif (!hdr || !dst || !src)\n \t\treturn -1;\n \n-\tlist_for_each(&hdr->entries, ent, list) {\n-\t\tif (ent == src)\n-\t\t\tbreak;\n-\t\tindex++;\n-\t}\n+\tfor (index = 0; index < hdr->count && hdr->entries[index] != src; index++);\n \n-\tif (!ent)\n+\tif (index == hdr->count)\n \t\treturn FFS_ERR_PART_NOT_FOUND;\n-\n+\tindex++; /* On flash indexes start at 1 */\n \t/*\n \t * So that the checksum gets calculated correctly at least the\n \t * dst->checksum must be zero before calling ffs_entry_checksum()\n@@ -277,15 +270,9 @@ bool has_flag(struct ffs_entry *ent, uint16_t flag)\n \n struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index)\n {\n-\tint i = 0;\n-\tstruct ffs_entry *ent = NULL;\n-\n-\tlist_for_each(&ffs->hdr.entries, ent, list)\n-\t\tif (i++ == index)\n-\t\t\treturn ent;\n-\n-\t/* Didn't find partition */\n-\treturn NULL;\n+\tif (!ffs || index >= ffs->hdr.count)\n+\t\treturn NULL;\n+\treturn ffs->hdr.entries[index];\n }\n \n bool has_ecc(struct ffs_entry *ent)\n@@ -351,7 +338,6 @@ int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,\n \tf->toc_offset = offset;\n \tf->max_size = max_size;\n \tf->bl = bl;\n-\tlist_head_init(&f->hdr.entries);\n \n \t/* Convert and check flash header */\n \trc = ffs_check_convert_header(&f->hdr, &raw_hdr);\n@@ -367,6 +353,8 @@ int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,\n \t\tgoto out;\n \t}\n \n+\tf->hdr.entries = calloc(f->hdr.entries_size, sizeof(struct ffs_entry *));\n+\n \t/*\n \t * Grab the entire partition header\n \t */\n@@ -394,14 +382,14 @@ int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,\n \t\tgoto out;\n \t}\n \n-\tfor (i = 0; i < be32_to_cpu(raw_hdr.entry_count); i++) {\n+\tfor (i = 0; i < f->hdr.entries_size; i++) {\n \t\tstruct ffs_entry *ent = calloc(1, sizeof(struct ffs_entry));\n \t\tif (!ent) {\n \t\t\trc = FLASH_ERR_MALLOC_FAILED;\n \t\t\tgoto out;\n \t\t}\n \n-\t\tlist_add_tail(&f->hdr.entries, &ent->list);\n+\t\tf->hdr.entries[f->hdr.count++] = ent;\n \t\trc = ffs_entry_to_cpu(&f->hdr, ent, &f->cache->entries[i]);\n \t\tif (rc) {\n \t\t\tFL_DBG(\"FFS: Failed checksum for partition %s\\n\",\n@@ -430,20 +418,20 @@ out:\n \n static void __hdr_free(struct ffs_hdr *hdr)\n {\n-\tstruct ffs_entry *ent, *next;\n+\tint i;\n \n-\tlist_for_each_safe(&hdr->entries, ent, next, list) {\n-\t\tlist_del(&ent->list);\n-\t\tfree(ent);\n-\t}\n+\tif (!hdr)\n+\t\treturn;\n+\n+\tfor (i = 0; i < hdr->count; i++)\n+\t\tfree(hdr->entries[i]);\n+\tfree(hdr->entries);\n }\n \n int ffs_hdr_free(struct ffs_hdr *hdr)\n {\n-\tprintf(\"Freeing hdr\\n\");\n \t__hdr_free(hdr);\n \tfree(hdr);\n-\n \treturn 0;\n }\n \n@@ -460,20 +448,20 @@ void ffs_close(struct ffs_handle *ffs)\n int ffs_lookup_part(struct ffs_handle *ffs, const char *name,\n \t\t uint32_t *part_idx)\n {\n-\tstruct ffs_entry *ent = NULL;\n-\tint i = 0, rc = FFS_ERR_PART_NOT_FOUND;\n+\tstruct ffs_entry **ents = ffs->hdr.entries;\n+\tint i;\n \n-\tlist_for_each(&ffs->hdr.entries, ent, list) {\n-\t\tif (strncmp(name, ent->name, sizeof(ent->name)) == 0) {\n-\t\t\trc = 0;\n-\t\t\tbreak;\n-\t\t}\n-\t\ti++;\n-\t}\n+\tfor (i = 0;\n+\t\t\ti < ffs->hdr.count &&\n+\t\t\tstrncmp(name, ents[i]->name, FFS_PART_NAME_MAX);\n+\t\t\ti++);\n \n-\tif (rc == 0 && part_idx)\n+\tif (i == ffs->hdr.count)\n+\t\treturn FFS_ERR_PART_NOT_FOUND;\n+\n+\tif (part_idx)\n \t\t*part_idx = i;\n-\treturn rc;\n+\treturn 0;\n }\n \n int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,\n@@ -548,19 +536,25 @@ int ffs_next_side(struct ffs_handle *ffs, struct ffs_handle **new_ffs,\n \n int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)\n {\n-\tstruct ffs_entry *ent;\n-\tuint32_t smallest_base;\n \tconst char *smallest_name;\n-\tint count = 0;\n-\tassert(!list_empty(&hdr->entries));\n+\tuint32_t smallest_base;\n+\tint i;\n \n+\tif (hdr->count == 0) {\n+\t\tFL_DBG(\"Adding an entry to an empty header\\n\");\n+\t\thdr->entries[hdr->count++] = entry;\n+\t}\n \tif (entry->base + entry->size > hdr->block_size * hdr->block_count)\n \t\treturn FFS_ERR_BAD_PART_SIZE;\n \n \tsmallest_base = entry->base;\n \tsmallest_name = entry->name;\n-\t/* Input validate first to a) fail early b) do it all together */\n-\tlist_for_each(&hdr->entries, ent, list) {\n+\t/*\n+\t * TODO: This may have assumed entries was sorted\n+\t */\n+\tfor (i = 0; i < hdr->count; i++) {\n+\t\tstruct ffs_entry *ent = hdr->entries[i];\n+\n \t\t/* Don't allow same names to differ only by case */\n \t\tif (strncasecmp(entry->name, ent->name, FFS_PART_NAME_MAX) == 0)\n \t\t\treturn FFS_ERR_BAD_PART_NAME;\n@@ -579,14 +573,12 @@ int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)\n \t\t\treturn FFS_ERR_BAD_PART_PID;\n \n \t\t/* Skip the first partition as it IS the partition table */\n-\t\tif (ent->base < smallest_base && count > 0) {\n+\t\tif (ent->base < smallest_base && i > 0) {\n \t\t\tsmallest_base = ent->base;\n \t\t\tsmallest_name = ent->name;\n \t\t}\n-\t\tcount++;\n \t}\n-\n-\tif ((count + 1) * sizeof(struct __ffs_entry) +\n+\tif ((hdr->count + 1) * sizeof(struct __ffs_entry) +\n \t\t\tsizeof(struct __ffs_hdr) > smallest_base) {\n \t\tfprintf(stderr, \"Adding partition '%s' would cause partition '%s' at \"\n \t\t\t\t\"0x%08x to overlap with the header\\n\", entry->name, smallest_name,\n@@ -594,7 +586,18 @@ int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)\n \t\treturn FFS_ERR_BAD_PART_BASE;\n \t}\n \n-\tlist_add_tail(&hdr->entries, &entry->list);\n+\tif (hdr->count == hdr->entries_size) {\n+\t\tstruct ffs_entry **old = hdr->entries;\n+\n+\t\thdr->entries = realloc(hdr->entries,\n+\t\t\t\t(HDR_ENTRIES_NUM + hdr->entries_size) * sizeof(struct ffs_entry *));\n+\t\tif (!hdr->entries) {\n+\t\t\thdr->entries = old;\n+\t\t\treturn FLASH_ERR_MALLOC_FAILED;\n+\t\t}\n+\t\thdr->entries_size += HDR_ENTRIES_NUM;\n+\t}\n+\thdr->entries[hdr->count++] = entry;\n \n \treturn 0;\n }\n@@ -602,7 +605,6 @@ int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)\n int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr)\n {\n \tint num_entries, i, rc = 0;\n-\tstruct ffs_entry *ent;\n \tstruct __ffs_hdr *real_hdr;\n \n \tnum_entries = ffs_num_entries(hdr);\n@@ -638,14 +640,12 @@ int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr)\n \treal_hdr->block_count = cpu_to_be32(hdr->block_count);\n \treal_hdr->checksum = ffs_hdr_checksum(real_hdr);\n \n-\ti = 0;\n-\tlist_for_each(&hdr->entries, ent, list) {\n-\t\trc = ffs_entry_to_flash(hdr, real_hdr->entries + i, ent);\n+\tfor (i = 0; i < hdr->count; i++) {\n+\t\trc = ffs_entry_to_flash(hdr, real_hdr->entries + i, hdr->entries[i]);\n \t\tif (rc) {\n \t\t\tfprintf(stderr, \"Couldn't format all entries for new TOC\\n\");\n \t\t\tgoto out;\n \t\t}\n-\t\ti++;\n \t}\n \n \t/* Don't really care if this fails */\n@@ -745,7 +745,8 @@ int ffs_hdr_new(uint32_t block_size, uint32_t block_count, struct ffs_hdr **r)\n \tret->version = FFS_VERSION_1;\n \tret->block_size = block_size;\n \tret->block_count = block_count;\n-\tlist_head_init(&ret->entries);\n+\tret->entries = calloc(HDR_ENTRIES_NUM, sizeof(struct ffs_entry *));\n+\tret->entries_size = HDR_ENTRIES_NUM;\n \n \t/* Don't know how big it will be, ffs_hdr_finalise() will fix */\n \trc = ffs_entry_new(\"part\", 0, 0, &part_table);\n@@ -759,7 +760,8 @@ int ffs_hdr_new(uint32_t block_size, uint32_t block_count, struct ffs_hdr **r)\n \tpart_table->type = FFS_TYPE_PARTITION;\n \tpart_table->flags = FFS_FLAGS_PROTECTED;\n \n-\tlist_add(&ret->entries, &part_table->list);\n+\tret->entries[0] = part_table;\n+\tret->count = 1;\n \n \t*r = ret;\n \n", "prefixes": [ "RFC", "10/13" ] }