Remove evil bitfields, add a spare field.
[bertos.git] / fs / battfs.h
index 3d491cd9bad8b31d45872159d90bd74049dd9ad5..da38bdecf050609932944cfd103faf3840c2ac1b 100644 (file)
 #define FS_BATTFS_H
 
 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
-#include <cpu/types.h>
+#include <cpu/types.h> // CPU_BITS_PER_CHAR
 
 typedef uint16_t fill_t;
 typedef uint16_t pgoff_t;
 typedef pgoff_t  mark_t;
 typedef uint8_t  inode_t;
 typedef uint8_t  seq_t;
-typedef uint8_t  fsc_t;
-
-/**
- * Reserve 2 bits from fill field to allocate seq number.
- */
-#define FILLSIZE ((sizeof(filled_t) * CPU_BITS_PER_CHAR) - 2)
+typedef uint16_t  fsc_t;
 
 /**
  * BattFS page header.
@@ -63,16 +58,17 @@ typedef uint8_t  fsc_t;
  */
 typedef struct BattFsPageHeader
 {
-       mark_t  mark;          ///< Marker used to keep trace of free/used pages.
-       pgoff_t pgoff;         ///< Page offset inside file.
-       fill_t  fill:FILLSIZE; ///< Filled bytes in page.
-       seq_t   seq:2;         ///< bit[1:0]: Page sequence number; bit[7:2] unused for now, must be set to 1.
-       inode_t inode;         ///< File inode (file identifier).
-       fsc_t   fsc;           ///< FSC of the page header.
+       mark_t   mark;  ///< Marker used to keep trace of free/used pages.
+       pgoff_t  pgoff; ///< Page offset inside file.
+       fill_t   fill;  ///< Filled bytes in page.
+       seq_t    seq;   ///< Page sequence number.
+       inode_t  inode; ///< File inode (file identifier).
+       uint16_t rfu;  ///< Reserved for future use, 0xFFFF for now.
+       fsc_t    fsc;   ///< FSC of the page header.
 } BattFsPageHeader;
 
 /* Ensure structure has no padding added */
-STATIC_ASSERT(sizeof(BattFsPageHeader) == 8);
+STATIC_ASSERT(sizeof(BattFsPageHeader) == 12);
 
 /* Fwd decl */
 struct BattFsSuper;
@@ -109,7 +105,7 @@ typedef size_t      (*disk_page_write_t) (struct BattFsSuper *d, const void *buf, bat
  */
 typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, battfs_page_t page);
 
-typedef uint32_t disk_size_t ///< Type for disk sizes.
+typedef uint32_t disk_size_t; ///< Type for disk sizes.
 
 /**
  * Context used to describe a disk.