From fd175e5470126d01d722905f67b06e85e58a33b5 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 26 Nov 2023 13:22:12 -0800 Subject: [PATCH 1/2] still working on fischl_write --- lib/files.cpp | 24 +++++++++++++++++++++++- test/layer2_API_dir.cpp | 27 ++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/files.cpp b/lib/files.cpp index 9f6027f..86c53a5 100644 --- a/lib/files.cpp +++ b/lib/files.cpp @@ -452,8 +452,30 @@ int FilesOperation::fischl_write(const char *path, const char *buf, size_t size, // FileNode *get_file; // if((get_file = fischl_find_entry(root_node, path)) == NULL) // 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){ diff --git a/test/layer2_API_dir.cpp b/test/layer2_API_dir.cpp index 4b87f89..1b84951 100644 --- a/test/layer2_API_dir.cpp +++ b/test/layer2_API_dir.cpp @@ -62,12 +62,18 @@ TEST(FileOperationTest, WriteTest) { char buffer[IO_BLOCK_SIZE] = {0}; INode inode; u_int64_t get_disk_inum; + struct fuse_file_info fi; + //file test get_disk_inum = fsop->disk_namei("/test"); inode.inode_construct(get_disk_inum, *H); buffer[0] = '1'; fsop->write_datablock(inode, 0, buffer); 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 get_disk_inum = fsop->disk_namei("/foo/bar/baz"); inode.inode_construct(get_disk_inum, *H); @@ -77,6 +83,13 @@ TEST(FileOperationTest, WriteTest) { fsop->write_datablock(inode, 101, buffer); inode.inode_save(*H); // 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) { @@ -135,10 +148,18 @@ TEST(FileOperationTest, ReadTest) { //read baz file get_file_inum= fsop->namei("/foo/bar/baz"); - inode.inode_construct(get_file_inum, *H); - fsop->read_datablock(inode, 3, read_buffer); + // inode.inode_construct(get_file_inum, *H); + // 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'); - 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'); } From d0659eb379fa2cd1d9f43ed2724cd04f554bfc3a Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 26 Nov 2023 14:07:21 -0800 Subject: [PATCH 2/2] Pass WriteTest with fischl_write --- lib/files.cpp | 6 ++---- test/layer2_API_dir.cpp | 26 +++++++------------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/lib/files.cpp b/lib/files.cpp index 86c53a5..7e3a796 100644 --- a/lib/files.cpp +++ b/lib/files.cpp @@ -467,14 +467,12 @@ int FilesOperation::fischl_write(const char *path, const char *buf, size_t size, 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); + // fprintf(stderr,"[%s ,%d] inode.size %d, block_index %d, block_buffer %s\n",__func__,__LINE__, inode.size, block_index, block_buffer); bytes_write += copy_size; block_index++; block_offset = 0; // Only the first block might have a non-zero offset } - + inode.inode_save(disk); return bytes_write; // Return the actual number of bytes read } diff --git a/test/layer2_API_dir.cpp b/test/layer2_API_dir.cpp index 1b84951..3a857ad 100644 --- a/test/layer2_API_dir.cpp +++ b/test/layer2_API_dir.cpp @@ -66,30 +66,18 @@ TEST(FileOperationTest, WriteTest) { //file test get_disk_inum = fsop->disk_namei("/test"); - inode.inode_construct(get_disk_inum, *H); + fsop->fischl_open("/test", &fi); + EXPECT_EQ(fi.fh, get_disk_inum); buffer[0] = '1'; - fsop->write_datablock(inode, 0, buffer); - 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); + fsop->fischl_write("/test", buffer, sizeof(buffer), 0, &fi); //other file baz get_disk_inum = fsop->disk_namei("/foo/bar/baz"); - inode.inode_construct(get_disk_inum, *H); buffer[0] = '4'; - fsop->write_datablock(inode, 3, buffer); + 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->write_datablock(inode, 101, buffer); - inode.inode_save(*H); - // 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); + fsop->fischl_write("/foo/bar/baz", buffer, sizeof(buffer), 101*IO_BLOCK_SIZE, &fi); } TEST(FileOperationTest, RamDiskTest) {