From patchwork Mon May 1 13:41:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9706621 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 27FA660385 for ; Mon, 1 May 2017 13:42:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1A0F8205A8 for ; Mon, 1 May 2017 13:42:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0F0272807E; Mon, 1 May 2017 13:42:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AF4DA205A8 for ; Mon, 1 May 2017 13:42:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1424926AbdEANmU (ORCPT ); Mon, 1 May 2017 09:42:20 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:33283 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1162464AbdEANmL (ORCPT ); Mon, 1 May 2017 09:42:11 -0400 Received: by mail-wm0-f65.google.com with SMTP id y10so23492223wmh.0; Mon, 01 May 2017 06:42:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6nGrct1vPo0TqBv1lOi15f7IWPaNKoQnyoWMel9I57U=; b=eLEuFJLAeMDkBmZ8oqPFMjcjqiyERwqg2ZfG6r4DMUowGleDggdbSFIujMsNNSXw8T /sFye2AXPa5nxlwkMaMh0EHPsURDFNL2ll5w7qnDI2YGYbzs51TlDJp3r7hkYR8OJe66 cme3sQMBpEm1kXumbEZQ+zvwfezLrohUCBTYpU6tkTBF6dR42o8RK2/YdA3GvH8qlsr5 Y520QgHZmnMeOQo0eQM2bJNWbL/NWFsrt7ydK2BO8ay/Nj/9z6BW+/9uuPOrBnYkWxZZ XnqXGxS0G34qfPfaKFINYebamqOjGG+WBc7+LtRQaOsffaw5RMrd3jJ7yYb092oCw5am MJrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6nGrct1vPo0TqBv1lOi15f7IWPaNKoQnyoWMel9I57U=; b=R8CkTLCBBYGuOfwl7rvbSYg+oECliInvu9nKW4wE9bFoQVO8oiAl7fvOV+oNBeYtoD kMuzRKiL6aFJ8aShUj6tuS2bTDMMZAnvDk9+39SjxiTViBvLApHwBiyuWc3z54+/kybC J7xnNJKdQ8f0cWvlIOLxDtO8hZLt4wPrp96attzzwpAoxh/Awtdis2dHwbuNXcJEnOih ey0/n3QZtyFVDIVUgRoxQ5f9ZSKI1UdEe68KCDzuMv7CfuyQ07yxxdNb3Ts3DwSRi8g1 DaPR77QFSognfiwJXbrlL0Yfx0mFbTWAHUi+bhmvvXkUVfS2qjIIjotjKYN6bSGFFmlW JtFw== X-Gm-Message-State: AN3rC/7lpUnNVPS+4jPt+2D2SYzKfVGMw6tWwoIe+q30c9l4RxKFrr97 dy9LYuLyyj1MsQ== X-Received: by 10.28.7.18 with SMTP id 18mr6242145wmh.80.1493646129718; Mon, 01 May 2017 06:42:09 -0700 (PDT) Received: from amir-VirtualBox.lan (bzq-79-179-55-127.red.bezeqint.net. [79.179.55.127]) by smtp.gmail.com with ESMTPSA id l82sm12532249wmf.17.2017.05.01.06.42.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 01 May 2017 06:42:09 -0700 (PDT) From: Amir Goldstein To: Miklos Szeredi Cc: Vivek Goyal , Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v4 07/15] ovl: lookup copy up origin of non-dir inode Date: Mon, 1 May 2017 16:41:58 +0300 Message-Id: <1493646126-10101-8-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1493646126-10101-1-git-send-email-amir73il@gmail.com> References: <1493646126-10101-1-git-send-email-amir73il@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When non directory upper has overlay.origin xattr, lookup in lower layers to find the copy up origin inode. Until this change, a non-dir dentry could have had oe->numlower == 1 with oe->lowerstack[0] pointing at the copy up origin path right after copy up, but not when a non-dir dentry was created by ovl_lookup(). After this change, a non-dir dentry could be pointing at a lower dentry after ovl_lookup(), which may or may not be the copy up origin. For now, we are not doing anything with this reference, so it is not significant if this is the actual copy up origin. Soon, we will verify that this is the actual copy up origin using file handles. This is going to be used for persistent inode numbers across copy up. Signed-off-by: Amir Goldstein --- fs/overlayfs/namei.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index 6fabbc1..66072b0 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -97,6 +97,13 @@ static bool ovl_is_opaquedir(struct dentry *dentry) return false; } +static bool ovl_is_copyup(struct dentry *dentry) +{ + int res = vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0); + + return res > 0; +} + /* Update ovl_lookup_data struct from dentry found in layer */ static int ovl_lookup_data(struct dentry *this, struct ovl_lookup_data *d, size_t prelen, const char *post, @@ -125,13 +132,16 @@ static int ovl_lookup_data(struct dentry *this, struct ovl_lookup_data *d, goto put_and_out; } d->mode = mode; - /* Stop lookup in lower layers on non-dir */ + /* + * Stop lookup in lower layers on opaque dir and on non-dir + * which is not upper or has no copy up origin. + */ if (!d_can_lookup(this)) { - d->stop = true; - goto out; - } - /* Stop lookup in lower layers on opaque dir */ - if (!d->last && ovl_is_opaquedir(this)) { + if (d->idx > 0 || !ovl_is_copyup(this)) { + d->stop = true; + goto out; + } + } else if (!d->last && ovl_is_opaquedir(this)) { d->stop = d->opaque = true; goto out; }