mirror of
https://github.com/drasko/codezero.git
synced 2026-04-18 01:39:05 +02:00
Added sys_close and sys_fsync
Untested.
This commit is contained in:
@@ -19,6 +19,7 @@ int pager_sys_read(l4id_t sender, unsigned long vnum, unsigned long f_offset,
|
||||
int pager_sys_write(l4id_t sender, unsigned long vnum, unsigned long f_offset,
|
||||
unsigned long npages, void *pagebuf);
|
||||
|
||||
int pager_sys_close(l4id_t sender, l4id_t closer, int fd);
|
||||
int pager_update_stats(l4id_t sender, unsigned long vnum,
|
||||
unsigned long newsize);
|
||||
#endif /* __FS0_SYSCALLS_H__ */
|
||||
|
||||
@@ -92,6 +92,9 @@ void handle_fs_requests(void)
|
||||
pager_sys_write(sender, (unsigned long)mr[0], (unsigned long)mr[1],
|
||||
(unsigned long)mr[2], (void *)mr[3]);
|
||||
break;
|
||||
case L4_IPC_TAG_PAGER_CLOSE:
|
||||
pager_sys_close(sender, (l4id_t)mr[0], (int)mr[1]);
|
||||
break;
|
||||
case L4_IPC_TAG_PAGER_UPDATE_STATS:
|
||||
pager_update_stats(sender, (unsigned long)mr[0],
|
||||
(unsigned long)mr[1]);
|
||||
|
||||
@@ -93,6 +93,30 @@ struct vnode *vfs_create(struct tcb *task, struct pathdata *pdata,
|
||||
return newnode;
|
||||
}
|
||||
|
||||
/* Pager notifies vfs about a closed file descriptor.
|
||||
*
|
||||
* FIXME: fsync + close could be done under a single "close" ipc
|
||||
* from pager. Currently there are 2 ipcs: 1 fsync + 1 fd close.
|
||||
*/
|
||||
int pager_sys_close(l4id_t sender, l4id_t closer, int fd)
|
||||
{
|
||||
struct tcb *task;
|
||||
int err;
|
||||
|
||||
BUG_ON(!(task = find_task(sender)));
|
||||
|
||||
if ((err = id_del(task->fdpool, task->fd[fd])) < 0) {
|
||||
printf("%s: Error releasing fd identifier.\n",
|
||||
__FUNCTION__);
|
||||
l4_ipc_return(err);
|
||||
return 0;
|
||||
}
|
||||
task->fd[fd] = -1;
|
||||
|
||||
l4_ipc_return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME:
|
||||
* - Is it already open?
|
||||
* - Allocate a copy of path string since lookup destroys it
|
||||
|
||||
Reference in New Issue
Block a user