From 0557fa8910b00024261695b3433169384bc2a687 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Sat, 26 Apr 2008 01:03:11 +0100 Subject: [PATCH] Gotta find a way to pass on updated file size before write_file_pages. --- tasks/fs0/src/memfs/vnode.c | 3 +- tasks/fs0/src/syscalls.c | 63 ++++++++++++++++++++++++++----------- tasks/mm0/src/file.c | 15 +++++---- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/tasks/fs0/src/memfs/vnode.c b/tasks/fs0/src/memfs/vnode.c index db3d373..61220a0 100644 --- a/tasks/fs0/src/memfs/vnode.c +++ b/tasks/fs0/src/memfs/vnode.c @@ -260,7 +260,8 @@ struct vnode *memfs_vnode_mknod(struct vnode *v, const char *dirname, memfsd->name[MEMFS_DNAME_MAX - 1] = '\0'; /* Write the updated directory buffer back to disk block */ - v->fops.write(v, 0, 1, v->dirbuf.buffer); + if ((err = v->fops.write(v, 0, 1, v->dirbuf.buffer)) < 0) + return PTR_ERR(err); /* FIXME: free all you allocated so far */ /* Update parent vnode size */ v->size += sizeof(*memfsd); diff --git a/tasks/fs0/src/syscalls.c b/tasks/fs0/src/syscalls.c index ff58694..f63d595 100644 --- a/tasks/fs0/src/syscalls.c +++ b/tasks/fs0/src/syscalls.c @@ -230,22 +230,32 @@ int pager_sys_read(l4id_t sender, unsigned long vnum, unsigned long f_offset, unsigned long npages, void *pagebuf) { struct vnode *v; - int err; + int err, retval = 0; - if (sender != PAGER_TID) - return -EINVAL; + if (sender != PAGER_TID) { + retval = -EINVAL; + goto out; + } /* Lookup vnode */ - if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum))) - return -EINVAL; /* No such vnode */ + if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum))) { + retval = -EINVAL; /* No such vnode */ + goto out; + } /* Ensure vnode is not a directory */ - if (vfs_isdir(v)) - return -EISDIR; + if (vfs_isdir(v)) { + retval = -EISDIR; + goto out; + } - if ((err = v->fops.read(v, f_offset, npages, pagebuf)) < 0) - return err; + if ((err = v->fops.read(v, f_offset, npages, pagebuf)) < 0) { + retval = err; + goto out; + } +out: + l4_ipc_return(retval); return 0; } @@ -260,22 +270,39 @@ int pager_sys_write(l4id_t sender, unsigned long vnum, unsigned long f_offset, unsigned long npages, void *pagebuf) { struct vnode *v; - int err; + int err, retval = 0; + int bytes = 0; - if (sender != PAGER_TID) - return -EINVAL; + if (sender != PAGER_TID) { + retval = -EINVAL; + goto out; + } /* Lookup vnode */ - if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum))) - return -EINVAL; /* No such vnode */ + if (!(v = vfs_lookup_byvnum(vfs_root.pivot->sb, vnum))) { + retval = -EINVAL; /* No such vnode */ + goto out; + } /* Ensure vnode is not a directory */ - if (vfs_isdir(v)) - return -EISDIR; + if (vfs_isdir(v)) { + retval = -EISDIR; + goto out; + } - if ((err = v->fops.write(v, f_offset, npages, pagebuf)) < 0) - return err; + /* If the file is extended, write automatically extends it */ + if ((err = v->fops.write(v, f_offset, npages, pagebuf)) < 0) { + retval = err; + goto out; + } + /* FIXME: Find a way to properly update new bytes */ + BUG(); + v->size += bytes; + v->sb->ops->write_vnode(v->sb, v); + +out: + l4_ipc_return(retval); return 0; } diff --git a/tasks/mm0/src/file.c b/tasks/mm0/src/file.c index 4923f88..6a197e6 100644 --- a/tasks/mm0/src/file.c +++ b/tasks/mm0/src/file.c @@ -238,18 +238,18 @@ int vfs_write(unsigned long vnum, unsigned long file_offset, } /* Writes pages in cache back to their file */ -int write_file_pages(struct vm_file *vmfile, unsigned long pfn_start, +int write_file_pages(struct vm_file *f, unsigned long pfn_start, unsigned long pfn_end) { int err; + BUG_ON(pfn_end != __pfn(page_align_up(f->length))); for (int f_offset = pfn_start; f_offset < pfn_end; f_offset++) { - err = vmfile->vm_obj.pager->ops.page_out(&vmfile->vm_obj, - f_offset); + err = f->vm_obj.pager->ops.page_out(&f->vm_obj, f_offset); if (err < 0) { printf("%s: %s:Could not write page %d " "to file with vnum: 0x%x\n", __TASKNAME__, - __FUNCTION__, f_offset, vm_file_to_vnum(vmfile)); + __FUNCTION__, f_offset, vm_file_to_vnum(f)); return err; } } @@ -257,9 +257,11 @@ int write_file_pages(struct vm_file *vmfile, unsigned long pfn_start, return 0; } -int flush_file_pages(struct vm_file *vmfile) +int flush_file_pages(struct vm_file *f) { + write_file_pages(f, 0, __pfn(page_align_up(f->length))); + return 0; } int sys_close(l4id_t sender, int fd) @@ -289,8 +291,9 @@ out: return 0; } -int sys_flush(void) +int sys_fsync(int fd) { + return 0; } /* FIXME: Add error handling to this */