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 <mware/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 uint32_t mark_t;
00055 typedef uint8_t inode_t;
00056 typedef uint8_t seq_t;
00057 typedef rotating_t fcs_t;
00058
00063 STATIC_ASSERT(sizeof(mark_t) > sizeof(pgcnt_t));
00064
00072 typedef struct BattFsPageHeader
00073 {
00074 inode_t inode;
00075 seq_t seq;
00076 fill_t fill;
00077 pgoff_t pgoff;
00078 mark_t mark;
00079
00084 fcs_t fcs_free;
00085
00089 fcs_t fcs;
00090 } BattFsPageHeader;
00091
00097 #define BATTFS_HEADER_LEN 12
00098
00104 #define MARK_PAGE_VALID ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t) + 1)) - 1)
00105 #define FCS_FREE_VALID ((1 << (CPU_BITS_PER_CHAR * sizeof(fcs_t))) - 1)
00106
00107
00108
00113 #define MARK_HALF_SIZE (1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t) + 1))
00114
00118 #define MAX_PAGE_ADDR ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
00119
00123 #define BATTFS_MAX_FILES (1 << (CPU_BITS_PER_CHAR * sizeof(inode_t)))
00124
00125
00126 struct BattFsSuper;
00127
00131 #define PAGE_UNSET_SENTINEL ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)
00132
00137 typedef bool (*disk_open_t) (struct BattFsSuper *d);
00138
00145 typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t);
00146
00153 typedef size_t (*disk_page_write_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, const void *buf, size_t);
00154
00160 typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, pgcnt_t page);
00161
00166 typedef bool (*disk_close_t) (struct BattFsSuper *d);
00167
00168
00169 typedef uint32_t disk_size_t;
00170
00176 typedef struct BattFsSuper
00177 {
00178 disk_open_t open;
00179 disk_page_read_t read;
00180 disk_page_write_t write;
00181 disk_page_erase_t erase;
00182 disk_close_t close;
00183
00184 pgaddr_t page_size;
00185 pgcnt_t page_count;
00186
00194 pgcnt_t *page_array;
00195
00200 mark_t free_start;
00201
00206 mark_t free_next;
00207
00208 disk_size_t disk_size;
00209 disk_size_t free_bytes;
00210
00211 List file_opened_list;
00212
00213 } BattFsSuper;
00214
00215 typedef uint8_t filemode_t;
00216 typedef uint32_t file_size_t;
00217
00222 #define BATTFS_CREATE BV(0)
00223 #define BATTFS_RD BV(1)
00224 #define BATTFS_WR BV(2)
00225
00226
00227
00231 typedef struct KFileBattFs
00232 {
00233 KFile fd;
00234 Node link;
00235 inode_t inode;
00236 BattFsSuper *disk;
00237 filemode_t mode;
00238 pgcnt_t *start;
00239 } KFileBattFs;
00240
00244 #define KFT_BATTFS MAKE_ID('B', 'T', 'F', 'S')
00245
00250 INLINE KFileBattFs * KFILEBATTFS(KFile *fd)
00251 {
00252 ASSERT(fd->_type == KFT_BATTFS);
00253 return (KFileBattFs *)fd;
00254 }
00255
00256 bool battfs_init(struct BattFsSuper *d);
00257 bool battfs_close(struct BattFsSuper *disk);
00258
00259 bool battfs_fileExists(BattFsSuper *disk, inode_t inode);
00260 bool battfs_fileopen(BattFsSuper *disk, KFileBattFs *fd, inode_t inode, filemode_t mode);
00261
00262 bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff, mark_t mark);
00263
00264 #endif