[PATCH] dcache: convert dentry flag macros to enum

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Omar Sandoval <osandov@xxxxxx>

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@xxxxxx>
---
Hi,

This is based on Linus' tree as of today. If possible, it'd be great to
get this in for 6.15.

Here are a couple of examples of similar changes in the past:

	0b108e83795c ("SUNRPC: convert RPC_TASK_* constants to enum")
	ff202303c398 ("mm: convert page type macros to enum")

There's also an alternative approach that is more verbose but allows for
automatic numbering:

	enum dentry_flags {
		__DCACHE_OP_HASH,
		__DCACHE_OP_COMPARE,
		...
	};
	
	#define DCACHE_OP_HASH BIT(__DCACHE_OP_HASH)
	#define DCACHE_OP_COMPARE BIT(__DCACHE_OP_COMPARE)
	...

Let me know if you'd prefer that approach.

Thanks,
Omar

 include/linux/dcache.h | 105 ++++++++++++++++++++---------------------
 1 file changed, 50 insertions(+), 55 deletions(-)

diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index 8d1395f945bf..a945cc86a8f1 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -173,65 +173,60 @@ 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)
+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),
+	/* Parent inode is watched by some fsnotify listener */
+	DCACHE_FSNOTIFY_PARENT_WATCHED = BIT(13),
+	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_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 */
 #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;
 
 /*
-- 
2.49.0





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux