battfs.h
Go to the documentation of this file.
00001
00044 #ifndef FS_BATTFS_H
00045 #define FS_BATTFS_H
00046 
00047 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
00048 #include <cpu/types.h> // CPU_BITS_PER_CHAR
00049 #include <algo/rotating_hash.h>
00050 #include <struct/list.h>
00051 #include <io/kfile.h>
00052 #include <io/kblock.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 
00112 #define PAGE_UNSET_SENTINEL ((pgcnt_t)((1L << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1))
00113 
00114 typedef uint32_t disk_size_t;
00115
00121 typedef struct BattFsSuper
00122 {
00123     KBlock *dev;
00124
00125     pgaddr_t data_size;
00126
00133     pgcnt_t *page_array;
00134
00139     pgcnt_t free_page_start;
00140
00141     disk_size_t disk_size;
00142     disk_size_t free_bytes;
00143
00144     List file_opened_list;
00145     /* TODO add other fields. */
00146 } BattFsSuper;
00147
00151 #define SPACE_OVER(disk) ((disk)->free_page_start >= (disk)->dev->blk_cnt)
00152 
00153 typedef uint8_t filemode_t;
00154 typedef int32_t file_size_t;
00155
00160 #define BATTFS_CREATE BV(0)  ///< Create file if does not exist
00161 #define BATTFS_RD     BV(1)  ///< Open file for reading
00162 #define BATTFS_WR     BV(2)  ///< Open file fir writing
00163 /*/}*/
00164
00165
00170 #define BATTFS_NEGATIVE_SEEK_ERR   BV(0) ///< Trying to read/write before file start.
00171 #define BATTFS_DISK_READ_ERR       BV(1) ///< Error reading from disk device.
00172 #define BATTFS_DISK_WRITE_ERR      BV(2) ///< Error writing in the disk device.
00173 #define BATTFS_DISK_SPACEOVER_ERR  BV(3) ///< No more disk space available.
00174 #define BATTFS_DISK_FLUSHBUF_ERR   BV(4) ///< Error flushing (writing) the current page to disk.
00175 #define BATTFS_FILE_NOT_FOUND_ERR  BV(5) ///< File not found on disk.
00176 /*/}*/
00177
00181 typedef struct BattFs
00182 {
00183     KFile fd;
00184     Node link;
00185     inode_t inode;
00186     BattFsSuper *disk;
00187     filemode_t mode;
00188     pgcnt_t *start;
00189     pgcnt_t max_off;
00190     int errors;
00191 } BattFs;
00192
00196 #define KFT_BATTFS MAKE_ID('B', 'T', 'F', 'S')
00197 
00202 INLINE BattFs * BATTFS_CAST(KFile *fd)
00203 {
00204     ASSERT(fd->_type == KFT_BATTFS);
00205     return (BattFs *)fd;
00206 }
00207
00208 bool battfs_mount(struct BattFsSuper *disk, struct KBlock *dev, pgcnt_t *page_array, size_t array_size);
00209 bool battfs_fsck(struct BattFsSuper *disk);
00210 bool battfs_umount(struct BattFsSuper *disk);
00211
00212 bool battfs_fileExists(BattFsSuper *disk, inode_t inode);
00213 bool battfs_fileopen(BattFsSuper *disk, BattFs *fd, inode_t inode, filemode_t mode);
00214
00215 void battfs_writeTestBlock(KBlock *dev, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff);
00216 void battfs_eraseBlock(KBlock *dev, pgcnt_t page);
00217 #endif /* FS_BATTFS_H */