diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2020-03-17 15:04:22 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2020-03-17 15:04:22 +0100 |
commit | f428884456192230ba1573e4028fb9282ffa2bb7 (patch) | |
tree | bf4c8ad98aaecb0ad80dc6d43f6a10ea005d67be /fs/overlayfs/util.c | |
parent | ovl: separate detection of remote upper layer from stacked overlay (diff) | |
download | linux-f428884456192230ba1573e4028fb9282ffa2bb7.tar.xz linux-f428884456192230ba1573e4028fb9282ffa2bb7.zip |
ovl: decide if revalidate needed on a per-dentry basis
Allow completely skipping ->revalidate() on a per-dentry basis, in case the
underlying layers used for a dentry do not themselves have ->revalidate().
E.g. negative overlay dentry has no underlying layers, hence revalidate is
unnecessary. Or if lower layer is remote but overlay dentry is pure-upper,
then can skip revalidate.
The following places need to update whether the dentry needs revalidate or
not:
- fill-super (root dentry)
- lookup
- create
- fh_to_dentry
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs/util.c')
-rw-r--r-- | fs/overlayfs/util.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 997c31509c91..1cd805ba1eeb 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -96,6 +96,21 @@ bool ovl_dentry_remote(struct dentry *dentry) (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE); } +void ovl_dentry_update_reval(struct dentry *dentry, struct dentry *upperdentry, + unsigned int mask) +{ + struct ovl_entry *oe = OVL_E(dentry); + unsigned int i, flags = 0; + + for (i = 0; i < oe->numlower; i++) + flags |= oe->lowerstack[i].dentry->d_flags; + + spin_lock(&dentry->d_lock); + dentry->d_flags &= ~mask; + dentry->d_flags |= flags & mask; + spin_unlock(&dentry->d_lock); +} + bool ovl_dentry_weird(struct dentry *dentry) { return dentry->d_flags & (DCACHE_NEED_AUTOMOUNT | |