Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp407047pxy; Wed, 5 May 2021 05:17:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzDfHaq2/ZKutM8Q+m3fYezWVL/Prj5QPrC02clUaHsdAnxcOtg/0HZvxFVnhCUlmePWb7E X-Received: by 2002:a17:90a:2ec6:: with SMTP id h6mr11157576pjs.103.1620217065531; Wed, 05 May 2021 05:17:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620217065; cv=none; d=google.com; s=arc-20160816; b=BF5a5QGfdMFPiNChXvOz/59pp9N168USJZeXP2yKkR0IRb1sGYo6wQ4njxpfAL452v tQuC2zILUyK+yWcaBJIOESwJiUcNhSl6UxuJt0uOEq/LnF3J5H+AjT8cyGy36v8Q3joY q/CmMKS7VsdiJ440ukFioF14d/Z8FUQ3ZMbJ7hLz+6wIwhKk4C8pLaOHQR3VZSucuWt+ p29bFKu5ASaq1DHInbOrmORl1bL2URxrkiXCPZtZDgdH2lp18bVUC7h9UJS2VG3RVZqw CqirIGc7wlj+y48HssHuwmXY6v3ByhfzY3nP0oGu2xa1K3xso+iQUqJwivoxjUWsxCAG A19A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=/2TINjD0t2C+PvQKfKKHbQM6mL9sorna5jdLaSITbJM=; b=BHXLpQTw2cb+YhUSjkZSUhpkljmXDmS4AYcK0nEhWNLpsYPIKwG76obK6I5VWNM3Or 2H4Tnwp9N5/h/eVzlWWv80BBwcYCqv7V0jpk2qu7KCdPAGPTLbBPGvqN99RrBi12j1D1 40oOlwQruOAYCcYCEehPeNp5BmsH7vXjdHfhHsLJqRpnbEIjuTdbNxQ22EwYdf1xdtmq HzEDVQamZ5CVWolyS7fE6a3gTYIG2Mbze5V9K/I89zDHkj7onHnFt3FfSrv8Rv47y879 PWCxRCziRBXr/fbgq0lc0bF0Y46i/pgX9LFuhwBkicSPq39cVbWLoDJgkJPBTl44O5iK Bd1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=rJthOoGA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a1si235777pfi.258.2021.05.05.05.17.30; Wed, 05 May 2021 05:17:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=rJthOoGA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234125AbhEEMOs (ORCPT + 99 others); Wed, 5 May 2021 08:14:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:50186 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233561AbhEEMKh (ORCPT ); Wed, 5 May 2021 08:10:37 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 903F061403; Wed, 5 May 2021 12:09:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620216575; bh=axWk4wiypNzAodGMaHAe7LNeUldA9FLfN820Xlf8Dbs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rJthOoGAM0Gg9bo46kiYprHPGV3smrtE6dIR8tG3CHVlCzHMc087culpZY6urtbh2 LS4Hni0lOHyvO9Np97ClNbSmGbe30q6+k6Vn98Rk1COHV3tyg5QmZDBvyKitN+6FZ/ oqLfElsnaHUNEVxpS47aLQpjFY/nCqKdN6oNzbLY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Miklos Szeredi Subject: [PATCH 5.11 23/31] ovl: allow upperdir inside lowerdir Date: Wed, 5 May 2021 14:06:12 +0200 Message-Id: <20210505112327.445306293@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210505112326.672439569@linuxfoundation.org> References: <20210505112326.672439569@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Miklos Szeredi commit 708fa01597fa002599756bf56a96d0de1677375c upstream. Commit 146d62e5a586 ("ovl: detect overlapping layers") made sure we don't have overlapping layers, but it also broke the arguably valid use case of mount -olowerdir=/,upperdir=/subdir,.. where upperdir overlaps lowerdir on the same filesystem. This has been causing regressions. Revert the check, but only for the specific case where upperdir and/or workdir are subdirectories of lowerdir. Any other overlap (e.g. lowerdir is subdirectory of upperdir, etc) case is crazy, so leave the check in place for those. Overlaps are detected at lookup time too, so reverting the mount time check should be safe. Fixes: 146d62e5a586 ("ovl: detect overlapping layers") Cc: # v5.2 Signed-off-by: Miklos Szeredi Signed-off-by: Greg Kroah-Hartman --- fs/overlayfs/super.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -1817,7 +1817,8 @@ out_err: * - upper/work dir of any overlayfs instance */ static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs, - struct dentry *dentry, const char *name) + struct dentry *dentry, const char *name, + bool is_lower) { struct dentry *next = dentry, *parent; int err = 0; @@ -1829,7 +1830,7 @@ static int ovl_check_layer(struct super_ /* Walk back ancestors to root (inclusive) looking for traps */ while (!err && parent != next) { - if (ovl_lookup_trap_inode(sb, parent)) { + if (is_lower && ovl_lookup_trap_inode(sb, parent)) { err = -ELOOP; pr_err("overlapping %s path\n", name); } else if (ovl_is_inuse(parent)) { @@ -1855,7 +1856,7 @@ static int ovl_check_overlapping_layers( if (ovl_upper_mnt(ofs)) { err = ovl_check_layer(sb, ofs, ovl_upper_mnt(ofs)->mnt_root, - "upperdir"); + "upperdir", false); if (err) return err; @@ -1866,7 +1867,8 @@ static int ovl_check_overlapping_layers( * workbasedir. In that case, we already have their traps in * inode cache and we will catch that case on lookup. */ - err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir"); + err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir", + false); if (err) return err; } @@ -1874,7 +1876,7 @@ static int ovl_check_overlapping_layers( for (i = 1; i < ofs->numlayer; i++) { err = ovl_check_layer(sb, ofs, ofs->layers[i].mnt->mnt_root, - "lowerdir"); + "lowerdir", true); if (err) return err; }