From patchwork Mon May 1 13:41:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9706615 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 39E7E60385 for ; Mon, 1 May 2017 13:42:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C5F9205A8 for ; Mon, 1 May 2017 13:42:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 213432807E; Mon, 1 May 2017 13:42:15 +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 C0279205A8 for ; Mon, 1 May 2017 13:42:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S968712AbdEANmM (ORCPT ); Mon, 1 May 2017 09:42:12 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:34312 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1165388AbdEANmG (ORCPT ); Mon, 1 May 2017 09:42:06 -0400 Received: by mail-wm0-f65.google.com with SMTP id z129so23518798wmb.1; Mon, 01 May 2017 06:42:05 -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=ISaiPuWJDWa3gpxCyl/tHBQPcVDC0cOo+hKjdrEEfCc=; b=JN4gg7BR2iRkw5el3EBAyf63UhKNMTE/JdjH3g/PhZdCHb8bnvRy342xBrccFHxLRB 4jrveq6+zMFnm5kBT/RU+IW01k37M2I4CP9sPbQ+HHirk0OfCNXBjx41FO6a0jIwfus3 kN0q+RwZZr233m/tSWlKpZmtDlCejEavbxMX3SF5mJejoLoceum+I6q0NkJ9kDOAKMOr PeesK2gH6si37jPo95j9873cQvJKT0MvQPVOFJmELFVuJajrVujYJL5fM0DuGW8xykx9 cE1L1zNX+FbSZ8kyVvYuf3U9Snv+M8RNpnJxusiAMu2ilyjbO/0yvdMwXjPyU3tl5Idh Rpyw== 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=ISaiPuWJDWa3gpxCyl/tHBQPcVDC0cOo+hKjdrEEfCc=; b=dmr0Clbsl7lE67bFMPdceeHIgb+1kwhA0caY49fUPYMORVVl12g4SxPZp47l2bEdaz xwqiYPsLTPGprVi9qUOtvghSHb7vk2lb3KaLv5sb1uZgnYj69yIkqgXlPNEpXJW0aOar a2YyVNDq7BSbXk+/3QXtyXdE+gepwI0cbTlCLXfSUniiY38xPcZJ5l1e4dDYvvXwpLht nrrTH+1X9LKPJ717S5AXiEFuzQNQsppCpuPxnc6so3BZJZmic4f74s7X0lKDPZ8MlNVj uKGgf3TaiD7Hp5En/k/UxhDAvalfServYqI0FCR/A1cjfIxjq5JdbyhhXma1EpJpkoSo dtZQ== X-Gm-Message-State: AN3rC/6OjswZy8CsPZh+IzhMbNkaUaxwP2+z8CVifbsW8AMGptQcYV4W 1dqBQ/60ciBt0Q== X-Received: by 10.28.150.213 with SMTP id y204mr3869wmd.138.1493646125143; Mon, 01 May 2017 06:42:05 -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.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 01 May 2017 06:42:04 -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 04/15] ovl: factor out ovl_lookup_data() Date: Mon, 1 May 2017 16:41:55 +0300 Message-Id: <1493646126-10101-5-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 Split helper ovl_lookup_data() out of ovl_lookup_single(). The helper takes care of updating the ovl_lookup_data context according to the dentry that was found in layer. Decorate ovl_lookup_data() with some more comments. Signed-off-by: Amir Goldstein --- fs/overlayfs/namei.c | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index d0a3e4a..e6de13d 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -96,34 +96,27 @@ static bool ovl_is_opaquedir(struct dentry *dentry) return false; } -static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d, - const char *name, unsigned int namelen, - size_t prelen, const char *post, - struct dentry **ret) +/* 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, + struct dentry **ret) { - struct dentry *this; int err; - this = lookup_one_len_unlocked(name, base, namelen); - if (IS_ERR(this)) { - err = PTR_ERR(this); - this = NULL; - if (err == -ENOENT || err == -ENAMETOOLONG) - goto out; - goto out_err; - } if (!this->d_inode) goto put_and_out; + /* Don't support traversing automounts and other weirdness */ if (ovl_dentry_weird(this)) { - /* Don't support traversing automounts and other weirdness */ err = -EREMOTE; goto out_err; } + /* Stop lookup in lower layers on whiteout */ if (ovl_is_whiteout(this)) { d->stop = d->opaque = true; goto put_and_out; } + /* Stop lookup in lower layers on non-dir */ if (!d_can_lookup(this)) { d->stop = true; if (d->is_dir) @@ -131,10 +124,15 @@ static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d, goto out; } d->is_dir = true; + /* Stop lookup in lower layers on opaque dir */ if (!d->last && ovl_is_opaquedir(this)) { d->stop = d->opaque = true; goto out; } + /* + * Check redirect dir even if d->last, because with redirect_dir, + * a merge dir may have an opaque dir parent. + */ err = ovl_check_redirect(this, d, prelen, post); if (err) goto out_err; @@ -152,6 +150,25 @@ static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d, return err; } +static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d, + const char *name, unsigned int namelen, + size_t prelen, const char *post, + struct dentry **ret) +{ + struct dentry *this = lookup_one_len_unlocked(name, base, namelen); + int err; + + if (IS_ERR(this)) { + err = PTR_ERR(this); + *ret = NULL; + if (err == -ENOENT || err == -ENAMETOOLONG) + return 0; + return err; + } + + return ovl_lookup_data(this, d, prelen, post, ret); +} + static int ovl_lookup_layer(struct dentry *base, struct ovl_lookup_data *d, struct dentry **ret) {