From c768bed015d537aa9379e5899012dc038545b98e Mon Sep 17 00:00:00 2001 From: FactorialN <8838579+FactorialN@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:57:29 -0800 Subject: [PATCH] fixed an issue with writing --- include/files.h | 1 + lib/files.cpp | 27 +++++++++++++++++++++++++++ lib/fischl.cpp | 6 +++--- lib/fs/fs_read_write.cpp | 4 ++-- lib/rawdisk.cpp | 2 -- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/include/files.h b/include/files.h index 95206b8..b07b88b 100644 --- a/include/files.h +++ b/include/files.h @@ -28,6 +28,7 @@ class FilesOperation { int fischl_releasedir(const char* path, struct fuse_file_info *fi); int fischl_unlink (const char *); int fischl_rmdir(const char *); + int fischl_truncate(const char *path, off_t, struct fuse_file_info *fi); int fischl_chmod(const char *path, mode_t, struct fuse_file_info *fi); int fischl_chown(const char *path, uid_t uid, gid_t gid, struct fuse_file_info *fi); int fischl_open (const char *, struct fuse_file_info *);//open file diff --git a/lib/files.cpp b/lib/files.cpp index 7147b76..9f8ca84 100644 --- a/lib/files.cpp +++ b/lib/files.cpp @@ -591,6 +591,33 @@ int FilesOperation::fischl_write(const char *path, const char *buf, size_t size, return bytes_write; // Return the actual number of bytes read } +int FilesOperation::fischl_truncate(const char *path, off_t offset, struct fuse_file_info *fi){ + (void) fi; + int res = 0; + u_int64_t fh = namei(path); + + if (fh == -1){ + return -ENOENT; + } + + INode_Data inode; + inode.inode_num = fh; + fs->inode_manager->load_inode(&inode); + while(inode.metadata.size > offset + IO_BLOCK_SIZE) { + printf("dealloc, %d\n", inode.metadata.size); + u_int64_t dummy; + fs->deallocate_datablock(&inode, &dummy); + if (inode.metadata.size < IO_BLOCK_SIZE){ + inode.metadata.size = 0; + break; + } + inode.metadata.size-=IO_BLOCK_SIZE; + } + inode.metadata.size = offset; + fs->inode_manager->save_inode(&inode); + return 0; +} + int FilesOperation::fischl_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi){ /** Read data from an open file * diff --git a/lib/fischl.cpp b/lib/fischl.cpp index 3bc3b6e..22745a5 100644 --- a/lib/fischl.cpp +++ b/lib/fischl.cpp @@ -107,8 +107,8 @@ static int fischl_chown(const char *path, uid_t uid, gid_t gid, struct fuse_file return options.fsop->fischl_chown(path, uid, gid, fi); } -static int fischl_truncate(const char *path, off_t, struct fuse_file_info *fi) { - return -1; +static int fischl_truncate(const char *path, off_t offset, struct fuse_file_info *fi) { + return options.fsop->fischl_truncate(path, offset, fi); } static int fischl_utimens(const char *path, const struct timespec tv[2], struct fuse_file_info *fi) { @@ -166,7 +166,7 @@ static const struct fuse_operations fischl_oper = { //.link = fischl_link, .chmod = fischl_chmod, .chown = fischl_chown, - //.truncate = fischl_truncate, + .truncate = fischl_truncate, .open = fischl_open, .read = fischl_read, .write = fischl_write, diff --git a/lib/fs/fs_read_write.cpp b/lib/fs/fs_read_write.cpp index 3ffccff..4fc1d16 100644 --- a/lib/fs/fs_read_write.cpp +++ b/lib/fs/fs_read_write.cpp @@ -205,8 +205,8 @@ ssize_t Fs::write(INode_Data *inode_data, char buf[], size_t count, 0) return err; - inode_data->metadata.size = offset + op.bytes_completed; - //std::max(offset + op.bytes_completed, inode_data->metadata.size); + inode_data->metadata.size = + std::max(offset + op.bytes_completed, inode_data->metadata.size); printf("written %d\n", op.bytes_completed); diff --git a/lib/rawdisk.cpp b/lib/rawdisk.cpp index fb1e5f2..c0ed0ab 100644 --- a/lib/rawdisk.cpp +++ b/lib/rawdisk.cpp @@ -123,8 +123,6 @@ int FakeRawDisk::read_block(u_int64_t block_number, char *buffer) { int FakeRawDisk::write_block(u_int64_t block_number, char *buffer) { u_int64_t offset = block_number * IO_BLOCK_SIZE; - printf("fake disk write: %llu %llu %llu\n", block_number, offset, diskSize); - if (offset + IO_BLOCK_SIZE > diskSize) { perror("Error writing past fake disk size"); return -1;