battfs.h

Go to the documentation of this file.
00001 
00041 #ifndef FS_BATTFS_H
00042 #define FS_BATTFS_H
00043 
00044 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
00045 #include <cpu/types.h> // CPU_BITS_PER_CHAR
00046 #include <algo/rotating_hash.h>
00047 #include <mware/list.h>
00048 #include <kern/kfile.h>
00049 
00050 typedef uint16_t fill_t;    
00051 typedef fill_t   pgaddr_t;  
00052 typedef uint16_t pgcnt_t;   
00053 typedef pgcnt_t  pgoff_t;   
00054 typedef uint32_t mark_t;    
00055 typedef uint8_t  inode_t;   
00056 typedef uint8_t  seq_t;     
00057 typedef rotating_t fcs_t;   
00058 
00063 STATIC_ASSERT(sizeof(mark_t) > sizeof(pgcnt_t));
00064 
00072 typedef struct BattFsPageHeader
00073 {
00074     inode_t  inode; 
00075     seq_t    seq;   
00076     fill_t   fill;  
00077     pgoff_t  pgoff; 
00078     mark_t   mark;  
00079 
00084     fcs_t fcs_free;
00085 
00089     fcs_t fcs;
00090 } BattFsPageHeader;
00091 
00097 #define BATTFS_HEADER_LEN 12
00098 
00104 #define MARK_PAGE_VALID ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t) + 1)) - 1)
00105 #define FCS_FREE_VALID  ((1 << (CPU_BITS_PER_CHAR * sizeof(fcs_t))) - 1)
00106 /* \} */
00107 
00108 
00113 #define MARK_HALF_SIZE (1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t) + 1))
00114 
00118 #define MAX_PAGE_ADDR ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
00119 
00123 #define BATTFS_MAX_FILES (1 << (CPU_BITS_PER_CHAR * sizeof(inode_t)))
00124 
00125 /* Fwd decl */
00126 struct BattFsSuper;
00127 
00131 #define PAGE_UNSET_SENTINEL ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
00132 
00137 typedef bool (*disk_open_t) (struct BattFsSuper *d);
00138 
00145 typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t);
00146 
00153 typedef size_t  (*disk_page_write_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, const void *buf, size_t);
00154 
00160 typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, pgcnt_t page);
00161 
00166 typedef bool (*disk_close_t) (struct BattFsSuper *d);
00167 
00168 
00169 typedef uint32_t disk_size_t; 
00170 
00176 typedef struct BattFsSuper
00177 {
00178     disk_open_t open;        
00179     disk_page_read_t  read;  
00180     disk_page_write_t write; 
00181     disk_page_erase_t erase; 
00182     disk_close_t close;      
00183 
00184     pgaddr_t page_size;      
00185     pgcnt_t page_count;      
00186 
00194     pgcnt_t *page_array;
00195 
00200     mark_t free_start;
00201 
00206     mark_t free_next;
00207 
00208     disk_size_t disk_size;   
00209     disk_size_t free_bytes;  
00210 
00211     List file_opened_list;       
00212     /* TODO add other fields. */
00213 } BattFsSuper;
00214 
00215 typedef uint8_t filemode_t; 
00216 typedef uint32_t file_size_t; 
00217 
00222 #define BATTFS_CREATE BV(0)  
00223 #define BATTFS_RD     BV(1)  
00224 #define BATTFS_WR     BV(2)  
00225 /*/}*/
00226 
00227 
00231 typedef struct KFileBattFs
00232 {
00233     KFile fd;           
00234     Node link;          
00235     inode_t inode;      
00236     BattFsSuper *disk;  
00237     filemode_t mode;    
00238     pgcnt_t *start;     
00239 } KFileBattFs;
00240 
00244 #define KFT_BATTFS MAKE_ID('B', 'T', 'F', 'S')
00245 
00250 INLINE KFileBattFs * KFILEBATTFS(KFile *fd)
00251 {
00252     ASSERT(fd->_type == KFT_BATTFS);
00253     return (KFileBattFs *)fd;
00254 }
00255 
00256 bool battfs_init(struct BattFsSuper *d);
00257 bool battfs_close(struct BattFsSuper *disk);
00258 
00259 bool battfs_fileExists(BattFsSuper *disk, inode_t inode);
00260 bool battfs_fileopen(BattFsSuper *disk, KFileBattFs *fd, inode_t inode, filemode_t mode);
00261 
00262 bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff, mark_t mark);
00263 
00264 #endif /* FS_BATTFS_H */