fixed an issue with writing

This commit is contained in:
FactorialN 2023-12-01 13:57:29 -08:00
parent c2f3aa1310
commit c768bed015
5 changed files with 33 additions and 7 deletions

View File

@ -28,6 +28,7 @@ class FilesOperation {
int fischl_releasedir(const char* path, struct fuse_file_info *fi); int fischl_releasedir(const char* path, struct fuse_file_info *fi);
int fischl_unlink (const char *); int fischl_unlink (const char *);
int fischl_rmdir(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_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_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 int fischl_open (const char *, struct fuse_file_info *);//open file

View File

@ -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 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){ 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 /** Read data from an open file
* *

View File

@ -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); return options.fsop->fischl_chown(path, uid, gid, fi);
} }
static int fischl_truncate(const char *path, off_t, struct fuse_file_info *fi) { static int fischl_truncate(const char *path, off_t offset, struct fuse_file_info *fi) {
return -1; 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) { 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, //.link = fischl_link,
.chmod = fischl_chmod, .chmod = fischl_chmod,
.chown = fischl_chown, .chown = fischl_chown,
//.truncate = fischl_truncate, .truncate = fischl_truncate,
.open = fischl_open, .open = fischl_open,
.read = fischl_read, .read = fischl_read,
.write = fischl_write, .write = fischl_write,

View File

@ -205,8 +205,8 @@ ssize_t Fs::write(INode_Data *inode_data, char buf[], size_t count,
0) 0)
return err; return err;
inode_data->metadata.size = offset + op.bytes_completed; inode_data->metadata.size =
//std::max(offset + op.bytes_completed, inode_data->metadata.size); std::max(offset + op.bytes_completed, inode_data->metadata.size);
printf("written %d\n", op.bytes_completed); printf("written %d\n", op.bytes_completed);

View File

@ -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) { int FakeRawDisk::write_block(u_int64_t block_number, char *buffer) {
u_int64_t offset = block_number * IO_BLOCK_SIZE; 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) { if (offset + IO_BLOCK_SIZE > diskSize) {
perror("Error writing past fake disk size"); perror("Error writing past fake disk size");
return -1; return -1;