make mkdir and mknod return error if file or dir already exists; add tests

This commit is contained in:
Ziao 2023-11-18 20:52:36 -08:00
parent 5dbac3d9e3
commit 68212773a6
2 changed files with 26 additions and 1 deletions

View File

@ -163,6 +163,20 @@ u_int64_t FilesOperation::create_new_inode(u_int64_t parent_inode_number, const
return -1;
}
// Check if file or directory already exists
char r_buffer[IO_BLOCK_SIZE] = {0};
for (u_int64_t idx=0; idx<inode.size; idx++) {
read_datablock(inode, idx, r_buffer);
DirectoryEntry ent;
for(int i=0;i<=IO_BLOCK_SIZE-64;i+=64){
ent.deserialize(r_buffer+i);
if (strcmp(ent.file_name, name)==0) {
printf("Already exists file or directory with name %s, cannot not create\n", name);
return -1;
}
}
}
u_int64_t new_inode_number = 0;
char rw_buffer[IO_BLOCK_SIZE] = {0};

View File

@ -29,7 +29,9 @@ int main(int argc, char *argv[]) {
u_int64_t f1 = fsop.fischl_mkdir("foo/bar",0);
u_int64_t f2 = fsop.fischl_mkdir("/doesnt_exist/bar",0);
u_int64_t f3 = fsop.fischl_mkdir("/test/bar",0);
// TODO: guard against creating an existing file or diretory, such as fsop.fischl_mkdir("/test",0)
u_int64_t f4 = fsop.fischl_mkdir("/test",0);
u_int64_t f5 = fsop.fischl_mkdir("/foo/bar",0);
u_int64_t f6 = fsop.fischl_mkdir("/foo/bar/..",0);
// write to files (TODO: fischl_write)
// read and write to indirect datablocks are not supported yet
@ -102,4 +104,13 @@ int main(int argc, char *argv[]) {
assert(inode_number == inode_numbers[i]);
}
fsop.printDirectory(file_pressure);
std::string newprefix = "/pressure/New";
for(int i=0;i<700;i+=2){
inode_numbers[i] = fsop.fischl_mkdir((newprefix+std::to_string(i)).c_str(), 0);
}
for(int i=0;i<700;i+=2){
u_int64_t inode_number = fsop.namei((newprefix+std::to_string(i)).c_str());
assert(inode_number == inode_numbers[i]);
}
fsop.printDirectory(file_pressure);
}