Merge branch 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull more vfs updates from Al Viro: "Assorted stuff from this cycle. The big ones here are multilayer overlayfs from Miklos and beginning of sorting ->d_inode accesses out from David" * 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (51 commits) autofs4 copy_dev_ioctl(): keep the value of ->size we'd used for allocation procfs: fix race between symlink removals and traversals debugfs: leave freeing a symlink body until inode eviction Documentation/filesystems/Locking: ->get_sb() is long gone trylock_super(): replacement for grab_super_passive() fanotify: Fix up scripted S_ISDIR/S_ISREG/S_ISLNK conversions Cachefiles: Fix up scripted S_ISDIR/S_ISREG/S_ISLNK conversions VFS: (Scripted) Convert S_ISLNK/DIR/REG(dentry->d_inode) to d_is_*(dentry) SELinux: Use d_is_positive() rather than testing dentry->d_inode Smack: Use d_is_positive() rather than testing dentry->d_inode TOMOYO: Use d_is_dir() rather than d_inode and S_ISDIR() Apparmor: Use d_is_positive/negative() rather than testing dentry->d_inode Apparmor: mediated_filesystem() should use dentry->d_sb not inode->i_sb VFS: Split DCACHE_FILE_TYPE into regular and special types VFS: Add a fallthrough flag for marking virtual dentries VFS: Add a whiteout dentry type VFS: Introduce inode-getting helpers for layered/unioned fs environments Infiniband: Fix potential NULL d_inode dereference posix_acl: fix reference leaks in posix_acl_create autofs4: Wrong format for printing dentry ...
This commit is contained in:
@@ -215,13 +215,16 @@ struct dentry_operations {
|
||||
#define DCACHE_LRU_LIST 0x00080000
|
||||
|
||||
#define DCACHE_ENTRY_TYPE 0x00700000
|
||||
#define DCACHE_MISS_TYPE 0x00000000 /* Negative dentry */
|
||||
#define DCACHE_DIRECTORY_TYPE 0x00100000 /* Normal directory */
|
||||
#define DCACHE_AUTODIR_TYPE 0x00200000 /* Lookupless directory (presumed automount) */
|
||||
#define DCACHE_SYMLINK_TYPE 0x00300000 /* Symlink */
|
||||
#define DCACHE_FILE_TYPE 0x00400000 /* Other file type */
|
||||
#define DCACHE_MISS_TYPE 0x00000000 /* Negative dentry (maybe fallthru to nowhere) */
|
||||
#define DCACHE_WHITEOUT_TYPE 0x00100000 /* Whiteout dentry (stop pathwalk) */
|
||||
#define DCACHE_DIRECTORY_TYPE 0x00200000 /* Normal directory */
|
||||
#define DCACHE_AUTODIR_TYPE 0x00300000 /* Lookupless directory (presumed automount) */
|
||||
#define DCACHE_REGULAR_TYPE 0x00400000 /* Regular file type (or fallthru to such) */
|
||||
#define DCACHE_SPECIAL_TYPE 0x00500000 /* Other file type (or fallthru to such) */
|
||||
#define DCACHE_SYMLINK_TYPE 0x00600000 /* Symlink (or fallthru to such) */
|
||||
|
||||
#define DCACHE_MAY_FREE 0x00800000
|
||||
#define DCACHE_FALLTHRU 0x01000000 /* Fall through to lower layer */
|
||||
|
||||
extern seqlock_t rename_lock;
|
||||
|
||||
@@ -423,6 +426,16 @@ static inline unsigned __d_entry_type(const struct dentry *dentry)
|
||||
return dentry->d_flags & DCACHE_ENTRY_TYPE;
|
||||
}
|
||||
|
||||
static inline bool d_is_miss(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_MISS_TYPE;
|
||||
}
|
||||
|
||||
static inline bool d_is_whiteout(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_WHITEOUT_TYPE;
|
||||
}
|
||||
|
||||
static inline bool d_can_lookup(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_DIRECTORY_TYPE;
|
||||
@@ -443,14 +456,25 @@ static inline bool d_is_symlink(const struct dentry *dentry)
|
||||
return __d_entry_type(dentry) == DCACHE_SYMLINK_TYPE;
|
||||
}
|
||||
|
||||
static inline bool d_is_reg(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_REGULAR_TYPE;
|
||||
}
|
||||
|
||||
static inline bool d_is_special(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_SPECIAL_TYPE;
|
||||
}
|
||||
|
||||
static inline bool d_is_file(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_FILE_TYPE;
|
||||
return d_is_reg(dentry) || d_is_special(dentry);
|
||||
}
|
||||
|
||||
static inline bool d_is_negative(const struct dentry *dentry)
|
||||
{
|
||||
return __d_entry_type(dentry) == DCACHE_MISS_TYPE;
|
||||
// TODO: check d_is_whiteout(dentry) also.
|
||||
return d_is_miss(dentry);
|
||||
}
|
||||
|
||||
static inline bool d_is_positive(const struct dentry *dentry)
|
||||
@@ -458,10 +482,75 @@ static inline bool d_is_positive(const struct dentry *dentry)
|
||||
return !d_is_negative(dentry);
|
||||
}
|
||||
|
||||
extern void d_set_fallthru(struct dentry *dentry);
|
||||
|
||||
static inline bool d_is_fallthru(const struct dentry *dentry)
|
||||
{
|
||||
return dentry->d_flags & DCACHE_FALLTHRU;
|
||||
}
|
||||
|
||||
|
||||
extern int sysctl_vfs_cache_pressure;
|
||||
|
||||
static inline unsigned long vfs_pressure_ratio(unsigned long val)
|
||||
{
|
||||
return mult_frac(val, sysctl_vfs_cache_pressure, 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* d_inode - Get the actual inode of this dentry
|
||||
* @dentry: The dentry to query
|
||||
*
|
||||
* This is the helper normal filesystems should use to get at their own inodes
|
||||
* in their own dentries and ignore the layering superimposed upon them.
|
||||
*/
|
||||
static inline struct inode *d_inode(const struct dentry *dentry)
|
||||
{
|
||||
return dentry->d_inode;
|
||||
}
|
||||
|
||||
/**
|
||||
* d_inode_rcu - Get the actual inode of this dentry with ACCESS_ONCE()
|
||||
* @dentry: The dentry to query
|
||||
*
|
||||
* This is the helper normal filesystems should use to get at their own inodes
|
||||
* in their own dentries and ignore the layering superimposed upon them.
|
||||
*/
|
||||
static inline struct inode *d_inode_rcu(const struct dentry *dentry)
|
||||
{
|
||||
return ACCESS_ONCE(dentry->d_inode);
|
||||
}
|
||||
|
||||
/**
|
||||
* d_backing_inode - Get upper or lower inode we should be using
|
||||
* @upper: The upper layer
|
||||
*
|
||||
* This is the helper that should be used to get at the inode that will be used
|
||||
* if this dentry were to be opened as a file. The inode may be on the upper
|
||||
* dentry or it may be on a lower dentry pinned by the upper.
|
||||
*
|
||||
* Normal filesystems should not use this to access their own inodes.
|
||||
*/
|
||||
static inline struct inode *d_backing_inode(const struct dentry *upper)
|
||||
{
|
||||
struct inode *inode = upper->d_inode;
|
||||
|
||||
return inode;
|
||||
}
|
||||
|
||||
/**
|
||||
* d_backing_dentry - Get upper or lower dentry we should be using
|
||||
* @upper: The upper layer
|
||||
*
|
||||
* This is the helper that should be used to get the dentry of the inode that
|
||||
* will be used if this dentry were opened as a file. It may be the upper
|
||||
* dentry or it may be a lower dentry pinned by the upper.
|
||||
*
|
||||
* Normal filesystems should not use this to access their own dentries.
|
||||
*/
|
||||
static inline struct dentry *d_backing_dentry(struct dentry *upper)
|
||||
{
|
||||
return upper;
|
||||
}
|
||||
|
||||
#endif /* __LINUX_DCACHE_H */
|
||||
|
Reference in New Issue
Block a user