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)  /*   * Directory cache entry type accessor functions.   */ -static inline void __d_set_type(struct dentry *dentry, unsigned type) -{ -	dentry->d_flags = (dentry->d_flags & ~DCACHE_ENTRY_TYPE) | type; -} - -static inline void __d_clear_type(struct dentry *dentry) -{ -	__d_set_type(dentry, DCACHE_MISS_TYPE); -} - -static inline void d_set_type(struct dentry *dentry, unsigned type) -{ -	spin_lock(&dentry->d_lock); -	__d_set_type(dentry, type); -	spin_unlock(&dentry->d_lock); -} -  static inline unsigned __d_entry_type(const struct dentry *dentry)  { -	return dentry->d_flags & DCACHE_ENTRY_TYPE; +	unsigned type = READ_ONCE(dentry->d_flags); +	smp_rmb(); +	return type & DCACHE_ENTRY_TYPE;  }  static inline bool d_is_miss(const struct dentry *dentry) @@ -482,6 +467,44 @@ static inline bool d_is_positive(const struct dentry *dentry)  	return !d_is_negative(dentry);  } +/** + * d_really_is_negative - Determine if a dentry is really negative (ignoring fallthroughs) + * @dentry: The dentry in question + * + * Returns true if the dentry represents either an absent name or a name that + * doesn't map to an inode (ie. ->d_inode is NULL).  The dentry could represent + * a true miss, a whiteout that isn't represented by a 0,0 chardev or a + * fallthrough marker in an opaque directory. + * + * Note!  (1) This should be used *only* by a filesystem to examine its own + * dentries.  It should not be used to look at some other filesystem's + * dentries.  (2) It should also be used in combination with d_inode() to get + * the inode.  (3) The dentry may have something attached to ->d_lower and the + * type field of the flags may be set to something other than miss or whiteout. + */ +static inline bool d_really_is_negative(const struct dentry *dentry) +{ +	return dentry->d_inode == NULL; +} + +/** + * d_really_is_positive - Determine if a dentry is really positive (ignoring fallthroughs) + * @dentry: The dentry in question + * + * Returns true if the dentry represents a name that maps to an inode + * (ie. ->d_inode is not NULL).  The dentry might still represent a whiteout if + * that is represented on medium as a 0,0 chardev. + * + * Note!  (1) This should be used *only* by a filesystem to examine its own + * dentries.  It should not be used to look at some other filesystem's + * dentries.  (2) It should also be used in combination with d_inode() to get + * the inode. + */ +static inline bool d_really_is_positive(const struct dentry *dentry) +{ +	return dentry->d_inode != NULL; +} +  extern void d_set_fallthru(struct dentry *dentry);  static inline bool d_is_fallthru(const struct dentry *dentry)  |