summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2014-12-13 00:59:45 +0100
committerMiklos Szeredi <mszeredi@suse.cz>2014-12-13 00:59:45 +0100
commit09e10322b71716adf567d453889ef0871cf226b9 (patch)
tree5c2287a55fbdf929e6131834c686a888046b5def
parent3e01cee3b980f96463cb6f378ab05303a99903d9 (diff)
downloadop-kernel-dev-09e10322b71716adf567d453889ef0871cf226b9.zip
op-kernel-dev-09e10322b71716adf567d453889ef0871cf226b9.tar.gz
ovl: lookup ENAMETOOLONG on lower means ENOENT
"Suppose you have in one of the lower layers a filesystem with ->lookup()-enforced upper limit on name length. Pretty much every local fs has one, but... they are not all equal. 255 characters is the common upper limit, but e.g. jffs2 stops at 254, minixfs upper limit is somewhere from 14 to 60, depending upon version, etc. You are doing a lookup for something that is present in upper layer, but happens to be too long for one of the lower layers. Too bad - ENAMETOOLONG for you..." Reported-by: Al Viro <viro@ZenIV.linux.org.uk> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
-rw-r--r--fs/overlayfs/super.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 5dbc678..110c968 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -376,8 +376,14 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
opaque = false;
this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name);
err = PTR_ERR(this);
- if (IS_ERR(this))
+ if (IS_ERR(this)) {
+ /*
+ * If it's positive, then treat ENAMETOOLONG as ENOENT.
+ */
+ if (err == -ENAMETOOLONG && (upperdentry || ctr))
+ continue;
goto out_put;
+ }
if (!this)
continue;
if (ovl_is_whiteout(this)) {
OpenPOWER on IntegriCloud