diff options
author | kib <kib@FreeBSD.org> | 2014-07-24 10:43:15 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-07-24 10:43:15 +0000 |
commit | 8d73e435bfac721893024e8ec23a83c68f84827b (patch) | |
tree | 75ff5fffd4f65248d5dceb7aa80d056667249650 /sys/kern | |
parent | 0922bc9cde13fdb3b94909a867f86d7d7984ce5f (diff) | |
download | FreeBSD-src-8d73e435bfac721893024e8ec23a83c68f84827b.zip FreeBSD-src-8d73e435bfac721893024e8ec23a83c68f84827b.tar.gz |
MFC r268384:
When the lock was stolen from us, retry the whole lock sequence in kernel,
instead of returning EINTR.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_lockf.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/kern/kern_lockf.c b/sys/kern/kern_lockf.c index 6d6dc51..8d5c576 100644 --- a/sys/kern/kern_lockf.c +++ b/sys/kern/kern_lockf.c @@ -469,6 +469,9 @@ lf_advlockasync(struct vop_advlockasync_args *ap, struct lockf **statep, return (EOVERFLOW); end = start + oadd; } + +retry_setlock: + /* * Avoid the common case of unlocking when inode has no locks. */ @@ -744,6 +747,11 @@ lf_advlockasync(struct vop_advlockasync_args *ap, struct lockf **statep, sx_destroy(&freestate->ls_lock); free(freestate, M_LOCKF); } + + if (error == EDOOFUS) { + KASSERT(ap->a_op == F_SETLK, ("EDOOFUS")); + goto retry_setlock; + } return (error); } @@ -1459,7 +1467,7 @@ lf_setlock(struct lockf *state, struct lockf_entry *lock, struct vnode *vp, lock->lf_refs++; error = sx_sleep(lock, &state->ls_lock, priority, lockstr, 0); if (lf_free_lock(lock)) { - error = EINTR; + error = EDOOFUS; goto out; } |