From patchwork Tue Jan 17 04:34:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9519915 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 4D1C86043D for ; Tue, 17 Jan 2017 04:36:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4157628391 for ; Tue, 17 Jan 2017 04:36:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 363E22840B; Tue, 17 Jan 2017 04:36:36 +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.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 CB60E28391 for ; Tue, 17 Jan 2017 04:36:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751194AbdAQEge (ORCPT ); Mon, 16 Jan 2017 23:36:34 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36595 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751144AbdAQEg0 (ORCPT ); Mon, 16 Jan 2017 23:36:26 -0500 Received: by mail-wm0-f66.google.com with SMTP id r126so35521332wmr.3; Mon, 16 Jan 2017 20:35:18 -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=FZMFftNpugF2TeTXsuDUg96zEbOf7aTMUaiFvRfI18U=; b=o1FvFkjAnegY4j+91Og0hjeGlu0N0mHQ1sNDIcSosfXrUTU4PkDoCZu5uwzGsNiWP1 t2H6bn98ovnrwGhhSXs2m9LDvwdPnDb5IZbwTUa9rMMrY/WwnmOQWVBEhikJvuVu+qTE VPHBlzF4HMi6XruLssoe9r103pWbEYUedQLYWFkNf/M4GsqYBay4nqRg0BYQR5IiSehG kNBgwDOZYmfWVFo3uf+TJBf4w9C7ZTe6nAHek+23q0eym+SKxsAtAbOK3pGrqPIt8Q9r kF+UyAkK/wL/+al5i0GFOGrxoxiSA3X+S8PX4WScRGFbE76/sYCd+PRvhSO/QYHyQOMt stbw== 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=FZMFftNpugF2TeTXsuDUg96zEbOf7aTMUaiFvRfI18U=; b=GkXkkwDKHArJXhgzztW6fwDV8RXGHjirgJPnylb8MWe4kTykeP0utfnAFundN4uoHs ys1t5vLdUAyYPfAkrGF1/P44mDbG44y/95NOs85rrpvZFubza4/6x9IxdrD3TNuDqeTt 2yPXRGut1MZW9aIXsc6elDaez4mIAhg1SCvxJdOpxlY643jd0G2D/Iv4Hjd5sn/NxYRF rgDICCMJOcp+Oc121G4wwMQep3PYTQbGNYS1Dly4EZG9NOox2UtDYTgOzchv+BOsUVVx BNyh8oRefBWFfYXSeHlnrAWcPwSqmCXRWhzalcVs1xu1IqBRKHe7TH4qiokLNLhUtS2o MxRQ== X-Gm-Message-State: AIkVDXL0v9PXmPe0N3Ftn/bJ5BhNWh3EIp3AZlztS3BAdIqXdisQ5OfoVT6QIVm7TjTpbg== X-Received: by 10.223.136.50 with SMTP id d47mr15210840wrd.167.1484627717232; Mon, 16 Jan 2017 20:35:17 -0800 (PST) Received: from amir-VirtualBox.Home (bzq-79-176-143-83.red.bezeqint.net. [79.176.143.83]) by smtp.gmail.com with ESMTPSA id y97sm33790069wmh.24.2017.01.16.20.35.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 16 Jan 2017 20:35:16 -0800 (PST) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v4 3/6] ovl: rearrange code in ovl_copy_up_locked() Date: Tue, 17 Jan 2017 06:34:54 +0200 Message-Id: <1484627697-17262-4-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484627697-17262-1-git-send-email-amir73il@gmail.com> References: <1484627697-17262-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 As preparation to implementing copy up with O_TMPFILE, name the variable for dentry before final rename 'temp' and assign it to 'newdentry' only after rename. Also lookup upper dentry before looking up temp dentry and move ovl_set_timestamps() into ovl_copy_up_locked(), because that is going to be more convenient for upcoming change. Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index f57043d..01e3327 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -232,12 +232,14 @@ int ovl_set_attr(struct dentry *upperdentry, struct kstat *stat) static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, struct dentry *dentry, struct path *lowerpath, - struct kstat *stat, const char *link) + struct kstat *stat, const char *link, + struct kstat *pstat) { struct inode *wdir = workdir->d_inode; struct inode *udir = upperdir->d_inode; struct dentry *newdentry = NULL; struct dentry *upper = NULL; + struct dentry *temp = NULL; int err; const struct cred *old_creds = NULL; struct cred *new_creds = NULL; @@ -248,25 +250,25 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, .link = link }; - newdentry = ovl_lookup_temp(workdir, dentry); - err = PTR_ERR(newdentry); - if (IS_ERR(newdentry)) - goto out; - upper = lookup_one_len(dentry->d_name.name, upperdir, dentry->d_name.len); err = PTR_ERR(upper); if (IS_ERR(upper)) - goto out1; + goto out; err = security_inode_copy_up(dentry, &new_creds); if (err < 0) - goto out2; + goto out1; if (new_creds) old_creds = override_creds(new_creds); - err = ovl_create_real(wdir, newdentry, &cattr, NULL, true); + temp = ovl_lookup_temp(workdir, dentry); + err = PTR_ERR(temp); + if (IS_ERR(temp)) + goto out1; + + err = ovl_create_real(wdir, temp, &cattr, NULL, true); if (new_creds) { revert_creds(old_creds); @@ -281,39 +283,42 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, ovl_path_upper(dentry, &upperpath); BUG_ON(upperpath.dentry != NULL); - upperpath.dentry = newdentry; + upperpath.dentry = temp; err = ovl_copy_up_data(lowerpath, &upperpath, stat->size); if (err) goto out_cleanup; } - err = ovl_copy_xattr(lowerpath->dentry, newdentry); + err = ovl_copy_xattr(lowerpath->dentry, temp); if (err) goto out_cleanup; - inode_lock(newdentry->d_inode); - err = ovl_set_attr(newdentry, stat); - inode_unlock(newdentry->d_inode); + inode_lock(temp->d_inode); + err = ovl_set_attr(temp, stat); + inode_unlock(temp->d_inode); if (err) goto out_cleanup; - err = ovl_do_rename(wdir, newdentry, udir, upper, 0); + err = ovl_do_rename(wdir, temp, udir, upper, 0); if (err) goto out_cleanup; + newdentry = dget(temp); ovl_dentry_update(dentry, newdentry); ovl_inode_update(d_inode(dentry), d_inode(newdentry)); - newdentry = NULL; + + /* Restore timestamps on parent (best effort) */ + ovl_set_timestamps(upperdir, pstat); out2: - dput(upper); + dput(temp); out1: - dput(newdentry); + dput(upper); out: return err; out_cleanup: - ovl_cleanup(wdir, newdentry); + ovl_cleanup(wdir, temp); goto out2; } @@ -368,11 +373,7 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, } err = ovl_copy_up_locked(workdir, upperdir, dentry, lowerpath, - stat, link); - if (!err) { - /* Restore timestamps on parent (best effort) */ - ovl_set_timestamps(upperdir, &pstat); - } + stat, link, &pstat); out_unlock: unlock_rename(workdir, upperdir); do_delayed_call(&done);