Adding reply phase to pager_sys_open()

So that open() errors on pager's side can be noticed by vfs.
This commit is contained in:
Bahadir Balban
2008-04-21 15:30:40 +01:00
parent a674cf2b27
commit 80470e2581
3 changed files with 34 additions and 14 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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 */