{
BattFsPageHeader hdr_old;
- if (!battfs_readHeader(disk, page, &hdr_old))
+ if (!battfs_readHeader(disk, disk->page_array[array_pos], &hdr_old))
return false;
#ifdef _DEBUG
pgcnt_t new_page, old_page;
fill_t old_fill;
- #warning fix seq wraparound!
- if (hdr.seq > hdr_old.seq)
+ /* Fancy check to handle seq wraparound */
+ #define HALF_SEQ ((1 << (sizeof(seq_t) * CPU_BITS_PER_CHAR)) / 2)
+ if ((hdr.seq - hdr_old.seq) < HALF_SEQ)
{
/* Actual header is newer than the previuos one */
old_page = disk->page_array[array_pos];
disk->page_array[array_pos] = new_page;
/* Add free space */
- disk->free_bytes -= disk->page_size - sizeof(BattFsPageHeader) - old_fill;
+ disk->free_bytes += old_fill;
/* Shift all array one position to the left, overwriting duplicate page */
array_pos -= hdr.pgoff;
else
{
/* Check if putting mark to MARK_PAGE_VALID makes fcs correct */
- mark_t old_mark = hdr.mark;
+ mark_t mark = hdr.mark;
hdr.mark = MARK_PAGE_VALID;
rotating_init(&cks);
rotating_update(&hdr, sizeof(BattFsPageHeader) - sizeof(rotating_t), &cks);
- if (cks == hdr.fcs)
- /* Page is a valid marked page, insert in free list in correct order */
- insertFreePage(disk, filelen_table, old_mark, page);
- else
+ if (cks != hdr.fcs)
/* Page is not a valid marked page, insert at the end of list */
- insertFreePage(disk, filelen_table, ++disk->max_free, page);
+ mark = ++disk->max_free;
+
+ insertFreePage(disk, filelen_table, mark, page);
}
}