1#ifndef __LINUX_DCACHE_H
2#define __LINUX_DCACHE_H
3
4#include <linux/atomic.h>
5#include <linux/list.h>
6#include <linux/rculist.h>
7#include <linux/rculist_bl.h>
8#include <linux/spinlock.h>
9#include <linux/seqlock.h>
10#include <linux/cache.h>
11#include <linux/rcupdate.h>
12#include <linux/lockref.h>
13
14struct path;
15struct vfsmount;
16
17
18
19
20
21
22
23
24
25
26#define IS_ROOT(x) ((x) == (x)->d_parent)
27
28
29#ifdef __LITTLE_ENDIAN
30 #define HASH_LEN_DECLARE u32 hash; u32 len;
31 #define bytemask_from_count(cnt) (~(~0ul << (cnt)*8))
32#else
33 #define HASH_LEN_DECLARE u32 len; u32 hash;
34 #define bytemask_from_count(cnt) (~(~0ul >> (cnt)*8))
35#endif
36
37
38
39
40
41
42
43
44struct qstr {
45 union {
46 struct {
47 HASH_LEN_DECLARE;
48 };
49 u64 hash_len;
50 };
51 const unsigned char *name;
52};
53
54#define QSTR_INIT(n,l) { { { .len = l } }, .name = n }
55#define hashlen_hash(hashlen) ((u32) (hashlen))
56#define hashlen_len(hashlen) ((u32)((hashlen) >> 32))
57#define hashlen_create(hash,len) (((u64)(len)<<32)|(u32)(hash))
58
59struct dentry_stat_t {
60 long nr_dentry;
61 long nr_unused;
62 long age_limit;
63 long want_pages;
64 long dummy[2];
65};
66extern struct dentry_stat_t dentry_stat;
67
68
69
70#define init_name_hash() 0
71
72
73static inline unsigned long
74partial_name_hash(unsigned long c, unsigned long prevhash)
75{
76 return (prevhash + (c << 4) + (c >> 4)) * 11;
77}
78
79
80
81
82
83static inline unsigned long end_name_hash(unsigned long hash)
84{
85 return (unsigned int) hash;
86}
87
88
89extern unsigned int full_name_hash(const unsigned char *, unsigned int);
90
91
92
93
94
95
96#ifdef CONFIG_64BIT
97# define DNAME_INLINE_LEN 32
98#else
99# ifdef CONFIG_SMP
100# define DNAME_INLINE_LEN 36
101# else
102# define DNAME_INLINE_LEN 40
103# endif
104#endif
105
106#define d_lock d_lockref.lock
107
108struct dentry {
109
110 unsigned int d_flags;
111 seqcount_t d_seq;
112 struct hlist_bl_node d_hash;
113 struct dentry *d_parent;
114 struct qstr d_name;
115 struct inode *d_inode;
116
117 unsigned char d_iname[DNAME_INLINE_LEN];
118
119
120 struct lockref d_lockref;
121 const struct dentry_operations *d_op;
122 struct super_block *d_sb;
123 unsigned long d_time;
124 void *d_fsdata;
125
126 struct list_head d_lru;
127 struct list_head d_child;
128 struct list_head d_subdirs;
129
130
131
132 union {
133 struct hlist_node d_alias;
134 struct rcu_head d_rcu;
135 } d_u;
136};
137
138
139
140
141
142
143
144enum dentry_d_lock_class
145{
146 DENTRY_D_LOCK_NORMAL,
147 DENTRY_D_LOCK_NESTED
148};
149
150struct dentry_operations {
151 int (*d_revalidate)(struct dentry *, unsigned int);
152 int (*d_weak_revalidate)(struct dentry *, unsigned int);
153 int (*d_hash)(const struct dentry *, struct qstr *);
154 int (*d_compare)(const struct dentry *, const struct dentry *,
155 unsigned int, const char *, const struct qstr *);
156 int (*d_delete)(const struct dentry *);
157 void (*d_release)(struct dentry *);
158 void (*d_prune)(struct dentry *);
159 void (*d_iput)(struct dentry *, struct inode *);
160 char *(*d_dname)(struct dentry *, char *, int);
161 struct vfsmount *(*d_automount)(struct path *);
162 int (*d_manage)(struct dentry *, bool);
163 struct inode *(*d_select_inode)(struct dentry *, unsigned);
164} ____cacheline_aligned;
165
166
167
168
169
170
171
172
173
174
175#define DCACHE_OP_HASH 0x00000001
176#define DCACHE_OP_COMPARE 0x00000002
177#define DCACHE_OP_REVALIDATE 0x00000004
178#define DCACHE_OP_DELETE 0x00000008
179#define DCACHE_OP_PRUNE 0x00000010
180
181#define DCACHE_DISCONNECTED 0x00000020
182
183
184
185
186
187
188
189
190
191
192#define DCACHE_REFERENCED 0x00000040
193#define DCACHE_RCUACCESS 0x00000080
194
195#define DCACHE_CANT_MOUNT 0x00000100
196#define DCACHE_GENOCIDE 0x00000200
197#define DCACHE_SHRINK_LIST 0x00000400
198
199#define DCACHE_OP_WEAK_REVALIDATE 0x00000800
200
201#define DCACHE_NFSFS_RENAMED 0x00001000
202
203
204#define DCACHE_COOKIE 0x00002000
205#define DCACHE_FSNOTIFY_PARENT_WATCHED 0x00004000
206
207
208#define DCACHE_DENTRY_KILLED 0x00008000
209
210#define DCACHE_MOUNTED 0x00010000
211#define DCACHE_NEED_AUTOMOUNT 0x00020000
212#define DCACHE_MANAGE_TRANSIT 0x00040000
213#define DCACHE_MANAGED_DENTRY \
214 (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT)
215
216#define DCACHE_LRU_LIST 0x00080000
217
218#define DCACHE_ENTRY_TYPE 0x00700000
219#define DCACHE_MISS_TYPE 0x00000000
220#define DCACHE_WHITEOUT_TYPE 0x00100000
221#define DCACHE_DIRECTORY_TYPE 0x00200000
222#define DCACHE_AUTODIR_TYPE 0x00300000
223#define DCACHE_REGULAR_TYPE 0x00400000
224#define DCACHE_SPECIAL_TYPE 0x00500000
225#define DCACHE_SYMLINK_TYPE 0x00600000
226
227#define DCACHE_MAY_FREE 0x00800000
228#define DCACHE_FALLTHRU 0x01000000
229#define DCACHE_OP_SELECT_INODE 0x02000000
230
231extern seqlock_t rename_lock;
232
233
234
235
236extern void d_instantiate(struct dentry *, struct inode *);
237extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
238extern int d_instantiate_no_diralias(struct dentry *, struct inode *);
239extern void __d_drop(struct dentry *dentry);
240extern void d_drop(struct dentry *dentry);
241extern void d_delete(struct dentry *);
242extern void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op);
243
244
245extern struct dentry * d_alloc(struct dentry *, const struct qstr *);
246extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
247extern struct dentry * d_splice_alias(struct inode *, struct dentry *);
248extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *);
249extern struct dentry *d_find_any_alias(struct inode *inode);
250extern struct dentry * d_obtain_alias(struct inode *);
251extern struct dentry * d_obtain_root(struct inode *);
252extern void shrink_dcache_sb(struct super_block *);
253extern void shrink_dcache_parent(struct dentry *);
254extern void shrink_dcache_for_umount(struct super_block *);
255extern void d_invalidate(struct dentry *);
256
257
258extern struct dentry * d_make_root(struct inode *);
259
260
261extern void d_genocide(struct dentry *);
262
263extern void d_tmpfile(struct dentry *, struct inode *);
264
265extern struct dentry *d_find_alias(struct inode *);
266extern void d_prune_aliases(struct inode *);
267
268
269extern int have_submounts(struct dentry *);
270
271
272
273
274extern void d_rehash(struct dentry *);
275
276
277
278
279
280
281
282
283
284
285static inline void d_add(struct dentry *entry, struct inode *inode)
286{
287 d_instantiate(entry, inode);
288 d_rehash(entry);
289}
290
291
292
293
294
295
296
297
298
299static inline struct dentry *d_add_unique(struct dentry *entry, struct inode *inode)
300{
301 struct dentry *res;
302
303 res = d_instantiate_unique(entry, inode);
304 d_rehash(res != NULL ? res : entry);
305 return res;
306}
307
308extern void dentry_update_name_case(struct dentry *, struct qstr *);
309
310
311extern void d_move(struct dentry *, struct dentry *);
312extern void d_exchange(struct dentry *, struct dentry *);
313extern struct dentry *d_ancestor(struct dentry *, struct dentry *);
314
315
316extern struct dentry *d_lookup(const struct dentry *, const struct qstr *);
317extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *);
318extern struct dentry *__d_lookup(const struct dentry *, const struct qstr *);
319extern struct dentry *__d_lookup_rcu(const struct dentry *parent,
320 const struct qstr *name, unsigned *seq);
321
322static inline unsigned d_count(const struct dentry *dentry)
323{
324 return dentry->d_lockref.count;
325}
326
327
328
329
330extern __printf(4, 5)
331char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
332extern char *simple_dname(struct dentry *, char *, int);
333
334extern char *__d_path(const struct path *, const struct path *, char *, int);
335extern char *d_absolute_path(const struct path *, char *, int);
336extern char *d_path(const struct path *, char *, int);
337extern char *dentry_path_raw(struct dentry *, char *, int);
338extern char *dentry_path(struct dentry *, char *, int);
339
340
341
342
343
344
345
346
347
348
349
350static inline struct dentry *dget_dlock(struct dentry *dentry)
351{
352 if (dentry)
353 dentry->d_lockref.count++;
354 return dentry;
355}
356
357static inline struct dentry *dget(struct dentry *dentry)
358{
359 if (dentry)
360 lockref_get(&dentry->d_lockref);
361 return dentry;
362}
363
364extern struct dentry *dget_parent(struct dentry *dentry);
365
366
367
368
369
370
371
372
373static inline int d_unhashed(const struct dentry *dentry)
374{
375 return hlist_bl_unhashed(&dentry->d_hash);
376}
377
378static inline int d_unlinked(const struct dentry *dentry)
379{
380 return d_unhashed(dentry) && !IS_ROOT(dentry);
381}
382
383static inline int cant_mount(const struct dentry *dentry)
384{
385 return (dentry->d_flags & DCACHE_CANT_MOUNT);
386}
387
388static inline void dont_mount(struct dentry *dentry)
389{
390 spin_lock(&dentry->d_lock);
391 dentry->d_flags |= DCACHE_CANT_MOUNT;
392 spin_unlock(&dentry->d_lock);
393}
394
395extern void dput(struct dentry *);
396
397static inline bool d_managed(const struct dentry *dentry)
398{
399 return dentry->d_flags & DCACHE_MANAGED_DENTRY;
400}
401
402static inline bool d_mountpoint(const struct dentry *dentry)
403{
404 return dentry->d_flags & DCACHE_MOUNTED;
405}
406
407
408
409
410static inline unsigned __d_entry_type(const struct dentry *dentry)
411{
412 unsigned type = READ_ONCE(dentry->d_flags);
413 smp_rmb();
414 return type & DCACHE_ENTRY_TYPE;
415}
416
417static inline bool d_is_miss(const struct dentry *dentry)
418{
419 return __d_entry_type(dentry) == DCACHE_MISS_TYPE;
420}
421
422static inline bool d_is_whiteout(const struct dentry *dentry)
423{
424 return __d_entry_type(dentry) == DCACHE_WHITEOUT_TYPE;
425}
426
427static inline bool d_can_lookup(const struct dentry *dentry)
428{
429 return __d_entry_type(dentry) == DCACHE_DIRECTORY_TYPE;
430}
431
432static inline bool d_is_autodir(const struct dentry *dentry)
433{
434 return __d_entry_type(dentry) == DCACHE_AUTODIR_TYPE;
435}
436
437static inline bool d_is_dir(const struct dentry *dentry)
438{
439 return d_can_lookup(dentry) || d_is_autodir(dentry);
440}
441
442static inline bool d_is_symlink(const struct dentry *dentry)
443{
444 return __d_entry_type(dentry) == DCACHE_SYMLINK_TYPE;
445}
446
447static inline bool d_is_reg(const struct dentry *dentry)
448{
449 return __d_entry_type(dentry) == DCACHE_REGULAR_TYPE;
450}
451
452static inline bool d_is_special(const struct dentry *dentry)
453{
454 return __d_entry_type(dentry) == DCACHE_SPECIAL_TYPE;
455}
456
457static inline bool d_is_file(const struct dentry *dentry)
458{
459 return d_is_reg(dentry) || d_is_special(dentry);
460}
461
462static inline bool d_is_negative(const struct dentry *dentry)
463{
464
465 return d_is_miss(dentry);
466}
467
468static inline bool d_is_positive(const struct dentry *dentry)
469{
470 return !d_is_negative(dentry);
471}
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488static inline bool d_really_is_negative(const struct dentry *dentry)
489{
490 return dentry->d_inode == NULL;
491}
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506static inline bool d_really_is_positive(const struct dentry *dentry)
507{
508 return dentry->d_inode != NULL;
509}
510
511static inline int simple_positive(struct dentry *dentry)
512{
513 return d_really_is_positive(dentry) && !d_unhashed(dentry);
514}
515
516extern void d_set_fallthru(struct dentry *dentry);
517
518static inline bool d_is_fallthru(const struct dentry *dentry)
519{
520 return dentry->d_flags & DCACHE_FALLTHRU;
521}
522
523
524extern int sysctl_vfs_cache_pressure;
525
526static inline unsigned long vfs_pressure_ratio(unsigned long val)
527{
528 return mult_frac(val, sysctl_vfs_cache_pressure, 100);
529}
530
531
532
533
534
535
536
537
538static inline struct inode *d_inode(const struct dentry *dentry)
539{
540 return dentry->d_inode;
541}
542
543
544
545
546
547
548
549
550static inline struct inode *d_inode_rcu(const struct dentry *dentry)
551{
552 return ACCESS_ONCE(dentry->d_inode);
553}
554
555
556
557
558
559
560
561
562
563
564
565static inline struct inode *d_backing_inode(const struct dentry *upper)
566{
567 struct inode *inode = upper->d_inode;
568
569 return inode;
570}
571
572
573
574
575
576
577
578
579
580
581
582static inline struct dentry *d_backing_dentry(struct dentry *upper)
583{
584 return upper;
585}
586
587#endif
588