diff options
author | Arne Jansen <sensille@gmx.net> | 2015-09-17 09:57:35 +0200 |
---|---|---|
committer | Dan McDonald <danmcd@omniti.com> | 2015-09-22 09:50:05 -0400 |
commit | b584d06cf5d63c0af8a641ca543c28986ec5cf81 (patch) | |
tree | 9e299a59fac69f7b176447fc38a4435f02c2716f /usr/src | |
parent | 09818e88dd7907e7eccd0caf8973ebfa6806b5f1 (diff) | |
download | illumos-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.c | 19 |
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 |