From 06c85cef9d1d8a709730843fe9dbef7d341f79fc Mon Sep 17 00:00:00 2001 From: Doug Rabson Date: Fri, 9 May 2008 10:34:23 +0000 Subject: [PATCH] When blocking on an F_FLOCK style lock request which is upgrading a shared lock to exclusive, drop the shared lock before deadlock detection. MFC after: 2 days --- sys/kern/kern_lockf.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/sys/kern/kern_lockf.c b/sys/kern/kern_lockf.c index 045a3ba2f76..8cab502a6f8 100644 --- a/sys/kern/kern_lockf.c +++ b/sys/kern/kern_lockf.c @@ -1369,6 +1369,18 @@ lf_setlock(struct lockf *state, struct lockf_entry *lock, struct vnode *vp, goto out; } + /* + * For flock type locks, we must first remove + * any shared locks that we hold before we sleep + * waiting for an exclusive lock. + */ + if ((lock->lf_flags & F_FLOCK) && + lock->lf_type == F_WRLCK) { + lock->lf_type = F_UNLCK; + lf_activate_lock(state, lock); + lock->lf_type = F_WRLCK; + } + /* * We are blocked. Create edges to each blocking lock, * checking for deadlock using the owner graph. For @@ -1388,17 +1400,6 @@ lf_setlock(struct lockf *state, struct lockf_entry *lock, struct vnode *vp, goto out; } - /* - * For flock type locks, we must first remove - * any shared locks that we hold before we sleep - * waiting for an exclusive lock. - */ - if ((lock->lf_flags & F_FLOCK) && - lock->lf_type == F_WRLCK) { - lock->lf_type = F_UNLCK; - lf_activate_lock(state, lock); - lock->lf_type = F_WRLCK; - } /* * We have added edges to everything that blocks * us. Sleep until they all go away.