From ab67ee4cda2bbb657b511097f9939526061b3e72 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Tue, 16 Sep 2008 20:25:11 +0300 Subject: [PATCH] Added l4_restore_ipcregs() to all error return paths for stacked ipc calls --- tasks/mm0/src/clone.c | 9 +++++---- tasks/mm0/src/file.c | 44 +++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/tasks/mm0/src/clone.c b/tasks/mm0/src/clone.c index 41a34e8..7802cb7 100755 --- a/tasks/mm0/src/clone.c +++ b/tasks/mm0/src/clone.c @@ -20,7 +20,7 @@ */ int vfs_notify_fork(struct tcb *child, struct tcb *parent) { - int err; + int err = 0; printf("%s/%s\n", __TASKNAME__, __FUNCTION__); @@ -34,17 +34,18 @@ int vfs_notify_fork(struct tcb *child, struct tcb *parent) if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_NOTIFY_FORK)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { printf("%s: Pager from VFS read error: %d.\n", __FUNCTION__, err); - return err; + goto out; } - l4_restore_ipcregs(); +out: + l4_restore_ipcregs(); return err; } diff --git a/tasks/mm0/src/file.c b/tasks/mm0/src/file.c index 5d27e47..5eac94d 100644 --- a/tasks/mm0/src/file.c +++ b/tasks/mm0/src/file.c @@ -53,7 +53,7 @@ int page_copy(struct page *dst, struct page *src, int vfs_read(unsigned long vnum, unsigned long file_offset, unsigned long npages, void *pagebuf) { - int err; + int err = 0; // printf("%s/%s\n", __TASKNAME__, __FUNCTION__); @@ -66,17 +66,18 @@ int vfs_read(unsigned long vnum, unsigned long file_offset, if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_PAGER_READ)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { - printf("%s: Pager from VFS read error: %d.\n", + printf("%s: Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } - l4_restore_ipcregs(); +out: + l4_restore_ipcregs(); return err; } @@ -89,7 +90,7 @@ int vfs_read(unsigned long vnum, unsigned long file_offset, */ int vfs_open(l4id_t opener, int fd, unsigned long *vnum, unsigned long *length) { - int err; + int err = 0; // printf("%s/%s\n", __TASKNAME__, __FUNCTION__); @@ -100,22 +101,22 @@ int vfs_open(l4id_t opener, int fd, unsigned long *vnum, unsigned long *length) if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_PAGER_OPEN)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { printf("%s: VFS open error: %d.\n", __FUNCTION__, err); - return err; + goto out; } /* Read file information */ *vnum = read_mr(L4SYS_ARG0); *length = read_mr(L4SYS_ARG1); +out: l4_restore_ipcregs(); - return err; } @@ -251,7 +252,7 @@ int read_file_pages(struct vm_file *vmfile, unsigned long pfn_start, int vfs_write(unsigned long vnum, unsigned long file_offset, unsigned long npages, void *pagebuf) { - int err; + int err = 0; // printf("%s/%s\n", __TASKNAME__, __FUNCTION__); l4_save_ipcregs(); @@ -263,23 +264,23 @@ int vfs_write(unsigned long vnum, unsigned long file_offset, if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_PAGER_WRITE)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { printf("%s: Pager to VFS write error: %d.\n", __FUNCTION__, err); - return err; + goto out; } +out: l4_restore_ipcregs(); - return err; } int vfs_close(l4id_t sender, int fd) { - int err; + int err = 0; // printf("%s/%s Sending to %d\n", __TASKNAME__, __FUNCTION__, VFS_TID); l4_save_ipcregs(); @@ -289,25 +290,25 @@ int vfs_close(l4id_t sender, int fd) if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_PAGER_CLOSE)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } // printf("%s/%s Received from %d\n", __TASKNAME__, __FUNCTION__, VFS_TID); /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { printf("%s: Pager to VFS write error: %d.\n", __FUNCTION__, err); - return err; + goto out; } +out: l4_restore_ipcregs(); - return err; } /* Writes updated file stats back to vfs. (e.g. new file size) */ int vfs_update_file_stats(struct vm_file *f) { - int err; + int err = 0; // printf("%s/%s\n", __TASKNAME__, __FUNCTION__); l4_save_ipcregs(); @@ -318,20 +319,19 @@ int vfs_update_file_stats(struct vm_file *f) if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_PAGER_UPDATE_STATS)) < 0) { printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err); - return err; + goto out; } /* Check if syscall was successful */ if ((err = l4_get_retval()) < 0) { printf("%s: Pager to VFS write error: %d.\n", __FUNCTION__, err); - return err; + goto out; } +out: l4_restore_ipcregs(); - return err; - } /* Writes pages in cache back to their file */