From 0236ad663f75310e70cdf75630a646c2d8a3e419 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 26 Aug 2024 22:40:06 -0300 Subject: [PATCH] syscalls: fix more deadlocks and issues --- kernel-src/sys/syscalls/chdir.c | 2 ++ kernel-src/sys/syscalls/mount.c | 3 +++ kernel-src/sys/syscalls/renameat.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel-src/sys/syscalls/chdir.c b/kernel-src/sys/syscalls/chdir.c index 99717999..6170f026 100644 --- a/kernel-src/sys/syscalls/chdir.c +++ b/kernel-src/sys/syscalls/chdir.c @@ -33,6 +33,8 @@ syscallret_t syscall_chdir(context_t *, char *upath) { if (ret.errno) goto cleanup; + VOP_UNLOCK(new); + if (new->type != V_TYPE_DIR) { ret.errno = ENOTDIR; goto cleanup; diff --git a/kernel-src/sys/syscalls/mount.c b/kernel-src/sys/syscalls/mount.c index a5b0f61b..b720e8b1 100644 --- a/kernel-src/sys/syscalls/mount.c +++ b/kernel-src/sys/syscalls/mount.c @@ -78,8 +78,11 @@ syscallret_t syscall_mount(context_t *context, char *ubacking, char *umountpoint ret.errno = vfs_lookup(&backingnode, backingrefnode, backing, NULL, 0); if (ret.errno) goto cleanup; + + VOP_UNLOCK(backingnode); } + ret.errno = vfs_mount(backingnode, mountpointrefnode, mountpoint, fs, data); if (ubacking) { VOP_RELEASE(backingnode); diff --git a/kernel-src/sys/syscalls/renameat.c b/kernel-src/sys/syscalls/renameat.c index 7f6c6736..8339d6c2 100644 --- a/kernel-src/sys/syscalls/renameat.c +++ b/kernel-src/sys/syscalls/renameat.c @@ -60,7 +60,7 @@ syscallret_t syscall_renameat(context_t *context, int olddirfd, char *uoldpath, if (oldcomponent == NULL && newcomponent == NULL) goto cleanup; - // TODO possibly deadlocks + // TODO deadlocks. ret.errno = vfs_lookup(&sourcedirnode, olddirnode, oldpath, oldcomponent, VFS_LOOKUP_NOLINK | VFS_LOOKUP_PARENT); if (ret.errno) goto cleanup;