]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
filelock: add an inode_lease_ignore_mask helper
authorJeff Layton <jlayton@kernel.org>
Tue, 28 Apr 2026 07:09:48 +0000 (08:09 +0100)
committerChristian Brauner <brauner@kernel.org>
Fri, 15 May 2026 17:24:32 +0000 (19:24 +0200)
Add a new routine that returns a mask of all dir change events that are
currently ignored by any leases. nfsd will use this to determine how to
configure the fsnotify_mark mask.

Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20260428-dir-deleg-v3-4-5a0780ba9def@kernel.org
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/locks.c
include/linux/filelock.h

index afa80fe6e9ffeb5b32d8dc793e9fec24c89e8deb..6e4ff7fcec053e8823129d2dea77ec13f4488bc3 100644 (file)
@@ -1582,6 +1582,38 @@ trace:
        return rc;
 }
 
+#define IGNORE_MASK    (FL_IGN_DIR_CREATE | FL_IGN_DIR_DELETE | FL_IGN_DIR_RENAME)
+
+/**
+ * inode_lease_ignore_mask - return union of all ignored inode events for this inode
+ * @inode: inode of which to get ignore mask
+ *
+ * Walk the list of leases, and return the result of all of
+ * their FL_IGN_DIR_* bits or'ed together.
+ */
+u32
+inode_lease_ignore_mask(struct inode *inode)
+{
+       struct file_lock_context *ctx;
+       struct file_lock_core *flc;
+       u32 mask = 0;
+
+       ctx = locks_inode_context(inode);
+       if (!ctx)
+               return 0;
+
+       spin_lock(&ctx->flc_lock);
+       list_for_each_entry(flc, &ctx->flc_lease, flc_list) {
+               mask |= flc->flc_flags & IGNORE_MASK;
+               /* If we already have everything, we can stop */
+               if (mask == IGNORE_MASK)
+                       break;
+       }
+       spin_unlock(&ctx->flc_lock);
+       return mask;
+}
+EXPORT_SYMBOL_GPL(inode_lease_ignore_mask);
+
 static bool
 ignore_dir_deleg_break(struct file_lease *fl, unsigned int flags)
 {
index 9dd4e67a6f308710fbc0fe8354218d8285468ef2..6e125902c58a5ddb8835ef8705ede417d05c8ae9 100644 (file)
@@ -236,6 +236,7 @@ int generic_setlease(struct file *, int, struct file_lease **, void **priv);
 int kernel_setlease(struct file *, int, struct file_lease **, void **);
 int vfs_setlease(struct file *, int, struct file_lease **, void **);
 int lease_modify(struct file_lease *, int, struct list_head *);
+u32 inode_lease_ignore_mask(struct inode *inode);
 
 struct notifier_block;
 int lease_register_notifier(struct notifier_block *);