Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3472835imm; Tue, 29 May 2018 07:51:31 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqv2ydMYJdeat/wnC6aJ4Dj1iuABbDx6cu+ViZ4uZpywAApfZ0SPr/GAZXqu9I1sUgig8qX X-Received: by 2002:a65:65c8:: with SMTP id y8-v6mr14284655pgv.320.1527605491488; Tue, 29 May 2018 07:51:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527605491; cv=none; d=google.com; s=arc-20160816; b=qCzUk+8WD0SLB3rfl+HRCLWcwu4CSFR9NJqwDWANuYQUI7lw1PdLeMkrGRBNL6pQTi WfUmXeY4OCZXSGjqsepxjG9bmwFny08Y905JMxd31qQYnHFDEKieEbGrvY2rEIk5DiU4 kOMAcbxe7n34pA6L9rbXEHunqtAzcWe69VOiBBKBFJt9SVMsxSUKbikD34/a0AW37XbH TcDWJO2LG0bVlD1I1ivNyqQC4w1dFllx0gpleJoiH43TPEdSMuWq1/eg/lFIEI4C7hmF 5cDt7Ls/JmUHum2b/wshbln3U5gTikYuQXktGlMQaD2d7PeF3b5zWMHh4JmyfOAp3SvZ 8DRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=3meUC00+tdqe9TH85IGKLU0R8Hhb2qbKlnzpKjuxUlg=; b=Tpfn9ruxw2TpSqAfwE28fC3FYUIPLA1btjdXzl6MH2+OUzySkgIh8Rur98vHzVGv9R qaO5Cmtrli57hJxZdkg/CSVxk8YpguMyHq+U/injB7Lj2E1U8Y9g3u83+tlH4NGkFf6v V/6jKaNvgudQc1ptfHDGT+fT72Ew+kHYqDiL0I5GCKu2ALqYrKN+GNngbmWOM/w6PVUz fVSz0g0UtYr/o7IMRlYQtE6XJCxaUCaygtHdM32vPSNIBo6ZjXBk1pY1PanxqMv/ECXp fZZ5oI+WBMX6G5pujBPwIlkiyLl55GqEaJo3aNfzuhvDIH06biDBglq0TZkWpr6rYX83 7skg== 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=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t1-v6si16090793plq.341.2018.05.29.07.51.17; Tue, 29 May 2018 07:51:31 -0700 (PDT) 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964854AbeE2OuL (ORCPT + 99 others); Tue, 29 May 2018 10:50:11 -0400 Received: from mail-wm0-f54.google.com ([74.125.82.54]:36449 "EHLO mail-wm0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936648AbeE2Oqn (ORCPT ); Tue, 29 May 2018 10:46:43 -0400 Received: by mail-wm0-f54.google.com with SMTP id v131-v6so22156962wma.1 for ; Tue, 29 May 2018 07:46:42 -0700 (PDT) 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=3meUC00+tdqe9TH85IGKLU0R8Hhb2qbKlnzpKjuxUlg=; b=sV6crz1xZ7SU6UIihisyLxrH/ZyGbBbEPnfqfaFPRUYp6tYyBNyoLrYaoODrfdHVjE Z6rTb/w5ABWjIS09ez+DWeuf1qdRyNVi8jEtT8qMbYfaMz4HQ2R996lGlAr5FZcTJPuc VN7KYv7zet8NvxVbrix7L8XnCZB6NfWo+SEDFFF8Zl5Zbo8Un7pDFaYZALcJRk/00o/W HXTCdj2Y58hHCoIVquKa41UzYgYvacI8NGUjcwrDTUVVlYFE7/YqGFlYNFNhCSI1FDpb HLWZGFO0rHeWhrXLnntjaNsFCwZfcfsQzu5lGIFmMlyZIVMZ4/algD4wMnAetRd5s0+w wg5A== X-Gm-Message-State: ALKqPwfA9aGKJCSsBTa6q+eHpLCcPhZcYdI/uLSW1kPW0It2SGzXVR+L wYTNsu0GaPFyca3nR8PwbFmSGdAILrc= X-Received: by 2002:a1c:64d7:: with SMTP id y206-v6mr5178574wmb.43.1527605202147; Tue, 29 May 2018 07:46:42 -0700 (PDT) Received: from veci.piliscsaba.redhat.com (catv-176-63-54-97.catv.broadband.hu. [176.63.54.97]) by smtp.gmail.com with ESMTPSA id n71-v6sm20942227wmi.14.2018.05.29.07.46.41 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 29 May 2018 07:46:41 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 22/28] ovl: Set redirect on metacopy files upon rename Date: Tue, 29 May 2018 16:46:06 +0200 Message-Id: <20180529144612.16675-23-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180529144612.16675-1-mszeredi@redhat.com> References: <20180529144612.16675-1-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vivek Goyal Set redirect on metacopy files upon rename. This will help find data dentry in lower dirs. Signed-off-by: Vivek Goyal Reviewed-by: Amir Goldstein Signed-off-by: Miklos Szeredi --- fs/overlayfs/dir.c | 66 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 8d8e063e4706..1658961a9762 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -873,13 +873,13 @@ static bool ovl_can_move(struct dentry *dentry) !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry); } -static char *ovl_get_redirect(struct dentry *dentry, bool samedir) +static char *ovl_get_redirect(struct dentry *dentry, bool abs_redirect) { char *buf, *ret; struct dentry *d, *tmp; int buflen = ovl_redirect_max + 1; - if (samedir) { + if (!abs_redirect) { ret = kstrndup(dentry->d_name.name, dentry->d_name.len, GFP_KERNEL); goto out; @@ -933,15 +933,43 @@ static char *ovl_get_redirect(struct dentry *dentry, bool samedir) return ret ? ret : ERR_PTR(-ENOMEM); } +static bool ovl_need_absolute_redirect(struct dentry *dentry, bool samedir) +{ + struct dentry *lowerdentry; + + if (!samedir) + return true; + + if (d_is_dir(dentry)) + return false; + + /* + * For non-dir hardlinked files, we need absolute redirects + * in general as two upper hardlinks could be in different + * dirs. We could put a relative redirect now and convert + * it to absolute redirect later. But when nlink > 1 and + * indexing is on, that means relative redirect needs to be + * converted to absolute during copy up of another lower + * hardllink as well. + * + * So without optimizing too much, just check if lower is + * a hard link or not. If lower is hard link, put absolute + * redirect. + */ + lowerdentry = ovl_dentry_lower(dentry); + return (d_inode(lowerdentry)->i_nlink > 1); +} + static int ovl_set_redirect(struct dentry *dentry, bool samedir) { int err; const char *redirect = ovl_dentry_get_redirect(dentry); + bool absolute_redirect = ovl_need_absolute_redirect(dentry, samedir); - if (redirect && (samedir || redirect[0] == '/')) + if (redirect && (!absolute_redirect || redirect[0] == '/')) return 0; - redirect = ovl_get_redirect(dentry, samedir); + redirect = ovl_get_redirect(dentry, absolute_redirect); if (IS_ERR(redirect)) return PTR_ERR(redirect); @@ -1117,22 +1145,20 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, goto out_dput; err = 0; - if (is_dir) { - if (ovl_type_merge_or_lower(old)) - err = ovl_set_redirect(old, samedir); - else if (!old_opaque && ovl_type_merge(new->d_parent)) - err = ovl_set_opaque_xerr(old, olddentry, -EXDEV); - if (err) - goto out_dput; - } - if (!overwrite && new_is_dir) { - if (ovl_type_merge_or_lower(new)) - err = ovl_set_redirect(new, samedir); - else if (!new_opaque && ovl_type_merge(old->d_parent)) - err = ovl_set_opaque_xerr(new, newdentry, -EXDEV); - if (err) - goto out_dput; - } + if (ovl_type_merge_or_lower(old)) + err = ovl_set_redirect(old, samedir); + else if (is_dir && !old_opaque && ovl_type_merge(new->d_parent)) + err = ovl_set_opaque_xerr(old, olddentry, -EXDEV); + if (err) + goto out_dput; + + if (!overwrite && ovl_type_merge_or_lower(new)) + err = ovl_set_redirect(new, samedir); + else if (!overwrite && new_is_dir && !new_opaque && + ovl_type_merge(old->d_parent)) + err = ovl_set_opaque_xerr(new, newdentry, -EXDEV); + if (err) + goto out_dput; err = ovl_do_rename(old_upperdir->d_inode, olddentry, new_upperdir->d_inode, newdentry, flags); -- 2.14.3