Typo.
[bertos.git] / fs / battfs.c
index 0a01ee3c9b40e81d6c19c563d99224c74b2026dd..9a4275d672628869a9344ed73ba7ca9d3c215688 100644 (file)
@@ -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);
@@ -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) - 1))
+                               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;
@@ -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);
                }
        }