diff options
Diffstat (limited to 'include/linux/dcache.h')
-rw-r--r-- | include/linux/dcache.h | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index d8358799c594..df334cbacc6d 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -404,26 +404,11 @@ static inline bool d_mountpoint(const struct dentry *dentry) | |||
404 | /* | 404 | /* |
405 | * Directory cache entry type accessor functions. | 405 | * Directory cache entry type accessor functions. |
406 | */ | 406 | */ |
407 | static inline void __d_set_type(struct dentry *dentry, unsigned type) | ||
408 | { | ||
409 | dentry->d_flags = (dentry->d_flags & ~DCACHE_ENTRY_TYPE) | type; | ||
410 | } | ||
411 | |||
412 | static inline void __d_clear_type(struct dentry *dentry) | ||
413 | { | ||
414 | __d_set_type(dentry, DCACHE_MISS_TYPE); | ||
415 | } | ||
416 | |||
417 | static inline void d_set_type(struct dentry *dentry, unsigned type) | ||
418 | { | ||
419 | spin_lock(&dentry->d_lock); | ||
420 | __d_set_type(dentry, type); | ||
421 | spin_unlock(&dentry->d_lock); | ||
422 | } | ||
423 | |||
424 | static inline unsigned __d_entry_type(const struct dentry *dentry) | 407 | static inline unsigned __d_entry_type(const struct dentry *dentry) |
425 | { | 408 | { |
426 | return dentry->d_flags & DCACHE_ENTRY_TYPE; | 409 | unsigned type = READ_ONCE(dentry->d_flags); |
410 | smp_rmb(); | ||
411 | return type & DCACHE_ENTRY_TYPE; | ||
427 | } | 412 | } |
428 | 413 | ||
429 | static inline bool d_is_miss(const struct dentry *dentry) | 414 | static inline bool d_is_miss(const struct dentry *dentry) |
@@ -482,6 +467,44 @@ static inline bool d_is_positive(const struct dentry *dentry) | |||
482 | return !d_is_negative(dentry); | 467 | return !d_is_negative(dentry); |
483 | } | 468 | } |
484 | 469 | ||
470 | /** | ||
471 | * d_really_is_negative - Determine if a dentry is really negative (ignoring fallthroughs) | ||
472 | * @dentry: The dentry in question | ||
473 | * | ||
474 | * Returns true if the dentry represents either an absent name or a name that | ||
475 | * doesn't map to an inode (ie. ->d_inode is NULL). The dentry could represent | ||
476 | * a true miss, a whiteout that isn't represented by a 0,0 chardev or a | ||
477 | * fallthrough marker in an opaque directory. | ||
478 | * | ||
479 | * Note! (1) This should be used *only* by a filesystem to examine its own | ||
480 | * dentries. It should not be used to look at some other filesystem's | ||
481 | * dentries. (2) It should also be used in combination with d_inode() to get | ||
482 | * the inode. (3) The dentry may have something attached to ->d_lower and the | ||
483 | * type field of the flags may be set to something other than miss or whiteout. | ||
484 | */ | ||
485 | static inline bool d_really_is_negative(const struct dentry *dentry) | ||
486 | { | ||
487 | return dentry->d_inode == NULL; | ||
488 | } | ||
489 | |||
490 | /** | ||
491 | * d_really_is_positive - Determine if a dentry is really positive (ignoring fallthroughs) | ||
492 | * @dentry: The dentry in question | ||
493 | * | ||
494 | * Returns true if the dentry represents a name that maps to an inode | ||
495 | * (ie. ->d_inode is not NULL). The dentry might still represent a whiteout if | ||
496 | * that is represented on medium as a 0,0 chardev. | ||
497 | * | ||
498 | * Note! (1) This should be used *only* by a filesystem to examine its own | ||
499 | * dentries. It should not be used to look at some other filesystem's | ||
500 | * dentries. (2) It should also be used in combination with d_inode() to get | ||
501 | * the inode. | ||
502 | */ | ||
503 | static inline bool d_really_is_positive(const struct dentry *dentry) | ||
504 | { | ||
505 | return dentry->d_inode != NULL; | ||
506 | } | ||
507 | |||
485 | extern void d_set_fallthru(struct dentry *dentry); | 508 | extern void d_set_fallthru(struct dentry *dentry); |
486 | 509 | ||
487 | static inline bool d_is_fallthru(const struct dentry *dentry) | 510 | static inline bool d_is_fallthru(const struct dentry *dentry) |