Commit 3bb7df92 authored by Miklos Szeredi's avatar Miklos Szeredi

ovl: restructure dentry revalidation

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: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent c61ca557
...@@ -113,47 +113,48 @@ static struct dentry *ovl_d_real(struct dentry *dentry, ...@@ -113,47 +113,48 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
return 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; int ret = 1;
for (i = 0; i < oe->numlower; i++) { if (weak) {
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 (d->d_flags & DCACHE_OP_REVALIDATE) { } else if (d->d_flags & DCACHE_OP_REVALIDATE) {
ret = d->d_op->d_revalidate(d, flags); ret = d->d_op->d_revalidate(d, flags);
if (ret < 0) if (!ret) {
return ret; if (!(flags & LOOKUP_RCU))
if (!ret) { d_invalidate(d);
if (!(flags & LOOKUP_RCU)) ret = -ESTALE;
d_invalidate(d);
return -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; struct ovl_entry *oe = dentry->d_fsdata;
unsigned int i; unsigned int i;
int ret = 1; int ret = 1;
for (i = 0; i < oe->numlower; i++) { for (i = 0; ret > 0 && i < oe->numlower; i++) {
struct dentry *d = oe->lowerstack[i].dentry; ret = ovl_revalidate_real(oe->lowerstack[i].dentry, flags,
weak);
if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE) {
ret = d->d_op->d_weak_revalidate(d, flags);
if (ret <= 0)
break;
}
} }
return ret; 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 = { static const struct dentry_operations ovl_dentry_operations = {
.d_release = ovl_dentry_release, .d_release = ovl_dentry_release,
.d_real = ovl_d_real, .d_real = ovl_d_real,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment