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