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