Make nightly build test works.
[bertos.git] / bertos / fs / battfs.c
index 93a8868e868b66e5b3950dddaf78f5382b996436..4f4d48920e659051212f0dbc32fcba8da5e095f1 100644 (file)
  *
  * \brief BattFS: a filesystem for embedded platforms (implementation).
  *
- * \version $Id:$
+ * \version $Id$
  *
  * \author Francesco Sacchi <batt@develer.com>
  *
  */
 
 #include "battfs.h"
-
+#include "cfg/cfg_battfs.h"
 #include <cfg/debug.h>
 #include <cfg/macros.h> /* MIN, MAX */
+#include <cfg/test.h>
 #include <cpu/byteorder.h> /* cpu_to_xx */
 
-#define LOG_LEVEL       LOG_LVL_INFO
-#define LOG_FORMAT      LOG_FMT_VERBOSE
+#define LOG_LEVEL       BATTFS_LOG_LEVEL
+#define LOG_FORMAT      BATTFS_LOG_FORMAT
 #include <cfg/log.h>
 
 #include <string.h> /* memset, memmove */
@@ -279,7 +280,7 @@ static bool countDiskFilePages(struct BattFsSuper *disk, pgoff_t *filelen_table)
                        disk->free_page_start++;
                }
        }
-       LOG_INFO("free_bytes:%d, free_page_start:%d\n", disk->free_bytes, disk->free_page_start);
+       LOG_INFO("free_bytes:%ld, free_page_start:%d\n", (long)disk->free_bytes, disk->free_page_start);
 
        return true;
 }
@@ -382,7 +383,7 @@ static bool fillPageArray(struct BattFsSuper *disk, pgoff_t *filelen_table)
                {
                        /* Invalid page, keep as free */
                        ASSERT(disk->page_array[curr_free_page] == PAGE_UNSET_SENTINEL);
-                       LOG_INFO("Page %d invalid, keeping as free\n", page);
+                       //LOG_INFO("Page %d invalid, keeping as free\n", page);
                        disk->page_array[curr_free_page++] = page;
                }
        }
@@ -489,10 +490,14 @@ bool battfs_mount(struct BattFsSuper *disk)
        #if LOG_LEVEL >= LOG_LVL_INFO
                dumpPageArray(disk);
        #endif
-       #warning TODO: shuffle free blocks
-       //#if LOG_LEVEL > LOG_LVL_INFO
-       //      dumpPageArray(disk);
-       //#endif
+       #if CONFIG_BATTFS_SHUFFLE_FREE_PAGES
+               SHUFFLE(&disk->page_array[disk->free_page_start], disk->page_count - disk->free_page_start);
+
+               LOG_INFO("Page array after shuffle:\n");
+               #if LOG_LEVEL >= LOG_LVL_INFO
+                       dumpPageArray(disk);
+               #endif
+       #endif
        /* Init list for opened files. */
        LIST_INIT(&disk->file_opened_list);
        return true;
@@ -517,6 +522,9 @@ bool battfs_fsck(struct BattFsSuper *disk)
 
        bool start = true;
 
+       /* Uneeded, the first time will be overwritten but useful to silence
+        * the warning for uninitialized value */
+       FSCHECK(readHdr(disk, 0, &prev_hdr));
        for (pgcnt_t page = 0; page < disk->page_count; page++)
        {
                FSCHECK(readHdr(disk, disk->page_array[page], &hdr));
@@ -655,7 +663,7 @@ static size_t battfs_write(struct KFile *fd, const void *_buf, size_t size)
 
                /* Fill unused space of first page with 0s */
                uint8_t dummy = 0;
-               pgaddr_t zero_bytes = MIN(fd->seek_pos - fd->size, disk->data_size - curr_hdr.fill);
+               pgaddr_t zero_bytes = MIN(fd->seek_pos - fd->size, (kfile_off_t)(disk->data_size - curr_hdr.fill));
                while (zero_bytes--)
                {
                        if (disk->bufferWrite(disk, curr_hdr.fill, &dummy, 1) != 1)
@@ -811,7 +819,7 @@ static size_t battfs_read(struct KFile *fd, void *_buf, size_t size)
                return total_read;
        }
 
-       size = MIN((kfile_off_t)size, MAX(fd->size - fd->seek_pos, 0));
+       size = MIN((kfile_off_t)size, MAX(fd->size - fd->seek_pos, (kfile_off_t)0));
 
        while (size)
        {
@@ -874,7 +882,7 @@ static bool findFile(BattFsSuper *disk, inode_t inode, pgcnt_t *last)
                else if (hdr.fcs == fcs && hdr.inode < inode)
                        first = page + 1;
                else
-                       *last = page - 1;
+                       *last = page;
        }
        LOG_INFO("Not found: last %d\n", *last);
        return false;