> On Mar 17, 2022, at 1:39 PM, Jeff Layton <jlayton@xxxxxxxxxx> wrote: > > On Thu, 2022-03-17 at 00:43 -0700, Dai Ngo wrote: >> Add helper locks_owner_has_blockers to check if there is any blockers >> for a given lockowner. >> >> Signed-off-by: Dai Ngo <dai.ngo@xxxxxxxxxx> >> --- >> fs/locks.c | 28 ++++++++++++++++++++++++++++ >> include/linux/fs.h | 7 +++++++ >> 2 files changed, 35 insertions(+) >> >> diff --git a/fs/locks.c b/fs/locks.c >> index 050acf8b5110..53864eb99dc5 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) >> { >> diff --git a/include/linux/fs.h b/include/linux/fs.h >> index 831b20430d6e..2057a9df790f 100644 >> --- a/include/linux/fs.h >> +++ b/include/linux/fs.h >> @@ -1200,6 +1200,8 @@ extern void lease_unregister_notifier(struct notifier_block *); >> struct files_struct; >> extern void show_fd_locks(struct seq_file *f, >> struct file *filp, struct files_struct *files); >> +extern bool locks_owner_has_blockers(struct file_lock_context *flctx, >> + fl_owner_t owner); >> #else /* !CONFIG_FILE_LOCKING */ >> static inline int fcntl_getlk(struct file *file, unsigned int cmd, >> struct flock __user *user) >> @@ -1335,6 +1337,11 @@ static inline int lease_modify(struct file_lock *fl, int arg, >> struct files_struct; >> static inline void show_fd_locks(struct seq_file *f, >> struct file *filp, struct files_struct *files) {} >> +static inline bool locks_owner_has_blockers(struct file_lock_context *flctx, >> + fl_owner_t owner) >> +{ >> + return false; >> +} >> #endif /* !CONFIG_FILE_LOCKING */ >> >> static inline struct inode *file_inode(const struct file *f) > > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> Thanks! -- Chuck Lever