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)?; };