fixed an issue with writing
This commit is contained in:
parent
c2f3aa1310
commit
c768bed015
@ -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
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user