still working on fischl_write

This commit is contained in:
Victor 2023-11-26 13:22:12 -08:00
parent f5b572fa8c
commit fd175e5470
2 changed files with 47 additions and 4 deletions

View File

@ -452,8 +452,30 @@ int FilesOperation::fischl_write(const char *path, const char *buf, size_t size,
// FileNode *get_file; // FileNode *get_file;
// if((get_file = fischl_find_entry(root_node, path)) == NULL) // if((get_file = fischl_find_entry(root_node, path)) == NULL)
// return -ENOENT; // return -ENOENT;
// Caution! this based on content in file are multiple of IO_BLOCK_SIZE, not the exact write size.
// based on current write_datablock API implement, when write_datablock pass with actual size not index this function should be fixed
INode inode;
// Assuming inode is correctly initialized here based on 'path'
inode.inode_construct(fi->fh, disk);
size_t len = inode.size * IO_BLOCK_SIZE; // Assuming each block is 4096 bytes
return size; size_t bytes_write = 0;
size_t block_index = offset / IO_BLOCK_SIZE; // Starting block index
size_t block_offset = offset % IO_BLOCK_SIZE; // Offset within the first block
while (bytes_write < size) {
char block_buffer[IO_BLOCK_SIZE]; // Temporary buffer for each block
size_t copy_size = std::min(size - bytes_write, IO_BLOCK_SIZE - block_offset);
memcpy(block_buffer + block_offset, buf + bytes_write, copy_size);
write_datablock(inode, block_index, block_buffer);
fprintf(stderr,"[%s ,%d] inode.size %d\n",__func__,__LINE__, inode.size);
fprintf(stderr,"[%s ,%d] block_index %d\n",__func__,__LINE__, block_index);
fprintf(stderr,"[%s ,%d] buf %s, block_buffer %s\n",__func__,__LINE__, buf, block_buffer);
bytes_write += copy_size;
block_index++;
block_offset = 0; // Only the first block might have a non-zero offset
}
return bytes_write; // Return the actual number of bytes read
} }
int FilesOperation::fischl_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi){ int FilesOperation::fischl_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi){

View File

@ -62,12 +62,18 @@ TEST(FileOperationTest, WriteTest) {
char buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
INode inode; INode inode;
u_int64_t get_disk_inum; u_int64_t get_disk_inum;
struct fuse_file_info fi;
//file test //file test
get_disk_inum = fsop->disk_namei("/test"); get_disk_inum = fsop->disk_namei("/test");
inode.inode_construct(get_disk_inum, *H); inode.inode_construct(get_disk_inum, *H);
buffer[0] = '1'; buffer[0] = '1';
fsop->write_datablock(inode, 0, buffer); fsop->write_datablock(inode, 0, buffer);
inode.inode_save(*H); inode.inode_save(*H);
/*with fischl_write API*/
// fsop->fischl_open("/test", &fi);
// EXPECT_EQ(fi.fh, get_disk_inum);
// fsop->fischl_write("/test", buffer, sizeof(buffer), 0, &fi);
//other file baz //other file baz
get_disk_inum = fsop->disk_namei("/foo/bar/baz"); get_disk_inum = fsop->disk_namei("/foo/bar/baz");
inode.inode_construct(get_disk_inum, *H); inode.inode_construct(get_disk_inum, *H);
@ -77,6 +83,13 @@ TEST(FileOperationTest, WriteTest) {
fsop->write_datablock(inode, 101, buffer); fsop->write_datablock(inode, 101, buffer);
inode.inode_save(*H); inode.inode_save(*H);
// TODO: guard against overwriting directory datablocks // TODO: guard against overwriting directory datablocks
/*with new API*/
// buffer[0] = '4';
// fsop->fischl_open("/foo/bar/baz", &fi);
// EXPECT_EQ(fi.fh, get_disk_inum);
// fsop->fischl_write("/foo/bar/baz", buffer, sizeof(buffer), 3*IO_BLOCK_SIZE, &fi);
// buffer[0] = '5';
// fsop->fischl_write("/foo/bar/baz", buffer, sizeof(buffer), 101*IO_BLOCK_SIZE, &fi);
} }
TEST(FileOperationTest, RamDiskTest) { TEST(FileOperationTest, RamDiskTest) {
@ -135,10 +148,18 @@ TEST(FileOperationTest, ReadTest) {
//read baz file //read baz file
get_file_inum= fsop->namei("/foo/bar/baz"); get_file_inum= fsop->namei("/foo/bar/baz");
inode.inode_construct(get_file_inum, *H); // inode.inode_construct(get_file_inum, *H);
fsop->read_datablock(inode, 3, read_buffer); // fsop->read_datablock(inode, 3, read_buffer);
// EXPECT_EQ(read_buffer[0], '4');
// fsop->read_datablock(inode, 101, read_buffer);
// EXPECT_EQ(read_buffer[0], '5');
//read baz file again with fischl_read API
fsop->fischl_open("/foo/bar/baz", &fi);
EXPECT_EQ(fi.fh, get_file_inum);
fsop->fischl_read("/foo/bar/baz", read_buffer, sizeof(read_buffer), 3*IO_BLOCK_SIZE, &fi);
EXPECT_EQ(read_buffer[0], '4'); EXPECT_EQ(read_buffer[0], '4');
fsop->read_datablock(inode, 101, read_buffer); fsop->fischl_read("/foo/bar/baz", read_buffer, sizeof(read_buffer), 101*IO_BLOCK_SIZE, &fi);
EXPECT_EQ(read_buffer[0], '5'); EXPECT_EQ(read_buffer[0], '5');
} }