make mkdir and mknod return error if file or dir already exists; add tests
This commit is contained in:
parent
5dbac3d9e3
commit
68212773a6
@ -163,6 +163,20 @@ u_int64_t FilesOperation::create_new_inode(u_int64_t parent_inode_number, const
|
|||||||
return -1;
|
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;
|
u_int64_t new_inode_number = 0;
|
||||||
|
|
||||||
char rw_buffer[IO_BLOCK_SIZE] = {0};
|
char rw_buffer[IO_BLOCK_SIZE] = {0};
|
||||||
|
@ -29,7 +29,9 @@ int main(int argc, char *argv[]) {
|
|||||||
u_int64_t f1 = fsop.fischl_mkdir("foo/bar",0);
|
u_int64_t f1 = fsop.fischl_mkdir("foo/bar",0);
|
||||||
u_int64_t f2 = fsop.fischl_mkdir("/doesnt_exist/bar",0);
|
u_int64_t f2 = fsop.fischl_mkdir("/doesnt_exist/bar",0);
|
||||||
u_int64_t f3 = fsop.fischl_mkdir("/test/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)
|
// write to files (TODO: fischl_write)
|
||||||
// read and write to indirect datablocks are not supported yet
|
// 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]);
|
assert(inode_number == inode_numbers[i]);
|
||||||
}
|
}
|
||||||
fsop.printDirectory(file_pressure);
|
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);
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user