solve some bugs in layer2merge

This commit is contained in:
Ziao 2023-11-28 09:56:08 -08:00
parent 4adfd6a173
commit 1b3cd99912
2 changed files with 17 additions and 6 deletions

View File

@ -68,19 +68,23 @@ int FilesOperation::read_datablock(const INode_Data& inode, u_int64_t index, cha
if (read_offset == (u_int64_t)(-1)) {
return -1;
}
//printf("Read %llu\n", read_offset/IO_BLOCK_SIZE);
return disk.read_block(read_offset/IO_BLOCK_SIZE, buffer);
}
int FilesOperation::write_datablock(INode_Data& inode, u_int64_t index, char* buffer) {
while (index >= inode.metadata.size) {
u_int64_t alloc_num;
fs->allocate_datablock(&inode, &alloc_num);
int ret = (fs->allocate_datablock(&inode, &alloc_num));
printf("allocate_datablock returned %d\n",ret);
if (ret!=0) assert(false);
inode.metadata.size += 1;
}
u_int64_t write_offset = index_to_offset(inode, disk, index);
if (write_offset == (u_int64_t)(-1)) {
return -1;
}
//printf("Write %llu\n", write_offset/IO_BLOCK_SIZE);
return disk.write_block(write_offset/IO_BLOCK_SIZE, buffer);
}
@ -131,7 +135,7 @@ INode_Data* FilesOperation::create_new_inode(u_int64_t parent_inode_number, cons
}
INode_Data inode;
inode.inode_num = parent_inode_number;
fs->inode_manager->save_inode(&inode);
fs->inode_manager->load_inode(&inode);
if ((inode.metadata.permissions & S_IFMT) != S_IFDIR) {
fprintf(stderr,"[%s ,%d] please create under directory\n",__func__,__LINE__);
return NULL;
@ -156,7 +160,7 @@ INode_Data* FilesOperation::create_new_inode(u_int64_t parent_inode_number, cons
}
bool allocated = false;
INode_Data *new_inode;
INode_Data *new_inode = new INode_Data();
fs->inode_manager->new_inode(0, 0, mode, new_inode);
if ((mode & S_IFMT) == S_IFDIR) {
create_dot_dotdot(new_inode, parent_inode_number);
@ -265,6 +269,7 @@ int FilesOperation::fischl_mkdir(const char* path, mode_t mode) {
return -ENOENT;//parentpath directory does not exist
}
u_int64_t parent_inode_number = parent_filenode->inode_number;
//printf("%s, %llu, %s\n", parent_filenode->name, parent_inode_number, newDirname);
//make new inode
INode_Data* ret = create_new_inode(parent_inode_number, newDirname, mode|S_IFDIR);//specify S_IFDIR as directory
if (ret == NULL) return -1;//ENOSPC but create_new_inode handle ENAMETOOLONG EEXIST

View File

@ -39,17 +39,23 @@ int total_free_file = 0;
TEST(FileOperationTest, MkdirnodTest) {
fsop->initialize_rootinode();
printf("OK\n");
struct fuse_file_info fi;
mode_t mode;//set mode
mode = S_IRWXU | S_IRWXG | S_IRWXO;//future should test permission
//S_IRWXU(S_IRUSR | S_IWUSR | S_IXUSR) (owner), S_IRWXG(S_IRGRP | S_IWGRP | S_IXGRP) (group), S_IRWXO(S_IROTH | S_IWOTH | S_IXOTH)
EXPECT_EQ(fsop->fischl_create("/test", mode, &fi), 0); // mode here is not used yet
EXPECT_EQ(fsop->fischl_create("/test", mode, &fi), 0);
printf("point 1:");
fsop->printDirectory(1);
EXPECT_EQ(fsop->fischl_mkdir("/foo", mode), 0);
printf("point 2:");
fsop->printDirectory(1);
EXPECT_EQ(fsop->fischl_mkdir("/foo/bar", mode),0);
printf("point 3:");
fsop->printDirectory(1);
EXPECT_EQ(fsop->fischl_create("/foo/bar/baz", mode, &fi), 0);
// the following three testcases will fail
printf("Failing cases\n");
EXPECT_TRUE(fsop->fischl_mkdir("foo/bar", mode) < 0);
EXPECT_TRUE(fsop->fischl_mkdir("/doesnt_exist/bar", mode) < 0);
EXPECT_TRUE(fsop->fischl_mkdir("/test/bar", mode) < 0);