X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=fs%2Fbattfs.c;h=9a4275d672628869a9344ed73ba7ca9d3c215688;hb=4c312bec701f1768049e1665f84ffd45e6078586;hp=8d02d94f5fcbfacf38ef9fafdaa17e64107c442a;hpb=9b45c6171e04b1d312e1c221e0a575b9180157b0;p=bertos.git diff --git a/fs/battfs.c b/fs/battfs.c index 8d02d94f..9a4275d6 100644 --- a/fs/battfs.c +++ b/fs/battfs.c @@ -174,12 +174,12 @@ static void movePages(struct BattFsSuper *disk, pgcnt_t src, int offset) /** * 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; @@ -269,7 +269,7 @@ bool battfs_init(struct BattFsSuper *disk) /* 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); @@ -339,8 +339,9 @@ bool battfs_init(struct BattFsSuper *disk) 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) - 1)) + if ((hdr.seq - hdr_old.seq) < HALF_SEQ) { /* Actual header is newer than the previuos one */ old_page = disk->page_array[array_pos]; @@ -378,17 +379,16 @@ bool battfs_init(struct BattFsSuper *disk) } 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); } }