summaryrefslogtreecommitdiffstats
path: root/ffs/src/libffs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffs/src/libffs.c')
-rw-r--r--ffs/src/libffs.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/ffs/src/libffs.c b/ffs/src/libffs.c
index 83a7df0..7e20bef 100644
--- a/ffs/src/libffs.c
+++ b/ffs/src/libffs.c
@@ -1020,6 +1020,34 @@ int __ffs_entry_add(ffs_t * self, const char *path, off_t offset, uint32_t size,
hdr->entry_count++;
+ // Need to update 'part' entry as well as ffs hdr
+ // if the required number of blocks changes
+ uint32_t blocksNeeded = (hdr->entry_count * hdr->entry_size + FFS_HDR_SIZE_NO_ENTRY) / hdr->block_size;
+ if(hdr->entry_count * hdr->entry_size + FFS_HDR_SIZE_NO_ENTRY % hdr->block_size)
+ {
+ blocksNeeded++;
+ }
+
+ if(hdr->size != blocksNeeded)
+ {
+ ffs_entry_t entry;
+ if (__ffs_entry_find(self, "part", &entry) == false) {
+ UNEXPECTED("entry '%s' not found in table at offset '%llx'",
+ "part", (long long)self->offset);
+ return -1;
+ }
+
+ int find_entry_id(ffs_entry_t * __entry) {
+ return entry.id == __entry->id;
+ }
+
+ ffs_entry_t *entry_p = __iterate_entries(hdr, find_entry_id);
+ assert(entry_p != NULL);
+
+ hdr->size = blocksNeeded;
+ entry_p->size = blocksNeeded;
+ entry_p->actual = blocksNeeded * hdr->block_size;
+ }
self->dirty = true;
return 0;
OpenPOWER on IntegriCloud