Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp2299671ybc; Wed, 13 Nov 2019 12:08:26 -0800 (PST) X-Google-Smtp-Source: APXvYqya7PLCm3opR4Ok/5007QraLySQJc+BEv7+lVzFg9sBsg8Cpflf7PY3dCjTZSc/XHqER9y3 X-Received: by 2002:aa7:d1c9:: with SMTP id g9mr5649817edp.162.1573675706324; Wed, 13 Nov 2019 12:08:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573675706; cv=none; d=google.com; s=arc-20160816; b=wOZ7Ve9LpTQDzZkaqJkQchTReohV4SKud5g3D1WM2RBuebOrY17yh0gZTqgR53aGfL /sul0Avg80YfJWIqAuyDdiIXzJdv5i7BJBwOyi9PsbRJEiXgmru2LSxoooZYibPRVpdl nt+mXEGzuXtQeHuG9r3wgVDFQj0feqEb+OcJZkgQb2ouByPRSZ91vugC3ZcXQ223xYMU WSc/TCWx+a7Cs/MaIbYKdLRr85nOIMpSLPHoJTy119KtaacD/qqkjSDg6UtuCamlVmVG 8dTMVp/rdvcREqfI7mwj0PlPVfFLwP32a2l6F3i2FnTfbxVGoiu5ZbU1Q3SyaFB7D/Nw 6kYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=2S/pcsp9jU+0k9XYTjmjy54OR1f68hnWIbCPaPTYcl8=; b=J6gIGRT1aBZfAX1BS6UhL+82L/S/qxqagmbA6BzabhQq+1Y5t7riQ7J1gl16Vjx5Wy 8nocVJZwSD4hprx4cjx0tLeycwj8edLCzBXnVOFUdpEtOko1C05A5f8B1OQowPbcVNUR lt4s1ZUT0X9tW1VP3c6kdh/7wXOIkxDVd9qTSycyes5m/p1TqR+Mpc90eiCbs2r8WRt6 cBXF860B9QYugUOHt4Tq9ZRGMMsmpH1ZQHk2BnaVf6gkd6NQtyXtV7mn3ttYBCzkc6s5 KIb3kuq7LtFnaCowrk4v4/koWC0Gi7MMbEd/5x0AJHO5mE5GqmdNOs1BuYEqAXFkhbnI opsw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f25si1905879eje.225.2019.11.13.12.08.01; Wed, 13 Nov 2019 12:08:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726548AbfKMUGy (ORCPT + 99 others); Wed, 13 Nov 2019 15:06:54 -0500 Received: from youngberry.canonical.com ([91.189.89.112]:43539 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726173AbfKMUGy (ORCPT ); Wed, 13 Nov 2019 15:06:54 -0500 Received: from 1.general.cking.uk.vpn ([10.172.193.212] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1iUyuh-0007CI-O4; Wed, 13 Nov 2019 20:06:51 +0000 From: Colin King To: Miklos Szeredi , Amir Goldstein , linux-unionfs@vger.kernel.org Cc: linux-kernel@vger.kernel.org Subject: [PATCH][V4] ovl: fix lookup failure on multi lower squashfs Date: Wed, 13 Nov 2019 20:06:51 +0000 Message-Id: <20191113200651.114606-1-colin.king@canonical.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Amir Goldstein In the past, overlayfs required that lower fs have non null uuid in order to support nfs export and decode copy up origin file handles. Commit 9df085f3c9a2 ("ovl: relax requirement for non null uuid of lower fs") relaxed this requirement for nfs export support, as long as uuid (even if null) is unique among all lower fs. However, said commit unintentionally also relaxed the non null uuid requirement for decoding copy up origin file handles, regardless of the unique uuid requirement. Amend this mistake by disabling decoding of copy up origin file handle from lower fs with a conflicting uuid. We still encode copy up origin file handles from those fs, because file handles like those already exist in the wild and because they might provide useful information in the future. [Colin Ian King] fixed the case of index=off,nfs_export=off Reported-by: Colin Ian King Link: https://lore.kernel.org/lkml/20191106234301.283006-1-colin.king@canonical.com/ Fixes: 9df085f3c9a2 ("ovl: relax requirement for non null uuid ...") Cc: stable@vger.kernel.org # v4.20+ Signed-off-by: Amir Goldstein Tested-by: Colin Ian King Signed-off-by: Colin Ian King ` --- V3: fix the following check: - if (!ofs->config.nfs_export && !(ofs->config.index && ofs->upper_mnt)) + if (!ofs->config.nfs_export && !ofs->upper_mnt) V4: remove bogus ofs->upper_mnt check --- fs/overlayfs/namei.c | 8 ++++++++ fs/overlayfs/ovl_entry.h | 2 ++ fs/overlayfs/super.c | 13 ++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index e9717c2f7d45..f47c591402d7 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -325,6 +325,14 @@ int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected, int i; for (i = 0; i < ofs->numlower; i++) { + /* + * If lower fs uuid is not unique among lower fs we cannot match + * fh->uuid to layer. + */ + if (ofs->lower_layers[i].fsid && + ofs->lower_layers[i].fs->bad_uuid) + continue; + origin = ovl_decode_real_fh(fh, ofs->lower_layers[i].mnt, connected); if (origin) diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h index a8279280e88d..28348c44ea5b 100644 --- a/fs/overlayfs/ovl_entry.h +++ b/fs/overlayfs/ovl_entry.h @@ -22,6 +22,8 @@ struct ovl_config { struct ovl_sb { struct super_block *sb; dev_t pseudo_dev; + /* Unusable (conflicting) uuid */ + bool bad_uuid; }; struct ovl_layer { diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index afbcb116a7f1..8001bbad8705 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -1255,7 +1255,7 @@ static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) { unsigned int i; - if (!ofs->config.nfs_export && !(ofs->config.index && ofs->upper_mnt)) + if (!ofs->config.nfs_export && !ofs->upper_mnt) return true; for (i = 0; i < ofs->numlowerfs; i++) { @@ -1263,9 +1263,13 @@ static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) * We use uuid to associate an overlay lower file handle with a * lower layer, so we can accept lower fs with null uuid as long * as all lower layers with null uuid are on the same fs. + * if we detect multiple lower fs with the same uuid, we + * disable lower file handle decoding on all of them. */ - if (uuid_equal(&ofs->lower_fs[i].sb->s_uuid, uuid)) + if (uuid_equal(&ofs->lower_fs[i].sb->s_uuid, uuid)) { + ofs->lower_fs[i].bad_uuid = true; return false; + } } return true; } @@ -1277,6 +1281,7 @@ static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) unsigned int i; dev_t dev; int err; + bool bad_uuid = false; /* fsid 0 is reserved for upper fs even with non upper overlay */ if (ofs->upper_mnt && ofs->upper_mnt->mnt_sb == sb) @@ -1288,9 +1293,10 @@ static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) } if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { + bad_uuid = true; ofs->config.index = false; ofs->config.nfs_export = false; - pr_warn("overlayfs: %s uuid detected in lower fs '%pd2', falling back to index=off,nfs_export=off.\n", + pr_warn("overlayfs: %s uuid detected in lower fs '%pd2', enforcing index=off,nfs_export=off.\n", uuid_is_null(&sb->s_uuid) ? "null" : "conflicting", path->dentry); } @@ -1303,6 +1309,7 @@ static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) ofs->lower_fs[ofs->numlowerfs].sb = sb; ofs->lower_fs[ofs->numlowerfs].pseudo_dev = dev; + ofs->lower_fs[ofs->numlowerfs].bad_uuid = bad_uuid; ofs->numlowerfs++; return ofs->numlowerfs; -- 2.20.1