diff options
Diffstat (limited to 'bfs/blocks.ha')
| -rw-r--r-- | bfs/blocks.ha | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/bfs/blocks.ha b/bfs/blocks.ha new file mode 100644 index 0000000..ec88e70 --- /dev/null +++ b/bfs/blocks.ha @@ -0,0 +1,58 @@ +use io; + +fn getblockdata(filesystem: *bfs, blockid: u64, data: []u8) (void | io::error) = { + const blockaddr = (blockid << filesystem.bootsector.blocksize): io::off; + + pread(filesystem.device, data, blockaddr)?; +}; + +fn setblockdata(filesystem: *bfs, blockid: u64, data: []u8) (void | io::error) = { + const blockaddr = (blockid << filesystem.bootsector.blocksize): io::off; + + pwrite(filesystem.device, data, blockaddr)?; +}; + +// Inode block: a block used to store +// inodes +export type inode_block = struct { + // Previous inode block containing + // free inodes, or 0 + @offset(0) prevblock: u64, + + // Next inode block containing + // free inodes, or 0 + @offset(8) nextblock: u64, + + // Next free inode in the block + @offset(16) nextinode: u64, + + // Lowest yet to be allocated inode + @offset(24) freeinode: u64, + + // Count of free inodes in block + @offset(32) freecount: u64, +}; + +export fn getinblock(filesystem: *bfs, blockid: u64, inblock: *inode_block) (void | io::error) = { + getblockdata(filesystem, blockid, inblock: *[size(inode_block)]u8)?; +}; + +export fn setinblock(filesystem: *bfs, blockid: u64, inblock: *inode_block) (void | io::error) = { + setblockdata(filesystem, blockid, inblock: *[size(inode_block)]u8)?; +}; + +// Free block: a block that has been +// previously freed +export type free_block = struct { + // Previous freeblock in freelist + // or 0 + @offset(0) prevblock: u64, +}; + +export fn getfreeblock(filesystem: *bfs, blockid: u64, freeblock: *free_block) (void | io::error) = { + getblockdata(filesystem, blockid, freeblock: *[size(free_block)]u8)?; +}; + +export fn setfreeblock(filesystem: *bfs, blockid: u64, freeblock: *free_block) (void | io::error) = { + setblockdata(filesystem, blockid, freeblock: *[size(free_block)]u8)?; +}; |
