From 17334c853363d99c911b44258d0d51f19f4b3743 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 29 Jun 2026 11:33:03 -0300 Subject: [PATCH] advlock: general fixes --- kernel-src/fs/vfs.c | 10 ++++++++-- kernel-src/sys/syscalls/flock.c | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/kernel-src/fs/vfs.c b/kernel-src/fs/vfs.c index 93be8d65..83a1b22b 100644 --- a/kernel-src/fs/vfs.c +++ b/kernel-src/fs/vfs.c @@ -80,7 +80,10 @@ advlock_t *advlock_allocate(void) { } void advlock_free(advlock_t *advlock) { + advlock->type = ADVLOCK_UNLOCK; + advlock->shared_count = 0; advlock->refcount = 1; + EVENT_INITHEADER(&advlock->unlock_event); slab_free(advlock_cache, advlock); } @@ -270,8 +273,6 @@ static int adv_lock(vnode_t *vnode, int op, advlock_t *lock, bool non_blocking) } // can take the lock! - lock->type = op; - if (vnode->advlock == NULL) { // unlocked advlock if (op == ADVLOCK_SHARED) { @@ -281,6 +282,9 @@ static int adv_lock(vnode_t *vnode, int op, advlock_t *lock, bool non_blocking) error = ENOMEM; goto leave; } + + vnode->advlock->type = ADVLOCK_SHARED; + vnode->advlock->shared_count = 1; } else { // exclusive lock vnode->advlock = lock; @@ -291,6 +295,8 @@ static int adv_lock(vnode_t *vnode, int op, advlock_t *lock, bool non_blocking) ++vnode->advlock->shared_count; } + lock->type = op; + leave: MUTEX_RELEASE(&vnode->adv_mutex); return error; diff --git a/kernel-src/sys/syscalls/flock.c b/kernel-src/sys/syscalls/flock.c index 10a32619..4bd3f007 100644 --- a/kernel-src/sys/syscalls/flock.c +++ b/kernel-src/sys/syscalls/flock.c @@ -7,7 +7,7 @@ syscallret_t syscall_flock(context_t *, int fd, int op_flag) { .ret = -1 }; - int op = op_flag &= ~ADVLOCK_NON_BLOCKING; + int op = op_flag & ~ADVLOCK_NON_BLOCKING; switch (op) { case ADVLOCK_UNLOCK: case ADVLOCK_SHARED: