mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 02:43:15 +01:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user