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 <struct/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 uint8_t  inode_t;   
00055 typedef uint64_t  seq_t;    
00056 typedef rotating_t fcs_t;   
00057 
00058 
00066 typedef struct BattFsPageHeader
00067 {
00068     inode_t  inode; 
00069     fill_t   fill;  
00070     pgoff_t  pgoff; 
00071 
00080     seq_t    seq;
00081 
00085     fcs_t fcs;
00086 } BattFsPageHeader;
00087 
00093 #define BATTFS_HEADER_LEN 12
00094 
00098 #define MAX_PAGE_ADDR ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
00099 
00103 #define BATTFS_MAX_FILES (1 << (CPU_BITS_PER_CHAR * sizeof(inode_t)))
00104 
00105 /* Fwd decl */
00106 struct BattFsSuper;
00107 
00111 #define PAGE_UNSET_SENTINEL ((pgcnt_t)((1L << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1))
00112 
00119 typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t);
00120 
00121 
00130 typedef bool (*disk_page_load_t) (struct BattFsSuper *d, pgcnt_t page);
00131 
00138 typedef size_t  (*disk_buffer_write_t) (struct BattFsSuper *d, pgaddr_t addr, const void *buf, size_t);
00139 
00146 typedef size_t  (*disk_buffer_read_t) (struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t);
00147 
00155 typedef bool (*disk_page_save_t) (struct BattFsSuper *d, pgcnt_t page);
00156 
00162 typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, pgcnt_t page);
00163 
00168 typedef bool (*disk_close_t) (struct BattFsSuper *d);
00169 
00170 
00171 typedef uint32_t disk_size_t; 
00172 
00178 typedef struct BattFsSuper
00179 {
00180     void *disk_ctx;          
00181     disk_page_read_t  read;  
00182     disk_page_load_t  load;  
00183     disk_buffer_write_t bufferWrite; 
00184     disk_buffer_read_t bufferRead; 
00185     disk_page_save_t  save;  
00186     disk_page_erase_t erase; 
00187     disk_close_t close;      
00188 
00189     pgaddr_t page_size;      
00190     pgaddr_t data_size;      
00191     pgcnt_t page_count;      
00192 
00200     pgcnt_t *page_array;
00201     pgcnt_t curr_page;  
00202     bool cache_dirty;   
00203 
00208     pgcnt_t free_page_start;
00209 
00210     disk_size_t disk_size;   
00211     disk_size_t free_bytes;  
00212 
00213     List file_opened_list;       
00214     /* TODO add other fields. */
00215 } BattFsSuper;
00216 
00220 #define SPACE_OVER(disk) ((disk)->free_page_start >= (disk)->page_count)
00221 
00222 typedef uint8_t filemode_t;  
00223 typedef int32_t file_size_t; 
00224 
00229 #define BATTFS_CREATE BV(0)  
00230 #define BATTFS_RD     BV(1)  
00231 #define BATTFS_WR     BV(2)  
00232 /*/}*/
00233 
00234 
00239 #define BATTFS_NEGATIVE_SEEK_ERR   BV(0) 
00240 #define BATTFS_DISK_READ_ERR       BV(1) 
00241 #define BATTFS_DISK_LOADPAGE_ERR   BV(2) 
00242 #define BATTFS_DISK_BUFFERWR_ERR   BV(3) 
00243 #define BATTFS_DISK_GETNEWPAGE_ERR BV(4) 
00244 #define BATTFS_DISK_BUFFERRD_ERR   BV(6) 
00245 #define BATTFS_DISK_SPACEOVER_ERR  BV(7) 
00246 #define BATTFS_DISK_FLUSHBUF_ERR   BV(8) 
00247 #define BATTFS_FILE_NOT_FOUND_ERR  BV(9) 
00248 /*/}*/
00249 
00253 typedef struct BattFs
00254 {
00255     KFile fd;           
00256     Node link;          
00257     inode_t inode;      
00258     BattFsSuper *disk;  
00259     filemode_t mode;    
00260     pgcnt_t *start;     
00261     pgcnt_t max_off;    
00262     int errors;         
00263 } BattFs;
00264 
00268 #define KFT_BATTFS MAKE_ID('B', 'T', 'F', 'S')
00269 
00274 INLINE BattFs * BATTFS_CAST(KFile *fd)
00275 {
00276     ASSERT(fd->_type == KFT_BATTFS);
00277     return (BattFs *)fd;
00278 }
00279 
00280 bool battfs_mount(struct BattFsSuper *d);
00281 bool battfs_fsck(struct BattFsSuper *disk);
00282 bool battfs_umount(struct BattFsSuper *disk);
00283 
00284 bool battfs_fileExists(BattFsSuper *disk, inode_t inode);
00285 bool battfs_fileopen(BattFsSuper *disk, BattFs *fd, inode_t inode, filemode_t mode);
00286 bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff);
00287 #endif /* FS_BATTFS_H */