iloveos/lib/fs/fs.cpp

78 lines
1.7 KiB
C++

#include "fs.hpp"
Fs::Fs(RawDisk *disk) {
disk = disk;
superblock = SuperBlock_Data();
inode_allocator = INode_Allocator_Freelist(this, 1, 1 + NUM_INODE_BLOCKS);
datablock_allocator =
DataBlock_Allocator_Bitmap(this, 1 + NUM_INODE_BLOCKS, NUM_BLOCKS);
};
int Fs::format() {
int err;
if ((err = store_superblock()) < 0)
return err;
if ((err = inode_allocator.format()) < 0)
return err;
if ((err = datablock_allocator.format()) < 0)
return err;
return 0;
}
int Fs::load_superblock() {
char buf[BLOCK_SIZE];
int err;
if ((err = disk->read_block(0, buf)) < 0)
return err;
superblock.deserialize(buf);
return 0;
}
int Fs::store_superblock() {
char buf[BLOCK_SIZE] = {0};
int err;
superblock.serialize(buf);
if ((err = disk->write_block(0, buf)) < 0)
return err;
return 0;
}
int Fs::load_inode(INode_Data *inode_data) {
char buf[BLOCK_SIZE];
int err;
u_int64_t block_num = inode_allocator.get_block_num(inode_data);
if (block_num == 0)
return -1;
u_int64_t block_offset = inode_allocator.get_block_offset(inode_data);
if ((err = disk->read_block(block_num, buf)) < 0)
return err;
inode_data->deserialize(&buf[block_offset])
return 0;
}
int Fs::store_inode(INode_Data *inode_data) {
char buf[BLOCK_SIZE];
int err;
u_int64_t block_num = inode_allocator.get_block_num(inode_data);
if (block_num == 0)
return -1;
u_int64_t block_offset = inode_allocator.get_block_offset(inode_data);
if ((err = disk->read_block(block_num, buf)) < 0)
return err;
inode_data->serialize(&buf[block_offset])
if ((err = disk->write_block(block_num, buf)) < 0) return err;
return 0;
}