/**
* Insert \a page into page allocation array of \a disk, using \a filelen_table and
- * \a free_number to compure position.
+ * \a free_number to compute position.
*/
static void insertFreePage(struct BattFsSuper *disk, pgoff_t *filelen_table, mark_t free_number, pgcnt_t page)
{
- ASSERT(mark >= disk->min_free);
- ASSERT(mark <= disk->max_free);
+ ASSERT(free_number >= disk->min_free);
+ ASSERT(free_number <= disk->max_free);
pgcnt_t free_pos = countPages(filelen_table, BATTFS_MAX_FILES - 1);
free_pos += free_number - disk->min_free;
/* Increase free space */
disk->free_bytes += disk->page_size - sizeof(BattFsPageHeader);
- /* Check if putting mark to MARK_PAGE_VALID makes fcs correct */
+ /* Check if setting mark to MARK_PAGE_VALID makes fcs correct */
mark_t old_mark = hdr.mark;
hdr.mark = MARK_PAGE_VALID;
rotating_init(&cks);
{
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;
- if (hdr.seq > hdr_old.seq)
+ /* Fancy check to handle seq wraparound */
+ #define HALF_SEQ (1 << ((sizeof(seq_t) * CPU_BITS_PER_CHAR) - 1))
+ 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;
+ /* Check if setting mark to MARK_PAGE_VALID makes fcs correct */
+ 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);
}
}