1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __LINUX_DCACHE_H
3*4882a593Smuzhiyun #define __LINUX_DCACHE_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/atomic.h>
6*4882a593Smuzhiyun #include <linux/list.h>
7*4882a593Smuzhiyun #include <linux/rculist.h>
8*4882a593Smuzhiyun #include <linux/rculist_bl.h>
9*4882a593Smuzhiyun #include <linux/spinlock.h>
10*4882a593Smuzhiyun #include <linux/seqlock.h>
11*4882a593Smuzhiyun #include <linux/cache.h>
12*4882a593Smuzhiyun #include <linux/rcupdate.h>
13*4882a593Smuzhiyun #include <linux/lockref.h>
14*4882a593Smuzhiyun #include <linux/stringhash.h>
15*4882a593Smuzhiyun #include <linux/wait.h>
16*4882a593Smuzhiyun #include <linux/android_kabi.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun struct path;
19*4882a593Smuzhiyun struct vfsmount;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun * linux/include/linux/dcache.h
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * Dirent cache data structures
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * (C) Copyright 1997 Thomas Schoebel-Theuer,
27*4882a593Smuzhiyun * with heavy changes by Linus Torvalds
28*4882a593Smuzhiyun */
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define IS_ROOT(x) ((x) == (x)->d_parent)
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* The hash is always the low bits of hash_len */
33*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
34*4882a593Smuzhiyun #define HASH_LEN_DECLARE u32 hash; u32 len
35*4882a593Smuzhiyun #define bytemask_from_count(cnt) (~(~0ul << (cnt)*8))
36*4882a593Smuzhiyun #else
37*4882a593Smuzhiyun #define HASH_LEN_DECLARE u32 len; u32 hash
38*4882a593Smuzhiyun #define bytemask_from_count(cnt) (~(~0ul >> (cnt)*8))
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun /*
42*4882a593Smuzhiyun * "quick string" -- eases parameter passing, but more importantly
43*4882a593Smuzhiyun * saves "metadata" about the string (ie length and the hash).
44*4882a593Smuzhiyun *
45*4882a593Smuzhiyun * hash comes first so it snuggles against d_parent in the
46*4882a593Smuzhiyun * dentry.
47*4882a593Smuzhiyun */
48*4882a593Smuzhiyun struct qstr {
49*4882a593Smuzhiyun union {
50*4882a593Smuzhiyun struct {
51*4882a593Smuzhiyun HASH_LEN_DECLARE;
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun u64 hash_len;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun const unsigned char *name;
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun #define QSTR_INIT(n,l) { { { .len = l } }, .name = n }
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun extern const struct qstr empty_name;
61*4882a593Smuzhiyun extern const struct qstr slash_name;
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun struct dentry_stat_t {
64*4882a593Smuzhiyun long nr_dentry;
65*4882a593Smuzhiyun long nr_unused;
66*4882a593Smuzhiyun long age_limit; /* age in seconds */
67*4882a593Smuzhiyun long want_pages; /* pages requested by system */
68*4882a593Smuzhiyun long nr_negative; /* # of unused negative dentries */
69*4882a593Smuzhiyun long dummy; /* Reserved for future use */
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun extern struct dentry_stat_t dentry_stat;
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun /*
74*4882a593Smuzhiyun * Try to keep struct dentry aligned on 64 byte cachelines (this will
75*4882a593Smuzhiyun * give reasonable cacheline footprint with larger lines without the
76*4882a593Smuzhiyun * large memory footprint increase).
77*4882a593Smuzhiyun */
78*4882a593Smuzhiyun #ifdef CONFIG_64BIT
79*4882a593Smuzhiyun # define DNAME_INLINE_LEN 32 /* 192 bytes */
80*4882a593Smuzhiyun #else
81*4882a593Smuzhiyun # ifdef CONFIG_SMP
82*4882a593Smuzhiyun # define DNAME_INLINE_LEN 36 /* 128 bytes */
83*4882a593Smuzhiyun # else
84*4882a593Smuzhiyun # define DNAME_INLINE_LEN 40 /* 128 bytes */
85*4882a593Smuzhiyun # endif
86*4882a593Smuzhiyun #endif
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #define d_lock d_lockref.lock
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun struct dentry {
91*4882a593Smuzhiyun /* RCU lookup touched fields */
92*4882a593Smuzhiyun unsigned int d_flags; /* protected by d_lock */
93*4882a593Smuzhiyun seqcount_spinlock_t d_seq; /* per dentry seqlock */
94*4882a593Smuzhiyun struct hlist_bl_node d_hash; /* lookup hash list */
95*4882a593Smuzhiyun struct dentry *d_parent; /* parent directory */
96*4882a593Smuzhiyun struct qstr d_name;
97*4882a593Smuzhiyun struct inode *d_inode; /* Where the name belongs to - NULL is
98*4882a593Smuzhiyun * negative */
99*4882a593Smuzhiyun unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /* Ref lookup also touches following */
102*4882a593Smuzhiyun struct lockref d_lockref; /* per-dentry lock and refcount */
103*4882a593Smuzhiyun const struct dentry_operations *d_op;
104*4882a593Smuzhiyun struct super_block *d_sb; /* The root of the dentry tree */
105*4882a593Smuzhiyun unsigned long d_time; /* used by d_revalidate */
106*4882a593Smuzhiyun void *d_fsdata; /* fs-specific data */
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun union {
109*4882a593Smuzhiyun struct list_head d_lru; /* LRU list */
110*4882a593Smuzhiyun wait_queue_head_t *d_wait; /* in-lookup ones only */
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun struct list_head d_child; /* child of parent list */
113*4882a593Smuzhiyun struct list_head d_subdirs; /* our children */
114*4882a593Smuzhiyun /*
115*4882a593Smuzhiyun * d_alias and d_rcu can share memory
116*4882a593Smuzhiyun */
117*4882a593Smuzhiyun union {
118*4882a593Smuzhiyun struct hlist_node d_alias; /* inode alias list */
119*4882a593Smuzhiyun struct hlist_bl_node d_in_lookup_hash; /* only for in-lookup ones */
120*4882a593Smuzhiyun struct rcu_head d_rcu;
121*4882a593Smuzhiyun } d_u;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
124*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
125*4882a593Smuzhiyun } __randomize_layout;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /*
128*4882a593Smuzhiyun * dentry->d_lock spinlock nesting subclasses:
129*4882a593Smuzhiyun *
130*4882a593Smuzhiyun * 0: normal
131*4882a593Smuzhiyun * 1: nested
132*4882a593Smuzhiyun */
133*4882a593Smuzhiyun enum dentry_d_lock_class
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun DENTRY_D_LOCK_NORMAL, /* implicitly used by plain spin_lock() APIs. */
136*4882a593Smuzhiyun DENTRY_D_LOCK_NESTED
137*4882a593Smuzhiyun };
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun struct dentry_operations {
140*4882a593Smuzhiyun int (*d_revalidate)(struct dentry *, unsigned int);
141*4882a593Smuzhiyun int (*d_weak_revalidate)(struct dentry *, unsigned int);
142*4882a593Smuzhiyun int (*d_hash)(const struct dentry *, struct qstr *);
143*4882a593Smuzhiyun int (*d_compare)(const struct dentry *,
144*4882a593Smuzhiyun unsigned int, const char *, const struct qstr *);
145*4882a593Smuzhiyun int (*d_delete)(const struct dentry *);
146*4882a593Smuzhiyun int (*d_init)(struct dentry *);
147*4882a593Smuzhiyun void (*d_release)(struct dentry *);
148*4882a593Smuzhiyun void (*d_prune)(struct dentry *);
149*4882a593Smuzhiyun void (*d_iput)(struct dentry *, struct inode *);
150*4882a593Smuzhiyun char *(*d_dname)(struct dentry *, char *, int);
151*4882a593Smuzhiyun struct vfsmount *(*d_automount)(struct path *);
152*4882a593Smuzhiyun int (*d_manage)(const struct path *, bool);
153*4882a593Smuzhiyun struct dentry *(*d_real)(struct dentry *, const struct inode *);
154*4882a593Smuzhiyun void (*d_canonical_path)(const struct path *, struct path *);
155*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
156*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
157*4882a593Smuzhiyun ANDROID_KABI_RESERVE(3);
158*4882a593Smuzhiyun ANDROID_KABI_RESERVE(4);
159*4882a593Smuzhiyun } ____cacheline_aligned;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun /*
162*4882a593Smuzhiyun * Locking rules for dentry_operations callbacks are to be found in
163*4882a593Smuzhiyun * Documentation/filesystems/locking.rst. Keep it updated!
164*4882a593Smuzhiyun *
165*4882a593Smuzhiyun * FUrther descriptions are found in Documentation/filesystems/vfs.rst.
166*4882a593Smuzhiyun * Keep it updated too!
167*4882a593Smuzhiyun */
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun /* d_flags entries */
170*4882a593Smuzhiyun #define DCACHE_OP_HASH 0x00000001
171*4882a593Smuzhiyun #define DCACHE_OP_COMPARE 0x00000002
172*4882a593Smuzhiyun #define DCACHE_OP_REVALIDATE 0x00000004
173*4882a593Smuzhiyun #define DCACHE_OP_DELETE 0x00000008
174*4882a593Smuzhiyun #define DCACHE_OP_PRUNE 0x00000010
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun #define DCACHE_DISCONNECTED 0x00000020
177*4882a593Smuzhiyun /* This dentry is possibly not currently connected to the dcache tree, in
178*4882a593Smuzhiyun * which case its parent will either be itself, or will have this flag as
179*4882a593Smuzhiyun * well. nfsd will not use a dentry with this bit set, but will first
180*4882a593Smuzhiyun * endeavour to clear the bit either by discovering that it is connected,
181*4882a593Smuzhiyun * or by performing lookup operations. Any filesystem which supports
182*4882a593Smuzhiyun * nfsd_operations MUST have a lookup function which, if it finds a
183*4882a593Smuzhiyun * directory inode with a DCACHE_DISCONNECTED dentry, will d_move that
184*4882a593Smuzhiyun * dentry into place and return that dentry rather than the passed one,
185*4882a593Smuzhiyun * typically using d_splice_alias. */
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun #define DCACHE_REFERENCED 0x00000040 /* Recently used, don't discard. */
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun #define DCACHE_DONTCACHE 0x00000080 /* Purge from memory on final dput() */
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun #define DCACHE_CANT_MOUNT 0x00000100
192*4882a593Smuzhiyun #define DCACHE_GENOCIDE 0x00000200
193*4882a593Smuzhiyun #define DCACHE_SHRINK_LIST 0x00000400
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun #define DCACHE_OP_WEAK_REVALIDATE 0x00000800
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun #define DCACHE_NFSFS_RENAMED 0x00001000
198*4882a593Smuzhiyun /* this dentry has been "silly renamed" and has to be deleted on the last
199*4882a593Smuzhiyun * dput() */
200*4882a593Smuzhiyun #define DCACHE_COOKIE 0x00002000 /* For use by dcookie subsystem */
201*4882a593Smuzhiyun #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x00004000
202*4882a593Smuzhiyun /* Parent inode is watched by some fsnotify listener */
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun #define DCACHE_DENTRY_KILLED 0x00008000
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun #define DCACHE_MOUNTED 0x00010000 /* is a mountpoint */
207*4882a593Smuzhiyun #define DCACHE_NEED_AUTOMOUNT 0x00020000 /* handle automount on this dir */
208*4882a593Smuzhiyun #define DCACHE_MANAGE_TRANSIT 0x00040000 /* manage transit from this dirent */
209*4882a593Smuzhiyun #define DCACHE_MANAGED_DENTRY \
210*4882a593Smuzhiyun (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT)
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun #define DCACHE_LRU_LIST 0x00080000
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun #define DCACHE_ENTRY_TYPE 0x00700000
215*4882a593Smuzhiyun #define DCACHE_MISS_TYPE 0x00000000 /* Negative dentry (maybe fallthru to nowhere) */
216*4882a593Smuzhiyun #define DCACHE_WHITEOUT_TYPE 0x00100000 /* Whiteout dentry (stop pathwalk) */
217*4882a593Smuzhiyun #define DCACHE_DIRECTORY_TYPE 0x00200000 /* Normal directory */
218*4882a593Smuzhiyun #define DCACHE_AUTODIR_TYPE 0x00300000 /* Lookupless directory (presumed automount) */
219*4882a593Smuzhiyun #define DCACHE_REGULAR_TYPE 0x00400000 /* Regular file type (or fallthru to such) */
220*4882a593Smuzhiyun #define DCACHE_SPECIAL_TYPE 0x00500000 /* Other file type (or fallthru to such) */
221*4882a593Smuzhiyun #define DCACHE_SYMLINK_TYPE 0x00600000 /* Symlink (or fallthru to such) */
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun #define DCACHE_MAY_FREE 0x00800000
224*4882a593Smuzhiyun #define DCACHE_FALLTHRU 0x01000000 /* Fall through to lower layer */
225*4882a593Smuzhiyun #define DCACHE_NOKEY_NAME 0x02000000 /* Encrypted name encoded without key */
226*4882a593Smuzhiyun #define DCACHE_OP_REAL 0x04000000
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun #define DCACHE_PAR_LOOKUP 0x10000000 /* being looked up (with parent locked shared) */
229*4882a593Smuzhiyun #define DCACHE_DENTRY_CURSOR 0x20000000
230*4882a593Smuzhiyun #define DCACHE_NORCU 0x40000000 /* No RCU delay for freeing */
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun extern seqlock_t rename_lock;
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun /*
235*4882a593Smuzhiyun * These are the low-level FS interfaces to the dcache..
236*4882a593Smuzhiyun */
237*4882a593Smuzhiyun extern void d_instantiate(struct dentry *, struct inode *);
238*4882a593Smuzhiyun extern void d_instantiate_new(struct dentry *, struct inode *);
239*4882a593Smuzhiyun extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
240*4882a593Smuzhiyun extern struct dentry * d_instantiate_anon(struct dentry *, struct inode *);
241*4882a593Smuzhiyun extern void __d_drop(struct dentry *dentry);
242*4882a593Smuzhiyun extern void d_drop(struct dentry *dentry);
243*4882a593Smuzhiyun extern void d_delete(struct dentry *);
244*4882a593Smuzhiyun extern void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun /* allocate/de-allocate */
247*4882a593Smuzhiyun extern struct dentry * d_alloc(struct dentry *, const struct qstr *);
248*4882a593Smuzhiyun extern struct dentry * d_alloc_anon(struct super_block *);
249*4882a593Smuzhiyun extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *,
250*4882a593Smuzhiyun wait_queue_head_t *);
251*4882a593Smuzhiyun extern struct dentry * d_splice_alias(struct inode *, struct dentry *);
252*4882a593Smuzhiyun extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *);
253*4882a593Smuzhiyun extern struct dentry * d_exact_alias(struct dentry *, struct inode *);
254*4882a593Smuzhiyun extern struct dentry *d_find_any_alias(struct inode *inode);
255*4882a593Smuzhiyun extern struct dentry * d_obtain_alias(struct inode *);
256*4882a593Smuzhiyun extern struct dentry * d_obtain_root(struct inode *);
257*4882a593Smuzhiyun extern void shrink_dcache_sb(struct super_block *);
258*4882a593Smuzhiyun extern void shrink_dcache_parent(struct dentry *);
259*4882a593Smuzhiyun extern void shrink_dcache_for_umount(struct super_block *);
260*4882a593Smuzhiyun extern void d_invalidate(struct dentry *);
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun /* only used at mount-time */
263*4882a593Smuzhiyun extern struct dentry * d_make_root(struct inode *);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun /* <clickety>-<click> the ramfs-type tree */
266*4882a593Smuzhiyun extern void d_genocide(struct dentry *);
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun extern void d_tmpfile(struct dentry *, struct inode *);
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun extern struct dentry *d_find_alias(struct inode *);
271*4882a593Smuzhiyun extern void d_prune_aliases(struct inode *);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun /* test whether we have any submounts in a subdir tree */
274*4882a593Smuzhiyun extern int path_has_submounts(const struct path *);
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun /*
277*4882a593Smuzhiyun * This adds the entry to the hash queues.
278*4882a593Smuzhiyun */
279*4882a593Smuzhiyun extern void d_rehash(struct dentry *);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun extern void d_add(struct dentry *, struct inode *);
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun /* used for rename() and baskets */
284*4882a593Smuzhiyun extern void d_move(struct dentry *, struct dentry *);
285*4882a593Smuzhiyun extern void d_exchange(struct dentry *, struct dentry *);
286*4882a593Smuzhiyun extern struct dentry *d_ancestor(struct dentry *, struct dentry *);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun /* appendix may either be NULL or be used for transname suffixes */
289*4882a593Smuzhiyun extern struct dentry *d_lookup(const struct dentry *, const struct qstr *);
290*4882a593Smuzhiyun extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *);
291*4882a593Smuzhiyun extern struct dentry *__d_lookup(const struct dentry *, const struct qstr *);
292*4882a593Smuzhiyun extern struct dentry *__d_lookup_rcu(const struct dentry *parent,
293*4882a593Smuzhiyun const struct qstr *name, unsigned *seq);
294*4882a593Smuzhiyun
d_count(const struct dentry * dentry)295*4882a593Smuzhiyun static inline unsigned d_count(const struct dentry *dentry)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun return dentry->d_lockref.count;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun /*
301*4882a593Smuzhiyun * helper function for dentry_operations.d_dname() members
302*4882a593Smuzhiyun */
303*4882a593Smuzhiyun extern __printf(4, 5)
304*4882a593Smuzhiyun char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun extern char *__d_path(const struct path *, const struct path *, char *, int);
307*4882a593Smuzhiyun extern char *d_absolute_path(const struct path *, char *, int);
308*4882a593Smuzhiyun extern char *d_path(const struct path *, char *, int);
309*4882a593Smuzhiyun extern char *dentry_path_raw(struct dentry *, char *, int);
310*4882a593Smuzhiyun extern char *dentry_path(struct dentry *, char *, int);
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /* Allocation counts.. */
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun /**
315*4882a593Smuzhiyun * dget, dget_dlock - get a reference to a dentry
316*4882a593Smuzhiyun * @dentry: dentry to get a reference to
317*4882a593Smuzhiyun *
318*4882a593Smuzhiyun * Given a dentry or %NULL pointer increment the reference count
319*4882a593Smuzhiyun * if appropriate and return the dentry. A dentry will not be
320*4882a593Smuzhiyun * destroyed when it has references.
321*4882a593Smuzhiyun */
dget_dlock(struct dentry * dentry)322*4882a593Smuzhiyun static inline struct dentry *dget_dlock(struct dentry *dentry)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun if (dentry)
325*4882a593Smuzhiyun dentry->d_lockref.count++;
326*4882a593Smuzhiyun return dentry;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
dget(struct dentry * dentry)329*4882a593Smuzhiyun static inline struct dentry *dget(struct dentry *dentry)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun if (dentry)
332*4882a593Smuzhiyun lockref_get(&dentry->d_lockref);
333*4882a593Smuzhiyun return dentry;
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun extern struct dentry *dget_parent(struct dentry *dentry);
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun /**
339*4882a593Smuzhiyun * d_unhashed - is dentry hashed
340*4882a593Smuzhiyun * @dentry: entry to check
341*4882a593Smuzhiyun *
342*4882a593Smuzhiyun * Returns true if the dentry passed is not currently hashed.
343*4882a593Smuzhiyun */
344*4882a593Smuzhiyun
d_unhashed(const struct dentry * dentry)345*4882a593Smuzhiyun static inline int d_unhashed(const struct dentry *dentry)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun return hlist_bl_unhashed(&dentry->d_hash);
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
d_unlinked(const struct dentry * dentry)350*4882a593Smuzhiyun static inline int d_unlinked(const struct dentry *dentry)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun return d_unhashed(dentry) && !IS_ROOT(dentry);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
cant_mount(const struct dentry * dentry)355*4882a593Smuzhiyun static inline int cant_mount(const struct dentry *dentry)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun return (dentry->d_flags & DCACHE_CANT_MOUNT);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun
dont_mount(struct dentry * dentry)360*4882a593Smuzhiyun static inline void dont_mount(struct dentry *dentry)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun spin_lock(&dentry->d_lock);
363*4882a593Smuzhiyun dentry->d_flags |= DCACHE_CANT_MOUNT;
364*4882a593Smuzhiyun spin_unlock(&dentry->d_lock);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun extern void __d_lookup_done(struct dentry *);
368*4882a593Smuzhiyun
d_in_lookup(const struct dentry * dentry)369*4882a593Smuzhiyun static inline int d_in_lookup(const struct dentry *dentry)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun return dentry->d_flags & DCACHE_PAR_LOOKUP;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun
d_lookup_done(struct dentry * dentry)374*4882a593Smuzhiyun static inline void d_lookup_done(struct dentry *dentry)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun if (unlikely(d_in_lookup(dentry))) {
377*4882a593Smuzhiyun spin_lock(&dentry->d_lock);
378*4882a593Smuzhiyun __d_lookup_done(dentry);
379*4882a593Smuzhiyun spin_unlock(&dentry->d_lock);
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun extern void dput(struct dentry *);
384*4882a593Smuzhiyun
d_managed(const struct dentry * dentry)385*4882a593Smuzhiyun static inline bool d_managed(const struct dentry *dentry)
386*4882a593Smuzhiyun {
387*4882a593Smuzhiyun return dentry->d_flags & DCACHE_MANAGED_DENTRY;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
d_mountpoint(const struct dentry * dentry)390*4882a593Smuzhiyun static inline bool d_mountpoint(const struct dentry *dentry)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun return dentry->d_flags & DCACHE_MOUNTED;
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun /*
396*4882a593Smuzhiyun * Directory cache entry type accessor functions.
397*4882a593Smuzhiyun */
__d_entry_type(const struct dentry * dentry)398*4882a593Smuzhiyun static inline unsigned __d_entry_type(const struct dentry *dentry)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun return dentry->d_flags & DCACHE_ENTRY_TYPE;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun
d_is_miss(const struct dentry * dentry)403*4882a593Smuzhiyun static inline bool d_is_miss(const struct dentry *dentry)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_MISS_TYPE;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
d_is_whiteout(const struct dentry * dentry)408*4882a593Smuzhiyun static inline bool d_is_whiteout(const struct dentry *dentry)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_WHITEOUT_TYPE;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun
d_can_lookup(const struct dentry * dentry)413*4882a593Smuzhiyun static inline bool d_can_lookup(const struct dentry *dentry)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_DIRECTORY_TYPE;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun
d_is_autodir(const struct dentry * dentry)418*4882a593Smuzhiyun static inline bool d_is_autodir(const struct dentry *dentry)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_AUTODIR_TYPE;
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun
d_is_dir(const struct dentry * dentry)423*4882a593Smuzhiyun static inline bool d_is_dir(const struct dentry *dentry)
424*4882a593Smuzhiyun {
425*4882a593Smuzhiyun return d_can_lookup(dentry) || d_is_autodir(dentry);
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun
d_is_symlink(const struct dentry * dentry)428*4882a593Smuzhiyun static inline bool d_is_symlink(const struct dentry *dentry)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_SYMLINK_TYPE;
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
d_is_reg(const struct dentry * dentry)433*4882a593Smuzhiyun static inline bool d_is_reg(const struct dentry *dentry)
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_REGULAR_TYPE;
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
d_is_special(const struct dentry * dentry)438*4882a593Smuzhiyun static inline bool d_is_special(const struct dentry *dentry)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun return __d_entry_type(dentry) == DCACHE_SPECIAL_TYPE;
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun
d_is_file(const struct dentry * dentry)443*4882a593Smuzhiyun static inline bool d_is_file(const struct dentry *dentry)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun return d_is_reg(dentry) || d_is_special(dentry);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun
d_is_negative(const struct dentry * dentry)448*4882a593Smuzhiyun static inline bool d_is_negative(const struct dentry *dentry)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun // TODO: check d_is_whiteout(dentry) also.
451*4882a593Smuzhiyun return d_is_miss(dentry);
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
d_flags_negative(unsigned flags)454*4882a593Smuzhiyun static inline bool d_flags_negative(unsigned flags)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun return (flags & DCACHE_ENTRY_TYPE) == DCACHE_MISS_TYPE;
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun
d_is_positive(const struct dentry * dentry)459*4882a593Smuzhiyun static inline bool d_is_positive(const struct dentry *dentry)
460*4882a593Smuzhiyun {
461*4882a593Smuzhiyun return !d_is_negative(dentry);
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun /**
465*4882a593Smuzhiyun * d_really_is_negative - Determine if a dentry is really negative (ignoring fallthroughs)
466*4882a593Smuzhiyun * @dentry: The dentry in question
467*4882a593Smuzhiyun *
468*4882a593Smuzhiyun * Returns true if the dentry represents either an absent name or a name that
469*4882a593Smuzhiyun * doesn't map to an inode (ie. ->d_inode is NULL). The dentry could represent
470*4882a593Smuzhiyun * a true miss, a whiteout that isn't represented by a 0,0 chardev or a
471*4882a593Smuzhiyun * fallthrough marker in an opaque directory.
472*4882a593Smuzhiyun *
473*4882a593Smuzhiyun * Note! (1) This should be used *only* by a filesystem to examine its own
474*4882a593Smuzhiyun * dentries. It should not be used to look at some other filesystem's
475*4882a593Smuzhiyun * dentries. (2) It should also be used in combination with d_inode() to get
476*4882a593Smuzhiyun * the inode. (3) The dentry may have something attached to ->d_lower and the
477*4882a593Smuzhiyun * type field of the flags may be set to something other than miss or whiteout.
478*4882a593Smuzhiyun */
d_really_is_negative(const struct dentry * dentry)479*4882a593Smuzhiyun static inline bool d_really_is_negative(const struct dentry *dentry)
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun return dentry->d_inode == NULL;
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun /**
485*4882a593Smuzhiyun * d_really_is_positive - Determine if a dentry is really positive (ignoring fallthroughs)
486*4882a593Smuzhiyun * @dentry: The dentry in question
487*4882a593Smuzhiyun *
488*4882a593Smuzhiyun * Returns true if the dentry represents a name that maps to an inode
489*4882a593Smuzhiyun * (ie. ->d_inode is not NULL). The dentry might still represent a whiteout if
490*4882a593Smuzhiyun * that is represented on medium as a 0,0 chardev.
491*4882a593Smuzhiyun *
492*4882a593Smuzhiyun * Note! (1) This should be used *only* by a filesystem to examine its own
493*4882a593Smuzhiyun * dentries. It should not be used to look at some other filesystem's
494*4882a593Smuzhiyun * dentries. (2) It should also be used in combination with d_inode() to get
495*4882a593Smuzhiyun * the inode.
496*4882a593Smuzhiyun */
d_really_is_positive(const struct dentry * dentry)497*4882a593Smuzhiyun static inline bool d_really_is_positive(const struct dentry *dentry)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun return dentry->d_inode != NULL;
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
simple_positive(const struct dentry * dentry)502*4882a593Smuzhiyun static inline int simple_positive(const struct dentry *dentry)
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun return d_really_is_positive(dentry) && !d_unhashed(dentry);
505*4882a593Smuzhiyun }
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun extern void d_set_fallthru(struct dentry *dentry);
508*4882a593Smuzhiyun
d_is_fallthru(const struct dentry * dentry)509*4882a593Smuzhiyun static inline bool d_is_fallthru(const struct dentry *dentry)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun return dentry->d_flags & DCACHE_FALLTHRU;
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun extern int sysctl_vfs_cache_pressure;
516*4882a593Smuzhiyun
vfs_pressure_ratio(unsigned long val)517*4882a593Smuzhiyun static inline unsigned long vfs_pressure_ratio(unsigned long val)
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun return mult_frac(val, sysctl_vfs_cache_pressure, 100);
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun /**
523*4882a593Smuzhiyun * d_inode - Get the actual inode of this dentry
524*4882a593Smuzhiyun * @dentry: The dentry to query
525*4882a593Smuzhiyun *
526*4882a593Smuzhiyun * This is the helper normal filesystems should use to get at their own inodes
527*4882a593Smuzhiyun * in their own dentries and ignore the layering superimposed upon them.
528*4882a593Smuzhiyun */
d_inode(const struct dentry * dentry)529*4882a593Smuzhiyun static inline struct inode *d_inode(const struct dentry *dentry)
530*4882a593Smuzhiyun {
531*4882a593Smuzhiyun return dentry->d_inode;
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun /**
535*4882a593Smuzhiyun * d_inode_rcu - Get the actual inode of this dentry with READ_ONCE()
536*4882a593Smuzhiyun * @dentry: The dentry to query
537*4882a593Smuzhiyun *
538*4882a593Smuzhiyun * This is the helper normal filesystems should use to get at their own inodes
539*4882a593Smuzhiyun * in their own dentries and ignore the layering superimposed upon them.
540*4882a593Smuzhiyun */
d_inode_rcu(const struct dentry * dentry)541*4882a593Smuzhiyun static inline struct inode *d_inode_rcu(const struct dentry *dentry)
542*4882a593Smuzhiyun {
543*4882a593Smuzhiyun return READ_ONCE(dentry->d_inode);
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun /**
547*4882a593Smuzhiyun * d_backing_inode - Get upper or lower inode we should be using
548*4882a593Smuzhiyun * @upper: The upper layer
549*4882a593Smuzhiyun *
550*4882a593Smuzhiyun * This is the helper that should be used to get at the inode that will be used
551*4882a593Smuzhiyun * if this dentry were to be opened as a file. The inode may be on the upper
552*4882a593Smuzhiyun * dentry or it may be on a lower dentry pinned by the upper.
553*4882a593Smuzhiyun *
554*4882a593Smuzhiyun * Normal filesystems should not use this to access their own inodes.
555*4882a593Smuzhiyun */
d_backing_inode(const struct dentry * upper)556*4882a593Smuzhiyun static inline struct inode *d_backing_inode(const struct dentry *upper)
557*4882a593Smuzhiyun {
558*4882a593Smuzhiyun struct inode *inode = upper->d_inode;
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun return inode;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun /**
564*4882a593Smuzhiyun * d_backing_dentry - Get upper or lower dentry we should be using
565*4882a593Smuzhiyun * @upper: The upper layer
566*4882a593Smuzhiyun *
567*4882a593Smuzhiyun * This is the helper that should be used to get the dentry of the inode that
568*4882a593Smuzhiyun * will be used if this dentry were opened as a file. It may be the upper
569*4882a593Smuzhiyun * dentry or it may be a lower dentry pinned by the upper.
570*4882a593Smuzhiyun *
571*4882a593Smuzhiyun * Normal filesystems should not use this to access their own dentries.
572*4882a593Smuzhiyun */
d_backing_dentry(struct dentry * upper)573*4882a593Smuzhiyun static inline struct dentry *d_backing_dentry(struct dentry *upper)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun return upper;
576*4882a593Smuzhiyun }
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun /**
579*4882a593Smuzhiyun * d_real - Return the real dentry
580*4882a593Smuzhiyun * @dentry: the dentry to query
581*4882a593Smuzhiyun * @inode: inode to select the dentry from multiple layers (can be NULL)
582*4882a593Smuzhiyun *
583*4882a593Smuzhiyun * If dentry is on a union/overlay, then return the underlying, real dentry.
584*4882a593Smuzhiyun * Otherwise return the dentry itself.
585*4882a593Smuzhiyun *
586*4882a593Smuzhiyun * See also: Documentation/filesystems/vfs.rst
587*4882a593Smuzhiyun */
d_real(struct dentry * dentry,const struct inode * inode)588*4882a593Smuzhiyun static inline struct dentry *d_real(struct dentry *dentry,
589*4882a593Smuzhiyun const struct inode *inode)
590*4882a593Smuzhiyun {
591*4882a593Smuzhiyun if (unlikely(dentry->d_flags & DCACHE_OP_REAL))
592*4882a593Smuzhiyun return dentry->d_op->d_real(dentry, inode);
593*4882a593Smuzhiyun else
594*4882a593Smuzhiyun return dentry;
595*4882a593Smuzhiyun }
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun /**
598*4882a593Smuzhiyun * d_real_inode - Return the real inode
599*4882a593Smuzhiyun * @dentry: The dentry to query
600*4882a593Smuzhiyun *
601*4882a593Smuzhiyun * If dentry is on a union/overlay, then return the underlying, real inode.
602*4882a593Smuzhiyun * Otherwise return d_inode().
603*4882a593Smuzhiyun */
d_real_inode(const struct dentry * dentry)604*4882a593Smuzhiyun static inline struct inode *d_real_inode(const struct dentry *dentry)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun /* This usage of d_real() results in const dentry */
607*4882a593Smuzhiyun return d_backing_inode(d_real((struct dentry *) dentry, NULL));
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun struct name_snapshot {
611*4882a593Smuzhiyun struct qstr name;
612*4882a593Smuzhiyun unsigned char inline_name[DNAME_INLINE_LEN];
613*4882a593Smuzhiyun };
614*4882a593Smuzhiyun void take_dentry_name_snapshot(struct name_snapshot *, struct dentry *);
615*4882a593Smuzhiyun void release_dentry_name_snapshot(struct name_snapshot *);
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun #endif /* __LINUX_DCACHE_H */
618