summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-07-24 10:43:15 +0000
committerkib <kib@FreeBSD.org>2014-07-24 10:43:15 +0000
commit8d73e435bfac721893024e8ec23a83c68f84827b (patch)
tree75ff5fffd4f65248d5dceb7aa80d056667249650 /sys/kern
parent0922bc9cde13fdb3b94909a867f86d7d7984ce5f (diff)
downloadFreeBSD-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.c10
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;
}
OpenPOWER on IntegriCloud