]> www.infradead.org Git - users/hch/misc.git/commitdiff
dcache: convert dentry flag macros to enum
authorOmar Sandoval <osandov@fb.com>
Tue, 8 Apr 2025 20:00:53 +0000 (13:00 -0700)
committerChristian Brauner <brauner@kernel.org>
Fri, 11 Apr 2025 13:24:29 +0000 (15:24 +0200)
Commit 9748cb2dc393 ("VFS: repack DENTRY_ flags.") changed the value of
DCACHE_MOUNTED, which broke drgn's path_lookup() helper. drgn is forced
to hard-code it because it's a macro, and macros aren't preserved in
debugging information by default.

Enums, on the other hand, are included in debugging information. Convert
the DCACHE_* flag macros to an enum so that debugging tools like drgn
and bpftrace can make use of them.

Link: https://github.com/osandov/drgn/blob/2027d0fea84d74b835e77392f7040c2a333180c6/drgn/helpers/linux/fs.py#L43-L46
Signed-off-by: Omar Sandoval <osandov@fb.com>
Link: https://lore.kernel.org/177665a082f048cf536b9cd6af467b3be6b6e6ed.1744141838.git.osandov@fb.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
include/linux/dcache.h

index 8d1395f945bfef10014179fd5770c30306ddc83a..e9f07e37dd6faaf308b0009994983e8addf58a3b 100644 (file)
@@ -173,65 +173,59 @@ struct dentry_operations {
  */
 
 /* d_flags entries */
-#define DCACHE_OP_HASH                 BIT(0)
-#define DCACHE_OP_COMPARE              BIT(1)
-#define DCACHE_OP_REVALIDATE           BIT(2)
-#define DCACHE_OP_DELETE               BIT(3)
-#define DCACHE_OP_PRUNE                        BIT(4)
-
-#define        DCACHE_DISCONNECTED             BIT(5)
-     /* This dentry is possibly not currently connected to the dcache tree, in
-      * which case its parent will either be itself, or will have this flag as
-      * well.  nfsd will not use a dentry with this bit set, but will first
-      * endeavour to clear the bit either by discovering that it is connected,
-      * or by performing lookup operations.   Any filesystem which supports
-      * nfsd_operations MUST have a lookup function which, if it finds a
-      * directory inode with a DCACHE_DISCONNECTED dentry, will d_move that
-      * dentry into place and return that dentry rather than the passed one,
-      * typically using d_splice_alias. */
-
-#define DCACHE_REFERENCED              BIT(6) /* Recently used, don't discard. */
-
-#define DCACHE_DONTCACHE               BIT(7) /* Purge from memory on final dput() */
-
-#define DCACHE_CANT_MOUNT              BIT(8)
-#define DCACHE_GENOCIDE                        BIT(9)
-#define DCACHE_SHRINK_LIST             BIT(10)
-
-#define DCACHE_OP_WEAK_REVALIDATE      BIT(11)
-
-#define DCACHE_NFSFS_RENAMED           BIT(12)
-     /* this dentry has been "silly renamed" and has to be deleted on the last
-      * dput() */
-#define DCACHE_FSNOTIFY_PARENT_WATCHED BIT(13)
-     /* Parent inode is watched by some fsnotify listener */
-
-#define DCACHE_DENTRY_KILLED           BIT(14)
-
-#define DCACHE_MOUNTED                 BIT(15) /* is a mountpoint */
-#define DCACHE_NEED_AUTOMOUNT          BIT(16) /* handle automount on this dir */
-#define DCACHE_MANAGE_TRANSIT          BIT(17) /* manage transit from this dirent */
+enum dentry_flags {
+       DCACHE_OP_HASH                  = BIT(0),
+       DCACHE_OP_COMPARE               = BIT(1),
+       DCACHE_OP_REVALIDATE            = BIT(2),
+       DCACHE_OP_DELETE                = BIT(3),
+       DCACHE_OP_PRUNE                 = BIT(4),
+       /*
+        * This dentry is possibly not currently connected to the dcache tree,
+        * in which case its parent will either be itself, or will have this
+        * flag as well.  nfsd will not use a dentry with this bit set, but will
+        * first endeavour to clear the bit either by discovering that it is
+        * connected, or by performing lookup operations.  Any filesystem which
+        * supports nfsd_operations MUST have a lookup function which, if it
+        * finds a directory inode with a DCACHE_DISCONNECTED dentry, will
+        * d_move that dentry into place and return that dentry rather than the
+        * passed one, typically using d_splice_alias.
+        */
+       DCACHE_DISCONNECTED             = BIT(5),
+       DCACHE_REFERENCED               = BIT(6),       /* Recently used, don't discard. */
+       DCACHE_DONTCACHE                = BIT(7),       /* Purge from memory on final dput() */
+       DCACHE_CANT_MOUNT               = BIT(8),
+       DCACHE_GENOCIDE                 = BIT(9),
+       DCACHE_SHRINK_LIST              = BIT(10),
+       DCACHE_OP_WEAK_REVALIDATE       = BIT(11),
+       /*
+        * this dentry has been "silly renamed" and has to be deleted on the
+        * last dput()
+        */
+       DCACHE_NFSFS_RENAMED            = BIT(12),
+       DCACHE_FSNOTIFY_PARENT_WATCHED  = BIT(13),      /* Parent inode is watched by some fsnotify listener */
+       DCACHE_DENTRY_KILLED            = BIT(14),
+       DCACHE_MOUNTED                  = BIT(15),      /* is a mountpoint */
+       DCACHE_NEED_AUTOMOUNT           = BIT(16),      /* handle automount on this dir */
+       DCACHE_MANAGE_TRANSIT           = BIT(17),      /* manage transit from this dirent */
+       DCACHE_LRU_LIST                 = BIT(18),
+       DCACHE_ENTRY_TYPE               = (7 << 19),    /* bits 19..21 are for storing type: */
+       DCACHE_MISS_TYPE                = (0 << 19),    /* Negative dentry */
+       DCACHE_WHITEOUT_TYPE            = (1 << 19),    /* Whiteout dentry (stop pathwalk) */
+       DCACHE_DIRECTORY_TYPE           = (2 << 19),    /* Normal directory */
+       DCACHE_AUTODIR_TYPE             = (3 << 19),    /* Lookupless directory (presumed automount) */
+       DCACHE_REGULAR_TYPE             = (4 << 19),    /* Regular file type */
+       DCACHE_SPECIAL_TYPE             = (5 << 19),    /* Other file type */
+       DCACHE_SYMLINK_TYPE             = (6 << 19),    /* Symlink */
+       DCACHE_NOKEY_NAME               = BIT(22),      /* Encrypted name encoded without key */
+       DCACHE_OP_REAL                  = BIT(23),
+       DCACHE_PAR_LOOKUP               = BIT(24),      /* being looked up (with parent locked shared) */
+       DCACHE_DENTRY_CURSOR            = BIT(25),
+       DCACHE_NORCU                    = BIT(26),      /* No RCU delay for freeing */
+};
+
 #define DCACHE_MANAGED_DENTRY \
        (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT)
 
-#define DCACHE_LRU_LIST                        BIT(18)
-
-#define DCACHE_ENTRY_TYPE              (7 << 19) /* bits 19..21 are for storing type: */
-#define DCACHE_MISS_TYPE               (0 << 19) /* Negative dentry */
-#define DCACHE_WHITEOUT_TYPE           (1 << 19) /* Whiteout dentry (stop pathwalk) */
-#define DCACHE_DIRECTORY_TYPE          (2 << 19) /* Normal directory */
-#define DCACHE_AUTODIR_TYPE            (3 << 19) /* Lookupless directory (presumed automount) */
-#define DCACHE_REGULAR_TYPE            (4 << 19) /* Regular file type */
-#define DCACHE_SPECIAL_TYPE            (5 << 19) /* Other file type */
-#define DCACHE_SYMLINK_TYPE            (6 << 19) /* Symlink */
-
-#define DCACHE_NOKEY_NAME              BIT(22) /* Encrypted name encoded without key */
-#define DCACHE_OP_REAL                 BIT(23)
-
-#define DCACHE_PAR_LOOKUP              BIT(24) /* being looked up (with parent locked shared) */
-#define DCACHE_DENTRY_CURSOR           BIT(25)
-#define DCACHE_NORCU                   BIT(26) /* No RCU delay for freeing */
-
 extern seqlock_t rename_lock;
 
 /*