On Mon, Nov 14, 2022 at 09:07:47AM -0500, Jeff Layton wrote: > +bool vfs_file_has_locks(struct file *filp) > +{ > + struct file_lock_context *ctx; > + struct file_lock *fl; > + bool ret = false; > + > + ctx = smp_load_acquire(&locks_inode(filp)->i_flctx); > + if (!ctx) > + return false; > + > + spin_lock(&ctx->flc_lock); > + list_for_each_entry(fl, &ctx->flc_posix, fl_list) { > + if (fl->fl_file == filp) { > + ret = true; > + goto out; > + } > + } > + list_for_each_entry(fl, &ctx->flc_flock, fl_list) { > + if (fl->fl_file == filp) { > + ret = true; > + break; > + } > + } Maybe a little helper for the list lookup would be nice here: static inline bool __vfs_file_has_locks(struct file *file) { struct file_lock *fl; list_for_each_entry(fl, &ctx->flc_flock, fl_list) if (fl->fl_file == filp) return true; return false; } simplifying the check in the caller to: ret = __vfs_file_has_locks(&ctx->flc_posix) || __vfs_file_has_locks(&ctx->flc_flock); > +EXPORT_SYMBOL(vfs_file_has_locks); EXPORT_SYMBOL_GPL for any new network-fsy functionality would be nice.