Handle seqnum wraparound.
[bertos.git] / fs / battfs.c
index 0a01ee3c9b40e81d6c19c563d99224c74b2026dd..1b8bf92336f0f340a8c851765119cb93c5e97968 100644 (file)
@@ -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);
                }
        }