summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/overlayfs/super.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 6ca8ea8cb9b2..9e94f4acef1a 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -372,7 +372,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
bool opaque = false;
struct path lowerpath = poe->lowerstack[i];
- opaque = false;
this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name);
err = PTR_ERR(this);
if (IS_ERR(this)) {
@@ -395,20 +394,24 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
*/
if (i < poe->numlower - 1 && ovl_is_opaquedir(this))
opaque = true;
- /*
- * If this is a non-directory then stop here.
- *
- * FIXME: check for opaqueness maybe better done in remove code.
- */
- if (!S_ISDIR(this->d_inode->i_mode)) {
- opaque = true;
- } else if (prev && (!S_ISDIR(prev->d_inode->i_mode) ||
- !S_ISDIR(this->d_inode->i_mode))) {
+
+ if (prev && (!S_ISDIR(prev->d_inode->i_mode) ||
+ !S_ISDIR(this->d_inode->i_mode))) {
+ /*
+ * FIXME: check for upper-opaqueness maybe better done
+ * in remove code.
+ */
if (prev == upperdentry)
upperopaque = 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].mnt = lowerpath.mnt;
ctr++;