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

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
Loading
Loading
Loading
Loading
+26 −25
Original line number Diff line number Diff line
@@ -113,47 +113,48 @@ bug:
	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) {
	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 < 0)
				return ret;
		if (!ret) {
			if (!(flags & LOOKUP_RCU))
				d_invalidate(d);
				return -ESTALE;
			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,