70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
#include "fs.hpp"
|
|
|
|
Fs::Fs(RawDisk *disk) : disk(disk) {
|
|
assert((disk->diskSize / IO_BLOCK_SIZE) >
|
|
2 + NUM_INODE_BLOCKS + DATABLOCKS_PER_BITMAP_BLOCK);
|
|
superblock = SuperBlock_Data();
|
|
inode_manager = new INode_Manager_Freelist(this, 1, 1 + NUM_INODE_BLOCKS);
|
|
datablock_manager = new DataBlock_Manager_Bitmap(
|
|
this, 1 + NUM_INODE_BLOCKS, disk->diskSize / IO_BLOCK_SIZE);
|
|
};
|
|
|
|
Fs::~Fs() {
|
|
delete inode_manager;
|
|
delete datablock_manager;
|
|
};
|
|
|
|
int Fs::format() {
|
|
int err;
|
|
if ((err = save_superblock()) < 0)
|
|
return err;
|
|
if ((err = inode_manager->format()) < 0)
|
|
return err;
|
|
if ((err = datablock_manager->format()) < 0)
|
|
return err;
|
|
return 0;
|
|
}
|
|
|
|
int Fs::load_superblock() {
|
|
char buf[IO_BLOCK_SIZE];
|
|
int err;
|
|
|
|
if ((err = disk->read_block(0, buf)) < 0)
|
|
return err;
|
|
|
|
superblock.deserialize(buf);
|
|
|
|
return 0;
|
|
}
|
|
int Fs::save_superblock() {
|
|
char buf[IO_BLOCK_SIZE] = {0};
|
|
int err;
|
|
|
|
superblock.serialize(buf);
|
|
|
|
if ((err = disk->write_block(0, buf)) < 0)
|
|
return err;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int Fs::save_free_list_head(u_int64_t new_free_list_head) {
|
|
u_int64_t temp = superblock.free_list_head;
|
|
int err;
|
|
superblock.free_list_head = new_free_list_head;
|
|
if ((err = save_superblock()) < 0) {
|
|
superblock.free_list_head = temp;
|
|
return err;
|
|
}
|
|
return 0;
|
|
}
|
|
int Fs::save_inode_list_head(u_int64_t new_inode_list_head) {
|
|
u_int64_t temp = superblock.inode_list_head;
|
|
int err;
|
|
superblock.inode_list_head = new_inode_list_head;
|
|
if ((err = save_superblock()) < 0) {
|
|
superblock.inode_list_head = temp;
|
|
return err;
|
|
}
|
|
return 0;
|
|
} |