summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorArne Jansen <sensille@gmx.net>2015-09-17 09:57:35 +0200
committerDan McDonald <danmcd@omniti.com>2015-09-22 09:50:05 -0400
commitb584d06cf5d63c0af8a641ca543c28986ec5cf81 (patch)
tree9e299a59fac69f7b176447fc38a4435f02c2716f /usr/src
parent09818e88dd7907e7eccd0caf8973ebfa6806b5f1 (diff)
downloadillumos-gate-b584d06cf5d63c0af8a641ca543c28986ec5cf81.tar.gz
6253 F_GETLK doesn't always return lock owner
Reviewed by: Marcel Telka <marcel@telka.sk> Reviewed by: Simon Klinkert <simon.klinkert@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/os/flock.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/usr/src/uts/common/os/flock.c b/usr/src/uts/common/os/flock.c
index 5dad4abb61..9671b7664d 100644
--- a/usr/src/uts/common/os/flock.c
+++ b/usr/src/uts/common/os/flock.c
@@ -2099,6 +2099,25 @@ flk_get_first_blocking_lock(lock_descriptor_t *request)
} while (lock->l_vnode == vp);
}
+ if (blocker == NULL && request->l_flock.l_type == F_RDLCK) {
+ /*
+ * No active lock is blocking this request, but if a read
+ * lock is requested, it may also get blocked by a waiting
+ * writer. So search all sleeping locks and see if there is
+ * a writer waiting.
+ */
+ SET_LOCK_TO_FIRST_SLEEP_VP(gp, lock, vp);
+ if (lock) {
+ do {
+ if (BLOCKS(lock, request)) {
+ blocker = lock;
+ break;
+ }
+ lock = lock->l_next;
+ } while (lock->l_vnode == vp);
+ }
+ }
+
if (blocker) {
report_blocker(blocker, request);
} else