From patchwork Thu Jan 4 17:20:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10145237 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 3D5016034B for ; Thu, 4 Jan 2018 17:21:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2331E223C6 for ; Thu, 4 Jan 2018 17:21:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 181A82874E; Thu, 4 Jan 2018 17:21:00 +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=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI 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 B314D223C6 for ; Thu, 4 Jan 2018 17:20:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752462AbeADRU6 (ORCPT ); Thu, 4 Jan 2018 12:20:58 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:35468 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752392AbeADRUx (ORCPT ); Thu, 4 Jan 2018 12:20:53 -0500 Received: by mail-wm0-f65.google.com with SMTP id a79so4672099wma.0; Thu, 04 Jan 2018 09:20:51 -0800 (PST) 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=z3AbXlYmF8CqpAMpP3KCYLVmXYCyJbl/a9uN7jjLjvE=; b=C++72xR8LeSoTmbRm8iOg5O9tL7qCeQzv9zLkte6a8qq5CrtFeQ3zID4yl3KpXpvMJ 1r8xQ7dmuWkrkUCa8DGIPgy6j+g/Uw0QpZA3BsyAKazSGQyZYAnNBRs8ROoiKQ04Ixak 6hUhfg0JPUA/yuytgv9CZ6+xd9YSI8pRTTj1WPZaW3xVk9V5U3LBSsnQJTzcCVZ+8Cwr B+O9B17uxF4OD4TOXKe4Iy2HQ5ntu2qGdF7IFg6rN0ulkFqXsR5ewwZy5OX97e5pW689 E79bonpJAyihrqwV8zgmOPMKxmNgpL3TLbs8j267UdNJQW1P+PQjl+AvOhCrUxSXjYa+ gozw== 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=z3AbXlYmF8CqpAMpP3KCYLVmXYCyJbl/a9uN7jjLjvE=; b=UU/3G1N1fZYVBpBbWE6wsIKff1AALHfaZ4gjcYtkNGtBomjnoq9k6m9s4KgPKhVwoI PuzQG2svIbiG7X5gNVuNCitUP81Y7bN5H0EHVQV5SFqdc9XEUEcMbsVqIcJ030GYno4E eRPOskLyDZY8Ex4g9DkUdpK0clZZGnX0RMHqUkEx2bDJXvWKYx4WFv2L7DpyIQMwtC55 7Oe9duL5B7sS1a8p86Nz4TP2cItpQkgT5X0rlIx0eAEEtotjNKprFcZcNtoxgHtM0z4i xWEZPo9ZCm0kY1TQ9zQf05TPEb/qr62DwRK8ubCk+InPL6xw5BYXi3dqshzZmb83rA6z OsGg== X-Gm-Message-State: AKGB3mLm7/wyLV7ItvhK5I3OjSWIjulM+GH1/9avhIiytofQv/KnxVe1 7f9hoHxQLqHGlkEjxs5MHsw= X-Google-Smtp-Source: ACJfBovuBWihYIx2N2759yxOsil/NleZ4wtTakExPcvZJeRkYd1kuVoFx9ZUwR/k5Mzt5iALh8Kpvw== X-Received: by 10.28.146.84 with SMTP id u81mr207119wmd.26.1515086451230; Thu, 04 Jan 2018 09:20:51 -0800 (PST) Received: from localhost.localdomain (bzq-166-168-31-246.red.bezeqint.net. [31.168.166.246]) by smtp.gmail.com with ESMTPSA id c6sm2777750wmd.21.2018.01.04.09.20.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 04 Jan 2018 09:20:50 -0800 (PST) From: Amir Goldstein To: Miklos Szeredi Cc: Jeff Layton , "J . Bruce Fields" , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 12/17] ovl: decode pure lower dir file handles Date: Thu, 4 Jan 2018 19:20:44 +0200 Message-Id: <1515086449-26563-13-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515086449-26563-1-git-send-email-amir73il@gmail.com> References: <1515086449-26563-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 Similar to decoding a pure upper dir file handle, decoding a pure lower dir file handle is implemented by looking an overlay dentry of the same path as the pure lower path and verifying that the overlay dentry's real lower matches the decoded real lower file handle. Unlike the case of upper dir file handle, the lookup of overlay path by lower real path can fail or find a mismatched overlay dentry if any of the lower parents have been copied up and renamed. To address this case we will need to check if any of the lower parents are indexed. Signed-off-by: Amir Goldstein --- fs/overlayfs/export.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c index 6141682301d6..ec4b9f29d40d 100644 --- a/fs/overlayfs/export.c +++ b/fs/overlayfs/export.c @@ -215,6 +215,11 @@ static struct dentry *ovl_obtain_alias(struct super_block *sb, return dentry; } +static struct dentry *ovl_dentry_real_at(struct dentry *dentry, bool is_upper) +{ + return is_upper ? ovl_dentry_upper(dentry) : ovl_dentry_lower(dentry); +} + /* * Lookup a child overlay dentry whose real dentry is @real. * If @is_upper is true then we lookup a child overlay dentry with the same @@ -228,8 +233,6 @@ static struct dentry *ovl_lookup_real_one(struct dentry *parent, int err; /* TODO: use index when looking up by lower real dentry */ - if (!is_upper) - return ERR_PTR(-EACCES); /* Lookup overlay dentry by real name */ this = lookup_one_len_unlocked(name->name, parent, name->len); @@ -240,7 +243,7 @@ static struct dentry *ovl_lookup_real_one(struct dentry *parent, dput(this); err = -ENOENT; goto fail; - } else if (ovl_dentry_upper(this) != real) { + } else if (ovl_dentry_real_at(this, is_upper) != real) { dput(this); err = -ESTALE; goto fail; @@ -265,15 +268,12 @@ static struct dentry *ovl_lookup_real(struct super_block *sb, struct dentry *connected; int err = 0; - /* TODO: use index when looking up by lower real dentry */ - if (!is_upper) - return ERR_PTR(-EACCES); - connected = dget(sb->s_root); while (!err) { struct dentry *next, *this; struct dentry *parent = NULL; - struct dentry *real_connected = ovl_dentry_upper(connected); + struct dentry *real_connected = ovl_dentry_real_at(connected, + is_upper); if (real_connected == real) break; @@ -342,19 +342,15 @@ static struct dentry *ovl_get_dentry(struct super_block *sb, if (!d_is_dir(real)) return ovl_obtain_alias(sb, upper, lowerpath, index); - /* TODO: lookup connected dir from real lower dir */ - if (!upper) - return ERR_PTR(-EACCES); - /* Removed empty directory? */ - if ((upper->d_flags & DCACHE_DISCONNECTED) || d_unhashed(upper)) + if ((real->d_flags & DCACHE_DISCONNECTED) || d_unhashed(real)) return ERR_PTR(-ENOENT); /* - * If real upper dentry is connected and hashed, get a connected - * overlay dentry with the same path as the real upper dentry. + * If real dentry is connected and hashed, get a connected overlay + * dentry whose real dentry is @real. */ - return ovl_lookup_real(sb, upper, true); + return ovl_lookup_real(sb, real, !!upper); } static struct dentry *ovl_upper_fh_to_d(struct super_block *sb,