From patchwork Sun Jan 15 13:57:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9517427 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 E6111601DA for ; Sun, 15 Jan 2017 13:58:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D5E922793B for ; Sun, 15 Jan 2017 13:58:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CAD2E282E2; Sun, 15 Jan 2017 13:58:05 +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 7BA1C2793B for ; Sun, 15 Jan 2017 13:58:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751160AbdAON6E (ORCPT ); Sun, 15 Jan 2017 08:58:04 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:35822 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751129AbdAON6C (ORCPT ); Sun, 15 Jan 2017 08:58:02 -0500 Received: by mail-wm0-f66.google.com with SMTP id d140so7734535wmd.2; Sun, 15 Jan 2017 05:58:01 -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=FJDvIa6h7QyyGbQuPYINw73g/nsOTZC5RNyTLi2gBuI=; b=g+u+6zNfCQI0trA57eXiT7OBUGSVy6cMou5UnO566ezy71dGKYMy/srn6V/6aGDvbq cKl4xWKFWUkBSjxqDSJ/ibtPfuTcxXkL80AETupcbP7JdpS9mBe5ih9ssWQlHq44Yxub 9eT5zrsgHOHnwM2KwaXGPDsN6PvylEAxh5ROgM1agUuhR1AfIanyFJsHl3t9XTdm1lfi eaFvkCTTU99ne05G3bdt3v/owEQvQlXoKgZSVLQxX8SqnX7Y93HJr8v8W1p41Y0V8Ueq UDXyZ9k7omUAMAC1NJaOlxdpWAWQKTz3kVV4SUtqrMdhmlCFQ0QLUqU/n3NlhsHTTJji cClw== 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=FJDvIa6h7QyyGbQuPYINw73g/nsOTZC5RNyTLi2gBuI=; b=cFbVne5Ntwu86BpCaOfOydi0Das3+moW/pA5dWnRVyL5QwEWYLEH2E5vFYTKzCTsTS 7hDaoAR2At9m+sTZLe2j2wn9ZmghqLHJLTl6+bd7XZd+RwZCbSaSrOn9TVFX19hGsp81 miXJxA8GaPJyplrRrBmXnvx9qgJleP+z28Lcay7jst2gCFFuUbD7tKiCfxofn/rCkbVc x6PUDa6DJqRWaDKxPIEIOHRHp69DnE0uru31rcGu+PhnFss35a+A+207EEYcwCKOd0OC zxVLHDShWs/SGxm5srXBTmPthyBUqvqpT2BVzWlM1z0UTeHXA8yvAlSxokJNNjEtKl1j XDPg== X-Gm-Message-State: AIkVDXJmj/Cr6wwd8BzfnOpBILQIZvOwgjQuoZzB/84KZBIZCQxiiOA4XISwrMqqH9vB1w== X-Received: by 10.28.170.202 with SMTP id t193mr8352295wme.10.1484488681006; Sun, 15 Jan 2017 05:58:01 -0800 (PST) Received: from amir-VirtualBox.ctera.local (bzq-82-81-193-202.cablep.bezeqint.net. [82.81.193.202]) by smtp.gmail.com with ESMTPSA id v143sm6987295wmv.4.2017.01.15.05.57.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 15 Jan 2017 05:58:00 -0800 (PST) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 6/6] ovl: concurrent copy up of regular files Date: Sun, 15 Jan 2017 15:57:32 +0200 Message-Id: <1484488652-611-7-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484488652-611-1-git-send-email-amir73il@gmail.com> References: <1484488652-611-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 Now that copy up of regular file is done using O_TMPFILE, we don't need to hold rename_lock throughout copy up. Use the copy up waitqueue to synchronize concurrent copy up of the same file. Different regular files can be copied up concurrently. The upper dir inode_lock is taken instead of rename_lock, because it is needed for lookup and later for linking the temp file, but it is released while copying up data. Suggested-by: Al Viro Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index d3b6c15..ddf5e2d 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -291,7 +291,14 @@ 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); + + if (tmpfile) + inode_lock_nested(udir, I_MUTEX_PARENT); + if (err) goto out_cleanup; } @@ -371,6 +378,19 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, return PTR_ERR(link); } + if (tmpfile) { + err = ovl_copy_up_start(dentry); + /* err < 0: interrupted, err > 0: raced with another copy-up */ + if (unlikely(err)) { + pr_debug("ovl_copy_up_start(%pd2) = %i\n", dentry, err); + if (err > 0) + err = 0; + goto out_done; + } + /* lock_rename/unlock_rename will lock/unlock only upperdir */ + workdir = upperdir; + } + err = -EIO; if (lock_rename(workdir, upperdir) != NULL) { pr_err("overlayfs: failed to lock workdir+upperdir\n"); @@ -390,6 +410,9 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, } out_unlock: unlock_rename(workdir, upperdir); + if (tmpfile) + ovl_copy_up_end(dentry); +out_done: do_delayed_call(&done); return err;