ovl: check whiteout on lowest layer as well
Not checking whiteouts on lowest layer was an optimization (there's nothing
to white out there), but it could result in inconsitent behavior when a
layer previously used as upper/middle is later used as lowest.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index f72b82f..5dbc678 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -350,16 +350,12 @@
if (IS_ERR(this))
goto out;
- /*
- * If this is not the lowermost layer, check whiteout and opaque
- * directory.
- */
- if (poe->numlower && this) {
+ if (this) {
if (ovl_is_whiteout(this)) {
dput(this);
this = NULL;
upperopaque = true;
- } else if (ovl_is_opaquedir(this)) {
+ } else if (poe->numlower && ovl_is_opaquedir(this)) {
upperopaque = true;
}
}
@@ -384,20 +380,17 @@
goto out_put;
if (!this)
continue;
-
- /*
- * If this is not the lowermost layer, check whiteout and opaque
- * directory.
- */
- if (i < poe->numlower - 1) {
- if (ovl_is_whiteout(this)) {
- dput(this);
- break;
- } else if (ovl_is_opaquedir(this)) {
- opaque = true;
- }
+ if (ovl_is_whiteout(this)) {
+ dput(this);
+ break;
}
/*
+ * Only makes sense to check opaque dir if this is not the
+ * lowermost layer.
+ */
+ 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.