Mercurial > hvf > hvf-old
changeset 482:243c6083ee1d
installer: finish the implementation of __append_block
Closes bug #186
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Wed, 20 Apr 2011 20:18:56 -0400 |
parents | 9fac53826047 |
children | 5a7da2858417 |
files | installer/edf.c |
diffstat | 1 files changed, 38 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/installer/edf.c Wed Apr 20 20:17:17 2011 -0400 +++ b/installer/edf.c Wed Apr 20 20:18:56 2011 -0400 @@ -323,6 +323,7 @@ static void __append_block(struct FST *fst) { + struct block_map *map; u32 *buf; u32 lba, prevlba; u32 blk; @@ -338,43 +339,54 @@ return; } - /* need to add another level */ - if (fst->ADBC == (file_blocks_at_level(fst->ADBC, fst->NLVL) * - (adt->adt.DBSIZ / 4))) { - for(lvl=0; lvl<=fst->NLVL; lvl++, prevlba=lba) { - lba = __get_free_block(); - blk = file_blocks_at_level(fst->ADBC+1, lvl); + for(lvl=0; lvl<=fst->NLVL; lvl++, prevlba=lba) { + blk = file_blocks_at_level(fst->ADBC+1, lvl); - block_map_add(fst->FNAME, fst->FTYPE, lvl, blk, lba); + map = block_map_find(fst->FNAME, fst->FTYPE, lvl, blk-1); + if (map) { + int x; if (!lvl) - continue; + die(); + + buf = read_file_blk(fst->FNAME, fst->FTYPE, lvl, + blk-1); + blk_set_dirty(fst->FNAME, fst->FTYPE, lvl, blk-1); - buf = read_file_blk(fst->FNAME, fst->FTYPE, lvl, blk); - blk_set_dirty(fst->FNAME, fst->FTYPE, lvl, blk); + x = file_blocks_at_level(fst->ADBC+1, lvl-1) % + (adt->adt.DBSIZ / 4); + buf[x-1] = prevlba; - *buf = prevlba; - + fst->ADBC++; + return; } lba = __get_free_block(); - block_map_add(fst->FNAME, fst->FTYPE, fst->NLVL+1, 0, lba); - buf = read_file_blk(fst->FNAME, fst->FTYPE, fst->NLVL+1, 0); - blk_set_dirty(fst->FNAME, fst->FTYPE, fst->NLVL+1, 0); + block_map_add(fst->FNAME, fst->FTYPE, lvl, blk-1, lba); - buf[0] = fst->FOP; - buf[1] = prevlba; + if (!lvl) + continue; - fst->FOP = lba; + buf = read_file_blk(fst->FNAME, fst->FTYPE, lvl, blk-1); + blk_set_dirty(fst->FNAME, fst->FTYPE, lvl, blk-1); - fst->NLVL++; - fst->ADBC++; - return; + *buf = prevlba; } - // FIXME - die(); + lba = __get_free_block(); + block_map_add(fst->FNAME, fst->FTYPE, fst->NLVL+1, 0, lba); + + buf = read_file_blk(fst->FNAME, fst->FTYPE, fst->NLVL+1, 0); + blk_set_dirty(fst->FNAME, fst->FTYPE, fst->NLVL+1, 0); + + buf[0] = fst->FOP; + buf[1] = prevlba; + + fst->FOP = lba; + + fst->NLVL++; + fst->ADBC++; } void append_record(struct FST *fst, u8 *buf) @@ -393,15 +405,15 @@ blk = foff / adt->adt.DBSIZ; off = foff % adt->adt.DBSIZ; - rem = adt->adt.DBSIZ - off; + rem = (fst->ADBC * adt->adt.DBSIZ) - foff; /* need to add another block */ - if ((blk == fst->ADBC) || (rem < fst->LRECL)) + if (rem < fst->LRECL) __append_block(fst); dbuf = read_file_blk(fst->FNAME, fst->FTYPE, 0, blk); - if (rem >= fst->LRECL) { + if (!rem || (rem >= fst->LRECL)) { memcpy(dbuf + off, buf, fst->LRECL); blk_set_dirty(fst->FNAME, fst->FTYPE, 0, blk); } else {