diff --git a/include/fs.h b/include/fs.h index ba9f0cf..7211bfc 100644 --- a/include/fs.h +++ b/include/fs.h @@ -32,6 +32,7 @@ class INode{ off_t gid; off_t permissions; off_t size; + off_t block_number; public: void read_get_byte(off_t &t, int ¤t_pos, char *buffer){ @@ -44,6 +45,7 @@ public: void inode_construct(off_t blockNumber){ char buffer[512] = {0}; rawdisk_read(blockNumber, buffer); + block_number = blockNumber; int current_pos = 0; // initialize blocks for (int i = 0; i < 48; i++){ @@ -66,7 +68,7 @@ public: current_pos += 8; } - void inode_save(off_t blockNumber){ + void inode_save(){ char buffer[512] = {0}; int current_pos = 0; for (int i = 0; i < 48; i++){ @@ -79,21 +81,89 @@ public: write_get_byte(gid, current_pos, buffer); write_get_byte(permissions, current_pos, buffer); write_get_byte(size, current_pos, buffer); - rawdisk_write(bloackNumber, buffer); + rawdisk_write(block_number, buffer); + } + + off_t datablock_allocate_in_list(){ + //find a free data block + off_t freeListHead = SuperBlock::getFreeListHead(); + /* + 1. initialization + 2. data block starting position + 3. r/w between storage and rawdisk to maintain + */ + char buffer[512] = {0}; + off_t freeBlockNum = 0; + rawdisk_read(freeListHead, buffer); + for (int i = 8; i < 264; i++){ + if(buffer[i] != 255){ + for (int j = 0; j < 8; j++){ + if ((buffer[i]&(1<>= 8; + } + } + rawdisk_write(i, buffer); + } + } // allocate an inode and return the number of the inode // the i-th inode is in the i-th block