battfs.h

Go to the documentation of this file.
00001 
00045 #ifndef FS_BATTFS_H
00046 #define FS_BATTFS_H
00047 
00048 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
00049 #include <cpu/types.h> // CPU_BITS_PER_CHAR
00050 #include <algo/rotating_hash.h>
00051 #include <struct/list.h>
00052 #include <kern/kfile.h>
00053 
00054 typedef uint16_t fill_t;    
00055 typedef fill_t   pgaddr_t;  
00056 typedef uint16_t pgcnt_t;   
00057 typedef pgcnt_t  pgoff_t;   
00058 typedef uint8_t  inode_t;   
00059 typedef uint64_t  seq_t;    
00060 typedef rotating_t fcs_t;   
00061 
00062 
00070 typedef struct BattFsPageHeader
00071 {
00072     inode_t  inode; 
00073     fill_t   fill;  
00074     pgoff_t  pgoff; 
00075 
00084     seq_t    seq;
00085 
00089     fcs_t fcs;
00090 } BattFsPageHeader;
00091 
00097 #define BATTFS_HEADER_LEN 12
00098 
00102 #define MAX_PAGE_ADDR ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
00103 
00107 #define BATTFS_MAX_FILES (1 << (CPU_BITS_PER_CHAR * sizeof(inode_t)))
00108 
00109 /* Fwd decl */
00110 struct BattFsSuper;
00111 
00115 #define PAGE_UNSET_SENTINEL ((pgcnt_t)((1L << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1))
00116 
00123 typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t);
00124 
00125 
00134 typedef bool (*disk_page_load_t) (struct BattFsSuper *d, pgcnt_t page);
00135 
00142 typedef size_t  (*disk_buffer_write_t) (struct BattFsSuper *d, pgaddr_t addr, const void *buf, size_t);
00143 
00150 typedef size_t  (*disk_buffer_read_t) (struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t);
00151 
00159 typedef bool (*disk_page_save_t) (struct BattFsSuper *d, pgcnt_t page);
00160 
00166 typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, pgcnt_t page);
00167 
00172 typedef bool (*disk_close_t) (struct BattFsSuper *d);
00173 
00174 
00175 typedef uint32_t disk_size_t; 
00176 
00182 typedef struct BattFsSuper
00183 {
00184     void *disk_ctx;          
00185     disk_page_read_t  read;  
00186     disk_page_load_t  load;  
00187     disk_buffer_write_t bufferWrite; 
00188     disk_buffer_read_t bufferRead; 
00189     disk_page_save_t  save;  
00190     disk_page_erase_t erase; 
00191     disk_close_t close;      
00192 
00193     pgaddr_t page_size;      
00194     pgaddr_t data_size;      
00195     pgcnt_t page_count;      
00196 
00204     pgcnt_t *page_array;
00205     pgcnt_t curr_page;  
00206     bool cache_dirty;   
00207 
00212     pgcnt_t free_page_start;
00213 
00214     disk_size_t disk_size;   
00215     disk_size_t free_bytes;  
00216 
00217     List file_opened_list;       
00218     /* TODO add other fields. */
00219 } BattFsSuper;
00220 
00224 #define SPACE_OVER(disk) ((disk)->free_page_start >= (disk)->page_count)
00225 
00226 typedef uint8_t filemode_t;  
00227 typedef int32_t file_size_t; 
00228 
00233 #define BATTFS_CREATE BV(0)  ///< Create file if does not exist
00234 #define BATTFS_RD     BV(1)  ///< Open file for reading
00235 #define BATTFS_WR     BV(2)  ///< Open file fir writing
00236 /*/}*/
00237 
00238 
00243 #define BATTFS_NEGATIVE_SEEK_ERR   BV(0) ///< Trying to read/write before file start.
00244 #define BATTFS_DISK_READ_ERR       BV(1) ///< Error reading from disk driver.
00245 #define BATTFS_DISK_LOADPAGE_ERR   BV(2) ///< Error loading a disk page in the buffer.
00246 #define BATTFS_DISK_BUFFERWR_ERR   BV(3) ///< Error writing in the disk page buffer.
00247 #define BATTFS_DISK_GETNEWPAGE_ERR BV(4) ///< Error getting a free page.
00248 #define BATTFS_DISK_BUFFERRD_ERR   BV(6) ///< Error reading from the disk page buffer.
00249 #define BATTFS_DISK_SPACEOVER_ERR  BV(7) ///< No more disk space available.
00250 #define BATTFS_DISK_FLUSHBUF_ERR   BV(8) ///< Error flushing (writing) the current page to disk.
00251 #define BATTFS_FILE_NOT_FOUND_ERR  BV(9) ///< File not found on disk.
00252 /*/}*/
00253 
00257 typedef struct BattFs
00258 {
00259     KFile fd;           
00260     Node link;          
00261     inode_t inode;      
00262     BattFsSuper *disk;  
00263     filemode_t mode;    
00264     pgcnt_t *start;     
00265     pgcnt_t max_off;    
00266     int errors;         
00267 } BattFs;
00268 
00272 #define KFT_BATTFS MAKE_ID('B', 'T', 'F', 'S')
00273 
00278 INLINE BattFs * BATTFS_CAST(KFile *fd)
00279 {
00280     ASSERT(fd->_type == KFT_BATTFS);
00281     return (BattFs *)fd;
00282 }
00283 
00284 bool battfs_mount(struct BattFsSuper *d);
00285 bool battfs_fsck(struct BattFsSuper *disk);
00286 bool battfs_umount(struct BattFsSuper *disk);
00287 
00288 bool battfs_fileExists(BattFsSuper *disk, inode_t inode);
00289 bool battfs_fileopen(BattFsSuper *disk, BattFs *fd, inode_t inode, filemode_t mode);
00290 bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff);
00291 #endif /* FS_BATTFS_H */