Complete first disk scan.
authorbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 7 Dec 2007 22:08:44 +0000 (22:08 +0000)
committerbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 7 Dec 2007 22:08:44 +0000 (22:08 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1031 38d2e660-2303-0410-9eaa-f027e97ec537

fs/battfs.c
fs/battfs.h

index e02e14a45ea72000581f705e9f2973261f3793e3..2cd1ef660e52c8a3faebd40eb7d176b5a1a62726 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,15 @@ 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);
+
+       ASSERT(hdr->fill <= disk->page_size - sizeof(BattFsPageHeader));
        return true;
 }
 
@@ -129,10 +137,22 @@ bool battfs_init(struct BattFsSuper *disk)
 
        /* 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 +162,41 @@ 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 */
                        filelen_table[hdr.inode]++;
+
+                       /* Keep trace of free space */
+                       disk->free_bytes += disk->page_size - sizeof(BattFsPageHeader) - hdr.fill;
+               }
                else
                {
-                       #warning Finish me!
+                       /* 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 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);
+
+                       /* Increase free space */
+                       filelen_table[BATTFS_FREE_INODE]++;
+                       disk->free_bytes += disk->page_size - sizeof(BattFsPageHeader);
                }
        }
 
+       /* Once here, we have filelen_table filled with file lengths */
+       #warning Complete me!
+
        
        return true;    
 }
index 455b21ce0c20c1a6e4bd521a5281936e6a714048..ff49eaa89014a554c1978e05eda70bea95c0497c 100644 (file)
@@ -76,11 +76,22 @@ typedef struct BattFsPageHeader
        fcs_t fcs;
 } BattFsPageHeader;
 
+/**
+ * Mark for valid pages.
+ * Simply set to 1 all field bits.
+ */
+#define MARK_PAGE_VALID ((1 << (CPU_BITS_PER_CHAR * sizeof(mark_t))) - 1)
+
 /**
  * Max number of files.
  */
 #define BATTFS_MAX_FILES (1 << (CPU_BITS_PER_CHAR * sizeof(inode_t)))
 
+/**
+ * Special inode used to identify free pages.
+ */
+#define BATTFS_FREE_INODE (BATTFS_MAX_FILES - 1)
+
 /* Ensure structure has no padding added */
 STATIC_ASSERT(sizeof(BattFsPageHeader) == 12);
 
@@ -153,7 +164,10 @@ typedef struct BattFsSuper
         * Is used by the filesystem to represent
         * the entire disk in memory.
         */
-       pgcnt_t *page_array;     
+       pgcnt_t *page_array;
+
+       mark_t min_free; ///< Lowest sequence number of free page
+       mark_t max_free; ///< Highest sequence number of free page
 
        disk_size_t disk_size;   ///< Size of the disk, in bytes (page_count * page_size).
        disk_size_t free_bytes;  ///< Free space on the disk.