Reformat.
[bertos.git] / fs / battfs.c
index e02e14a45ea72000581f705e9f2973261f3793e3..f11059c3f5c4c6e29c64d277bbfdf66d24c46ef9 100644 (file)
 
 #include "battfs.h"
 
+#include <cfg/debug.h>
+#include <cfg/macros.h> /* MIN, MAX */
 #include <mware/byteorder.h> /* cpu_to_xx */
 
+
 #include <string.h> /* memset */
 
 /**
@@ -109,10 +112,14 @@ static bool battfs_readHeader(struct BattFsSuper *disk, pgcnt_t page, struct Bat
         */
        if (disk->read(disk, page, disk->page_size - sizeof(BattFsPageHeader), hdr, sizeof(BattFsPageHeader))
            != sizeof(BattFsPageHeader))
+       {
+               TRACEMSG("Error: page[%d]\n", page);
                return false;
+       }
 
        /* Fix endianess */
        battfs_to_cpu(hdr);
+
        return true;
 }
 
@@ -127,12 +134,34 @@ bool battfs_init(struct BattFsSuper *disk)
        rotating_t cks;
        pgoff_t filelen_table[BATTFS_MAX_FILES];
 
+       /* Sanity checks */
+       ASSERT(disk->open);
+       ASSERT(disk->read);
+       ASSERT(disk->write);
+       ASSERT(disk->erase);
+       ASSERT(disk->close);
+       ASSERT(disk->page_size);
+       ASSERT(disk->page_count);
+       ASSERT(disk->page_array);
+       
        /* Init disk device */
        if (!disk->open(disk))
+       {
+               TRACEMSG("Open error\n");
                return false;
+       }
 
        memset(filelen_table, 0, BATTFS_MAX_FILES * sizeof(pgoff_t));
 
+       /* Initialize min free sequence number to max value */
+       disk->min_free = MARK_PAGE_VALID;
+       /* Initialize max free sequence number to min value */
+       disk->max_free = 0;
+
+       disk->free_bytes = 0;
+       disk->disk_size = (disk_size_t)(disk->page_size - sizeof(BattFsPageHeader)) * disk->page_count;
+
+       /* Count the number of disk page per files */
        for (pgcnt_t page = 0; page < disk->page_count; page++)
        {
                if (!battfs_readHeader(disk, page, &hdr))
@@ -142,13 +171,43 @@ bool battfs_init(struct BattFsSuper *disk)
                rotating_init(&cks);
                rotating_update(&hdr, sizeof(BattFsPageHeader) - sizeof(rotating_t), &cks);
                if (cks == hdr.fcs)
+               {
+                       /* Page is valid and is owned by a file */
+                       ASSERT(hdr.inode != BATTFS_FREE_INODE);
                        filelen_table[hdr.inode]++;
+
+                       ASSERT(hdr.fill <= disk->page_size - sizeof(BattFsPageHeader));
+                       /* Keep trace of free space */
+                       disk->free_bytes += disk->page_size - sizeof(BattFsPageHeader) - hdr.fill;
+               }
                else
                {
-                       #warning Finish me!
+                       /* Increase free space */
+                       filelen_table[BATTFS_FREE_INODE]++;
+                       disk->free_bytes += disk->page_size - sizeof(BattFsPageHeader);
+                       
+                       /* Check if putting mark to MARK_PAGE_VALID makes fcs correct */
+                       mark_t old_mark = hdr.mark;
+                       hdr.mark = MARK_PAGE_VALID;
+                       rotating_init(&cks);
+                       rotating_update(&hdr, sizeof(BattFsPageHeader) - sizeof(rotating_t), &cks);
+                       if (cks == hdr.fcs)
+                       {
+                               /*
+                                * This page is a valid and marked free page.
+                                * Update min and max free page sequence numbers.
+                                */
+                               disk->min_free = MIN(disk->min_free, old_mark);
+                               disk->max_free = MAX(disk->max_free, old_mark);
+                       }
+                       else
+                               TRACEMSG("Page [%d] invalid, keeping as free\n", page);
                }
        }
 
+       /* Once here, we have filelen_table filled with file lengths */
+       #warning Complete me!
+
        
        return true;    
 }