Commit 8ee6059c authored by Miklos Szeredi's avatar Miklos Szeredi

ovl: simplify lookup

If encountering a non-directory, then stop looking at lower layers.

In this case the oe->opaque flag is not set anymore, which doesn't matter
since existence of lower file is now checked at remove/rename time.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 3ee23ff1
...@@ -473,7 +473,9 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -473,7 +473,9 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
unsigned int ctr = 0; unsigned int ctr = 0;
struct inode *inode = NULL; struct inode *inode = NULL;
bool upperopaque = false; bool upperopaque = false;
struct dentry *this, *prev = NULL; bool stop = false;
bool isdir = false;
struct dentry *this;
unsigned int i; unsigned int i;
int err; int err;
...@@ -494,23 +496,26 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -494,23 +496,26 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
if (ovl_is_whiteout(this)) { if (ovl_is_whiteout(this)) {
dput(this); dput(this);
this = NULL; this = NULL;
upperopaque = true; stop = upperopaque = true;
} else if (poe->numlower && ovl_is_opaquedir(this)) { } else if (!d_is_dir(this)) {
upperopaque = true; stop = true;
} else {
isdir = true;
if (poe->numlower && ovl_is_opaquedir(this))
stop = upperopaque = true;
} }
} }
upperdentry = prev = this; upperdentry = this;
} }
if (!upperopaque && poe->numlower) { if (!stop && poe->numlower) {
err = -ENOMEM; err = -ENOMEM;
stack = kcalloc(poe->numlower, sizeof(struct path), GFP_KERNEL); stack = kcalloc(poe->numlower, sizeof(struct path), GFP_KERNEL);
if (!stack) if (!stack)
goto out_put_upper; goto out_put_upper;
} }
for (i = 0; !upperopaque && i < poe->numlower; i++) { for (i = 0; !stop && i < poe->numlower; i++) {
bool opaque = false;
struct path lowerpath = poe->lowerstack[i]; struct path lowerpath = poe->lowerstack[i];
this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name); this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name);
...@@ -530,35 +535,26 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -530,35 +535,26 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
break; break;
} }
/* /*
* Only makes sense to check opaque dir if this is not the * If this is a non-directory then stop here.
* lowermost layer.
*/ */
if (i < poe->numlower - 1 && ovl_is_opaquedir(this)) if (!d_is_dir(this)) {
opaque = true; if (isdir) {
dput(this);
if (prev && (!S_ISDIR(prev->d_inode->i_mode) || break;
!S_ISDIR(this->d_inode->i_mode))) { }
stop = true;
} else {
/* /*
* FIXME: check for upper-opaqueness maybe better done * Only makes sense to check opaque dir if this is not
* in remove code. * the lowermost layer.
*/ */
if (prev == upperdentry) if (i < poe->numlower - 1 && ovl_is_opaquedir(this))
upperopaque = true; stop = true;
dput(this);
break;
} }
/*
* If this is a non-directory then stop here.
*/
if (!S_ISDIR(this->d_inode->i_mode))
opaque = true;
stack[ctr].dentry = this; stack[ctr].dentry = this;
stack[ctr].mnt = lowerpath.mnt; stack[ctr].mnt = lowerpath.mnt;
ctr++; ctr++;
prev = this;
if (opaque)
break;
} }
oe = ovl_alloc_entry(ctr); oe = ovl_alloc_entry(ctr);
......
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