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