From 80470e2581f450094b44e0c2f0d932310fdee309 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Mon, 21 Apr 2008 15:30:40 +0100 Subject: [PATCH] Adding reply phase to pager_sys_open() So that open() errors on pager's side can be noticed by vfs. --- src/api/ipc.c | 2 +- tasks/fs0/src/syscalls.c | 16 +++++++++++++--- tasks/mm0/src/file.c | 30 ++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/api/ipc.c b/src/api/ipc.c index 0c4ebc4..b09cb12 100644 --- a/src/api/ipc.c +++ b/src/api/ipc.c @@ -273,7 +273,7 @@ int sys_ipc(struct syscall_args *regs) return ret; error: - printk("Erroneous ipc by: %d\n", current->tid); + printk("Erroneous ipc by: %d. Err: %d\n", current->tid, ret); ipc_type = IPC_INVALID; return ret; } diff --git a/tasks/fs0/src/syscalls.c b/tasks/fs0/src/syscalls.c index 4ee85e3..2daf131 100644 --- a/tasks/fs0/src/syscalls.c +++ b/tasks/fs0/src/syscalls.c @@ -35,11 +35,18 @@ int pager_sys_open(l4id_t sender, int fd, unsigned long vnum, unsigned long size write_mr(L4SYS_ARG2, vnum); write_mr(L4SYS_ARG3, size); - if ((err = l4_send(PAGER_TID, L4_IPC_TAG_PAGER_OPEN)) < 0) { + /* Tell pager about open request. Check ipc error. */ + if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_PAGER_OPEN)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); return err; } + /* Check if syscall itself was successful */ + if ((err = l4_get_retval()) < 0) { + printf("%s: Pager open Error: %d.\n", __FUNCTION__, fd); + return err; + } + return 0; } @@ -94,7 +101,7 @@ int sys_open(l4id_t sender, const char *pathname, int flags, unsigned int mode) struct vnode *v; struct tcb *task; int fd; - int retval; + int retval, err; /* Get the task */ BUG_ON(!(task = find_task(sender))); @@ -131,7 +138,10 @@ int sys_open(l4id_t sender, const char *pathname, int flags, unsigned int mode) task->fd[fd] = v->vnum; /* Tell the pager about opened vnode information */ - BUG_ON(pager_sys_open(sender, fd, v->vnum, v->size) < 0); + if ((err = pager_sys_open(sender, fd, v->vnum, v->size)) < 0) { + retval = err; + goto out; + } out: pathdata_destroy(pdata); diff --git a/tasks/mm0/src/file.c b/tasks/mm0/src/file.c index 3d10382..d101a4d 100644 --- a/tasks/mm0/src/file.c +++ b/tasks/mm0/src/file.c @@ -35,7 +35,8 @@ int vfs_read(unsigned long vnum, unsigned long file_offset, /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { - printf("%s: Pager from VFS read error: %d.\n", __FUNCTION__, err); + printf("%s: Pager from VFS read error: %d.\n", + __FUNCTION__, err); return err; } @@ -55,14 +56,20 @@ int vfs_receive_sys_open(l4id_t sender, l4id_t opener, int fd, struct tcb *t; /* Check argument validity */ - if (sender != VFS_TID) - return -EPERM; + if (sender != VFS_TID) { + l4_ipc_return(-EPERM); + return 0; + } - if (!(t = find_task(opener))) - return -EINVAL; + if (!(t = find_task(opener))) { + l4_ipc_return(-EINVAL); + return 0; + } - if (fd < 0 || fd > TASK_FILES_MAX) - return -EINVAL; + if (fd < 0 || fd > TASK_FILES_MAX) { + l4_ipc_return(-EINVAL); + return 0; + } /* Assign vnum to given fd on the task */ t->fd[fd].vnum = vnum; @@ -76,13 +83,16 @@ int vfs_receive_sys_open(l4id_t sender, l4id_t opener, int fd, /* Add a reference to it from the task */ t->fd[fd].vmfile = vmfile; vmfile->vm_obj.refcnt++; + l4_ipc_return(0); return 0; } } /* Otherwise allocate a new one for this vnode */ - if (IS_ERR(vmfile = vfs_file_create())) - return (int)vmfile; + if (IS_ERR(vmfile = vfs_file_create())) { + l4_ipc_return((int)vmfile); + return 0; + } /* Initialise and add it to global list */ vm_file_to_vnum(vmfile) = vnum; @@ -90,6 +100,7 @@ int vfs_receive_sys_open(l4id_t sender, l4id_t opener, int fd, vmfile->vm_obj.pager = &file_pager; list_add(&vmfile->vm_obj.list, &vm_file_list); + l4_ipc_return(0); return 0; } @@ -288,7 +299,6 @@ int new_file_pages(struct vm_file *f, unsigned long start, unsigned long end) /* Add the page to file's vm object */ BUG_ON(!list_empty(&page->list)); insert_page_olist(page, &f->vm_obj); - } /* Update vm object */