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>
00048 #include <cpu/types.h>
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
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