Skip to content

Commit

Permalink
ovl: restructure dentry revalidation
Browse files Browse the repository at this point in the history
Use a common loop for plain and weak revalidation.  This will aid doing
revalidation on upper layer.

This patch doesn't change behavior.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
  • Loading branch information
Miklos Szeredi committed Mar 17, 2020
1 parent c61ca55 commit 3bb7df9
Showing 1 changed file with 26 additions and 25 deletions.
51 changes: 26 additions & 25 deletions fs/overlayfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,47 +113,48 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
return dentry;
}

static int ovl_dentry_revalidate(struct dentry *dentry, unsigned int flags)
static int ovl_revalidate_real(struct dentry *d, unsigned int flags, bool weak)
{
struct ovl_entry *oe = dentry->d_fsdata;
unsigned int i;
int ret = 1;

for (i = 0; i < oe->numlower; i++) {
struct dentry *d = oe->lowerstack[i].dentry;

if (d->d_flags & DCACHE_OP_REVALIDATE) {
ret = d->d_op->d_revalidate(d, flags);
if (ret < 0)
return ret;
if (!ret) {
if (!(flags & LOOKUP_RCU))
d_invalidate(d);
return -ESTALE;
}
if (weak) {
if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE)
ret = d->d_op->d_weak_revalidate(d, flags);
} else if (d->d_flags & DCACHE_OP_REVALIDATE) {
ret = d->d_op->d_revalidate(d, flags);
if (!ret) {
if (!(flags & LOOKUP_RCU))
d_invalidate(d);
ret = -ESTALE;
}
}
return 1;
return ret;
}

static int ovl_dentry_weak_revalidate(struct dentry *dentry, unsigned int flags)
static int ovl_dentry_revalidate_common(struct dentry *dentry,
unsigned int flags, bool weak)
{
struct ovl_entry *oe = dentry->d_fsdata;
unsigned int i;
int ret = 1;

for (i = 0; i < oe->numlower; i++) {
struct dentry *d = oe->lowerstack[i].dentry;

if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE) {
ret = d->d_op->d_weak_revalidate(d, flags);
if (ret <= 0)
break;
}
for (i = 0; ret > 0 && i < oe->numlower; i++) {
ret = ovl_revalidate_real(oe->lowerstack[i].dentry, flags,
weak);
}
return ret;
}

static int ovl_dentry_revalidate(struct dentry *dentry, unsigned int flags)
{
return ovl_dentry_revalidate_common(dentry, flags, false);
}

static int ovl_dentry_weak_revalidate(struct dentry *dentry, unsigned int flags)
{
return ovl_dentry_revalidate_common(dentry, flags, true);
}

static const struct dentry_operations ovl_dentry_operations = {
.d_release = ovl_dentry_release,
.d_real = ovl_d_real,
Expand Down

0 comments on commit 3bb7df9

Please sign in to comment.