cbfstool: correct size left calculation for "empty" entries

After removing a file sandwiched between two other files, that file
could no longer be re-added at the same location. cbfstool tried to
add the file, and a new "empty" entry, which, together, would no
longer fit, so it continued checking for the next available space.

Change the behavior to add the file if there is enough space for the
file alone, then only add the "empty" entry if there is enough space
for it.

Change-Id: Iad3897dd28cf12f12ae877cfd83e1990fa7d2f0f
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/4772
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@google.com>
This commit is contained in:
Aaron Durbin 2014-01-21 15:28:38 -06:00 committed by Alexandru Gagniuc
parent 9c70adf26d
commit 1ebc7e943b
1 changed files with 14 additions and 0 deletions

View File

@ -380,6 +380,10 @@ int cbfs_add_entry(struct cbfs_image *image, struct buffer *buffer,
DEBUG("cbfs_add_entry: space at 0x%x+0x%x(%d) bytes\n", DEBUG("cbfs_add_entry: space at 0x%x+0x%x(%d) bytes\n",
addr, addr_next - addr, addr_next - addr); addr, addr_next - addr, addr_next - addr);
/* Will the file fit? Don't yet worry if we have space for a new
* "empty" entry. We take care of that later.
*/
if (addr + need_size > addr_next) if (addr + need_size > addr_next)
continue; continue;
@ -399,6 +403,16 @@ int cbfs_add_entry(struct cbfs_image *image, struct buffer *buffer,
entry = cbfs_find_next_entry(image, entry); entry = cbfs_find_next_entry(image, entry);
new_size = (cbfs_get_entry_addr(image, next) - new_size = (cbfs_get_entry_addr(image, next) -
cbfs_get_entry_addr(image, entry)); cbfs_get_entry_addr(image, entry));
/* Entry was added and no space for new "empty" entry */
if (new_size < cbfs_calculate_file_header_size("")) {
DEBUG("No need for new \"empty\" entry\n");
/* No need to increase the size of the just
* stored file to extend to next file. Alignment
* of next file takes care of this.
*/
return 0;
}
new_size -= cbfs_calculate_file_header_size(""); new_size -= cbfs_calculate_file_header_size("");
DEBUG("new size: %d\n", new_size); DEBUG("new size: %d\n", new_size);
cbfs_create_empty_entry(image, entry, new_size, ""); cbfs_create_empty_entry(image, entry, new_size, "");