Print this page
6253 F_GETLK doesn't always return lock owner
The F_GETLK fcntl doesn't return the offending lock if there is a read lock
on the file, a waiting write lock, and a read lock is requested.
The write lock blocks the locking request, but without this patch isn't
returned by GETLK.

*** 2097,2106 **** --- 2097,2125 ---- } lock = lock->l_next; } 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 request->l_flock.l_type = F_UNLCK; }