Set correct debug pins for AT91SAM7X.
[bertos.git] / fs / battfs.h
index 1048b66c99f15a86b652b90bab4663407a540e90..14728a8d2b199f82c36054fa9237bbdb1bc5904a 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
 #include <cpu/types.h> // CPU_BITS_PER_CHAR
+#include <algo/rotating_hash.h>
 
 typedef uint16_t fill_t;
 typedef fill_t   pgaddr_t;
@@ -50,7 +51,7 @@ typedef uint16_t pgoff_t;
 typedef pgoff_t  mark_t;
 typedef uint8_t  inode_t;
 typedef uint8_t  seq_t;
-typedef uint16_t fcs_t;
+typedef rotating_t fcs_t;
 
 /**
  * BattFS page header.
@@ -65,12 +66,30 @@ typedef struct BattFsPageHeader
        pgoff_t  pgoff; ///< Page offset inside file.
        fill_t   fill;  ///< Filled bytes in page.
        uint16_t rfu;   ///< Reserved for future use, 0xFFFF for now.
-       fcs_t    fcs;   ///< FCS (Frame Check Sequence) of the page header.
-} BattFsPageHeader;
 
+       /**
+        * FCS (Frame Check Sequence) of the page header.
+        * \note This field must be the last one!
+        *       This is needed because if the page is only partially
+        *       written, we can use this to detect it.
+        */
+       fcs_t fcs;
+} BattFsPageHeader;
 /* Ensure structure has no padding added */
 STATIC_ASSERT(sizeof(BattFsPageHeader) == 12);
 
+
+/**
+ * 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)))
+
 /* Fwd decl */
 struct BattFsSuper;
 
@@ -79,6 +98,11 @@ struct BattFsSuper;
  */
 typedef uint16_t pgcnt_t;
 
+/**
+ * Sentinel used to keep trace of unset pages in disk->pag_array.
+ */
+#define PAGE_UNSET_SENTINEL ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
+
 /**
  * Type interface for disk init function.
  * \return true if all is ok, false otherwise.
@@ -140,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.
@@ -148,11 +175,6 @@ typedef struct BattFsSuper
        /* TODO add other fields. */
 } BattFsSuper;
 
-/**
- * Initialize and mount disk described by
- * \a d.
- * \return false on errors, true otherwise.
- */
 bool battfs_init(struct BattFsSuper *d);
 
 #endif /* FS_BATTFS_H */