diff options
author | Dai Ngo <dai.ngo@oracle.com> | 2022-05-02 14:19:24 -0700 |
---|---|---|
committer | Chuck Lever <chuck.lever@oracle.com> | 2022-05-19 12:25:39 -0400 |
commit | 591502c5cb325b1c6ec59ab161927d606b918aa0 (patch) | |
tree | 3fd2d5fa59419021c3cec2eff473dceb3d534c2d /fs/locks.c | |
parent | d76cc46b37e123e8d245cc3490978dbda56f979d (diff) | |
download | linux-591502c5cb325b1c6ec59ab161927d606b918aa0.tar.gz linux-591502c5cb325b1c6ec59ab161927d606b918aa0.tar.bz2 linux-591502c5cb325b1c6ec59ab161927d606b918aa0.zip |
fs/lock: add helper locks_owner_has_blockers to check for blockers
Add helper locks_owner_has_blockers to check if there is any blockers
for a given lockowner.
Reviewed-by: J. Bruce Fields <bfields@fieldses.org>
Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Diffstat (limited to 'fs/locks.c')
-rw-r--r-- | fs/locks.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/fs/locks.c b/fs/locks.c index 8c6df10cd9ed..c369841ef7d1 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -300,6 +300,34 @@ void locks_release_private(struct file_lock *fl) } EXPORT_SYMBOL_GPL(locks_release_private); +/** + * locks_owner_has_blockers - Check for blocking lock requests + * @flctx: file lock context + * @owner: lock owner + * + * Return values: + * %true: @owner has at least one blocker + * %false: @owner has no blockers + */ +bool locks_owner_has_blockers(struct file_lock_context *flctx, + fl_owner_t owner) +{ + struct file_lock *fl; + + spin_lock(&flctx->flc_lock); + list_for_each_entry(fl, &flctx->flc_posix, fl_list) { + if (fl->fl_owner != owner) + continue; + if (!list_empty(&fl->fl_blocked_requests)) { + spin_unlock(&flctx->flc_lock); + return true; + } + } + spin_unlock(&flctx->flc_lock); + return false; +} +EXPORT_SYMBOL_GPL(locks_owner_has_blockers); + /* Free a lock which is not in use. */ void locks_free_lock(struct file_lock *fl) { |