diff --git a/tasks/fs0/src/syscalls.c b/tasks/fs0/src/syscalls.c index fa06846..ff58694 100644 --- a/tasks/fs0/src/syscalls.c +++ b/tasks/fs0/src/syscalls.c @@ -152,28 +152,6 @@ out: return 0; } -int sys_close(l4id_t sender, int fd) -{ - struct tcb *task; - - /* Get the task */ - BUG_ON(!(task = find_task(sender))); - - /* Validate file descriptor */ - if (fd < 0 || fd > TASK_OFILES_MAX) { - l4_ipc_return(-EBADF); - return 0; - } - if (!task->fd[fd]) { - l4_ipc_return(-EBADF); - return 0; - } - - /* Finish I/O on file */ - - return 0; -} - int sys_mkdir(l4id_t sender, const char *pathname, unsigned int mode) { struct tcb *task; @@ -271,6 +249,13 @@ int pager_sys_read(l4id_t sender, unsigned long vnum, unsigned long f_offset, return 0; } +/* + * This can be solely called by the pager and is not the posix write call. + * That call is in the pager. This writes the dirty pages of a file + * back to disk via vfs. + * + * The buffer must be contiguous by page, if npages > 1. + */ int pager_sys_write(l4id_t sender, unsigned long vnum, unsigned long f_offset, unsigned long npages, void *pagebuf) { diff --git a/tasks/mm0/src/file.c b/tasks/mm0/src/file.c index b3b14ee..4923f88 100644 --- a/tasks/mm0/src/file.c +++ b/tasks/mm0/src/file.c @@ -257,14 +257,38 @@ int write_file_pages(struct vm_file *vmfile, unsigned long pfn_start, return 0; } -int do_flush_file_pages(struct vm_file *vmfile) +int flush_file_pages(struct vm_file *vmfile) { } -int sys_close(void) +int sys_close(l4id_t sender, int fd) { + struct tcb *task; + struct vm_file *f; + int retval, err; + + /* Get the task */ + BUG_ON(!(task = find_task(sender))); + + /* Check fd validity */ + if (fd < 0 || fd > TASK_FILES_MAX || !task->fd[fd].vmfile) { + retval = -EBADF; + goto out; + } + + /* Finish I/O on file */ + f = task->fd[fd].vmfile; + if ((err = flush_file_pages(f)) < 0) { + retval = err; + goto out; + } + +out: + l4_ipc_return(retval); + return 0; } + int sys_flush(void) { }