From patchwork Wed Jun 7 07:51:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9770827 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 E812B60364 for ; Wed, 7 Jun 2017 07:51:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D1C9228526 for ; Wed, 7 Jun 2017 07:51:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C687F2852C; Wed, 7 Jun 2017 07:51:50 +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 F014128528 for ; Wed, 7 Jun 2017 07:51:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751538AbdFGHvq (ORCPT ); Wed, 7 Jun 2017 03:51:46 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36050 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751498AbdFGHve (ORCPT ); Wed, 7 Jun 2017 03:51:34 -0400 Received: by mail-wm0-f66.google.com with SMTP id k15so1222451wmh.3; Wed, 07 Jun 2017 00:51:33 -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=cESt0nL8RODH+inZo2WBSUF9SjP9Bq46uN+t1CIdR90=; b=SFEgjflQXxw4Ve0YevMXigiWMIyRU5JKRRYTeORgUM1JgZj65aF4rwBiJ7KRmFAT4A RJQVDW3hiDlN8ej1HgYzTcQBIZP7kNhmjrdDz+WISzvApfI2l2RM14MFDdr6sonrrqOp FbH1mHjbEypym2Bt6viA9OLJxcznUSrWvn8ClvwosCrbChgOlozD7tfbSQoidS5Yk0GW TH8jFH0PrANeK74g2qEUx7SakKyarcr58nbF1o2lsb2pURpvMhn/8MoF0himdDd5BTll qpgPTNNz0J+Cyb4uGxYUl+PTnRrTCfTcvFYAhmkidleV0m/4TYu6cwgzJGmkPeYFctvw 6IOg== 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=cESt0nL8RODH+inZo2WBSUF9SjP9Bq46uN+t1CIdR90=; b=rI3YLwDQpjcrceMQ8fOE/QoCpMPeh7/OCA4bN1GTyt2V0HW8bimbt2JNZr1ppZ238/ jZ1PH/qrVbKKOa7mjAiyrMRE/tb9bZ21CqEm/TeudYRsYs4mXDxOlasF3M9oVdUIyzUe YENco6Pn2kAy+dKy4I5abGPajd1DHwOvjPo0+PJ28g7uKYzLB6MiytUiAwxWl5Dc9BmH 7XXpDLKIUKuOZzhzge+qdYznKx/Lcxqj4HCqHvZRrY3NCNkb54RYQDMFfkI2ae2lRYaF fBM0/hF8VdGHgHjirpUTR8Zr/e20gZ8MV5XMXqW+frQmu5tUhezJfW30znm6AsNnGSDF Tpew== X-Gm-Message-State: AODbwcBXImtXumkZ7KeDDgCKcUbC7IZX3W4R8IC7+Nb64NL578s6cmJh 4WQRpQeHspjBMGNn X-Received: by 10.28.212.14 with SMTP id l14mr517576wmg.20.1496821892477; Wed, 07 Jun 2017 00:51:32 -0700 (PDT) Received: from amir-VirtualBox.lan (bzq-79-179-137-123.red.bezeqint.net. [79.179.137.123]) by smtp.gmail.com with ESMTPSA id 91sm307202wrn.24.2017.06.07.00.51.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Jun 2017 00:51:31 -0700 (PDT) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 14/20] ovl: defer upper dir lock to tempfile link Date: Wed, 7 Jun 2017 10:51:18 +0300 Message-Id: <1496821884-5178-15-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496821884-5178-1-git-send-email-amir73il@gmail.com> References: <1496821884-5178-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 On copy up of regular file using an O_TMPFILE, lock upper dir only before linking the tempfile in place. Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 35 ++++++++++++++++++----------------- fs/overlayfs/util.c | 3 ++- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index ae18824c7944..f6570bc127e7 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -336,8 +336,13 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, .link = link }; - upper = lookup_one_len(dentry->d_name.name, upperdir, - dentry->d_name.len); + if (tmpfile) { + upper = lookup_one_len_unlocked(dentry->d_name.name, upperdir, + dentry->d_name.len); + } else { + upper = lookup_one_len(dentry->d_name.name, upperdir, + dentry->d_name.len); + } err = PTR_ERR(upper); if (IS_ERR(upper)) goto out; @@ -377,16 +382,7 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, BUG_ON(upperpath.dentry != NULL); upperpath.dentry = temp; - if (tmpfile) { - inode_unlock(udir); - err = ovl_copy_up_data(lowerpath, &upperpath, - stat->size); - inode_lock_nested(udir, I_MUTEX_PARENT); - } else { - err = ovl_copy_up_data(lowerpath, &upperpath, - stat->size); - } - + err = ovl_copy_up_data(lowerpath, &upperpath, stat->size); if (err) goto out_cleanup; } @@ -409,10 +405,16 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, if (err) goto out_cleanup; - if (tmpfile) + if (tmpfile) { + inode_lock_nested(udir, I_MUTEX_PARENT); err = ovl_do_link(temp, udir, upper, true); - else + if (!err) + ovl_set_timestamps(upperdir, pstat); + pstat = NULL; + inode_unlock(udir); + } else { err = ovl_do_rename(wdir, temp, udir, upper, 0); + } if (err) goto out_cleanup; @@ -425,7 +427,8 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, } /* Restore timestamps on parent (best effort) */ - ovl_set_timestamps(upperdir, pstat); + if (pstat) + ovl_set_timestamps(upperdir, pstat); out2: dput(temp); out1: @@ -496,10 +499,8 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, goto out_done; } - inode_lock_nested(upperdir->d_inode, I_MUTEX_PARENT); err = ovl_copy_up_locked(workdir, upperdir, dentry, lowerpath, stat, link, &pstat, true); - inode_unlock(upperdir->d_inode); ovl_copy_up_end(dentry); goto out_done; } diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index c42eb2eb9313..a28bf55a0d48 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -246,7 +246,8 @@ void ovl_dentry_update(struct dentry *dentry, struct dentry *upperdentry) { struct ovl_entry *oe = dentry->d_fsdata; - WARN_ON(!inode_is_locked(upperdentry->d_parent->d_inode)); + WARN_ON(!inode_is_locked(upperdentry->d_parent->d_inode) && + !oe->copying); WARN_ON(oe->__upperdentry); /* * Make sure upperdentry is consistent before making it visible to