X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=fs%2Fbattfs.c;h=1b8bf92336f0f340a8c851765119cb93c5e97968;hb=781d5135a61025caea65ef66b5c6bde2ef950e40;hp=0a01ee3c9b40e81d6c19c563d99224c74b2026dd;hpb=bb6f3e772cf8e6f0c87d92f218e5982d7da68323;p=bertos.git diff --git a/fs/battfs.c b/fs/battfs.c index 0a01ee3c..1b8bf923 100644 --- a/fs/battfs.c +++ b/fs/battfs.c @@ -319,7 +319,7 @@ bool battfs_init(struct BattFsSuper *disk) { 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 @@ -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)) / 2) + if ((hdr.seq - hdr_old.seq) < HALF_SEQ) { /* Actual header is newer than the previuos one */ old_page = disk->page_array[array_pos]; @@ -359,7 +360,7 @@ bool battfs_init(struct BattFsSuper *disk) 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; @@ -379,16 +380,15 @@ bool battfs_init(struct BattFsSuper *disk) 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); } }