From patchwork Tue Jan 17 04:34:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9519911 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 351366043D for ; Tue, 17 Jan 2017 04:36:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 29696283B4 for ; Tue, 17 Jan 2017 04:36:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1E92228428; Tue, 17 Jan 2017 04:36:31 +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 96A2C2840B for ; Tue, 17 Jan 2017 04:36:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751171AbdAQEg2 (ORCPT ); Mon, 16 Jan 2017 23:36:28 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:35189 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751146AbdAQEg0 (ORCPT ); Mon, 16 Jan 2017 23:36:26 -0500 Received: by mail-wm0-f65.google.com with SMTP id d140so19117576wmd.2; Mon, 16 Jan 2017 20:35:20 -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=zGKi9KtEuneh/e9PhQ0jMNmR4ltCDlm/wWjB67PGDIs=; b=j9huwR4Z5Lfrc+KHm+dIn9FRScbKqDwZwtUKMWpbo3bkhjLvdOUgF9xJBzjQCWIhWn sTBEHjNhAnD0CHNabYSpf12gJ5MUD2DrsLZwiOQYqlRk58yLc3R6ZXxq0tkNMwmax/cQ gRBVbYpQpwgMZfzN0MxgTshE+RLh6fz2oB+46/4l+K+R4c4e7RFT5utVdXZmzIrGG7xx VDSlWu85mynjFo6RyaPxB9zbhWkGPZSQj5bRNaUXz0rQmrVAo0O2YB8mgDu+e2GrPuTj NC0BmUK0KhFffDDPtP27T2IXmLd+pb3O+KezYyYQRzvVzX2B+S2A7llQyWKyd6WurcWX aG0Q== 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=zGKi9KtEuneh/e9PhQ0jMNmR4ltCDlm/wWjB67PGDIs=; b=VAK5llcs6iGV9eVAYzNGPqjQ98ahh3oLex/aYFYXCEBQVC7uIwirgIr5xpROdjdAC2 A/uU0WJN8ddejGgZmrEaqQeLD2UsTKEe9N6Yo42GCAAVrupi9eVhOxzsXNOSP0+nh4QO V083HgrwCa+Ys4GkBTDesFQXxAXTasRdv+aIrcWHGo7eRwR3+PqfJa1vItjFMaqj3mgL vOqqADm0cntxFcHYtgJVGkGW4dEMP0aW5gwjOfv9yw+Uq9KvttA0/D+d3G7DYg2J0P36 y4VefrG8mCABPk/3k7QlT87prH7zzzDemOCoW80phA/UUHYvgloXbOCEhJUfWPuRyVTo 3NQg== X-Gm-Message-State: AIkVDXKJdZMtiB6LO5vjvAnxKwAvI5nCxRCKj0PsroAzutzq0T2VCm/K9UjnVBPxNF3W4A== X-Received: by 10.28.139.74 with SMTP id n71mr15496836wmd.139.1484627719276; Mon, 16 Jan 2017 20:35:19 -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.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 16 Jan 2017 20:35:18 -0800 (PST) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v4 4/6] ovl: copy up regular file using O_TMPFILE Date: Tue, 17 Jan 2017 06:34:55 +0200 Message-Id: <1484627697-17262-5-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 In preparation for concurrent copy up, implement copy up of regular file as O_TMPFILE that is linked to upperdir instead of a file in workdir that is moved to upperdir. Suggested-by: Al Viro Signed-off-by: Amir Goldstein --- fs/overlayfs/copy_up.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index 01e3327..6e39e90 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -20,6 +20,7 @@ #include #include #include "overlayfs.h" +#include "ovl_entry.h" #define OVL_COPY_UP_CHUNK_SIZE (1 << 20) @@ -233,7 +234,7 @@ 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 *pstat) + struct kstat *pstat, bool tmpfile) { struct inode *wdir = workdir->d_inode; struct inode *udir = upperdir->d_inode; @@ -263,12 +264,17 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, if (new_creds) old_creds = override_creds(new_creds); - temp = ovl_lookup_temp(workdir, dentry); + if (tmpfile) + temp = ovl_do_tmpfile(upperdir, stat->mode); + else + 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); + err = 0; + if (!tmpfile) + err = ovl_create_real(wdir, temp, &cattr, NULL, true); if (new_creds) { revert_creds(old_creds); @@ -300,11 +306,14 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, if (err) goto out_cleanup; - err = ovl_do_rename(wdir, temp, udir, upper, 0); + if (tmpfile) + err = ovl_do_link(temp, udir, upper, true); + else + err = ovl_do_rename(wdir, temp, udir, upper, 0); if (err) goto out_cleanup; - newdentry = dget(temp); + newdentry = dget(tmpfile ? upper : temp); ovl_dentry_update(dentry, newdentry); ovl_inode_update(d_inode(dentry), d_inode(newdentry)); @@ -318,7 +327,8 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, return err; out_cleanup: - ovl_cleanup(wdir, temp); + if (!tmpfile) + ovl_cleanup(wdir, temp); goto out2; } @@ -342,6 +352,9 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, struct dentry *lowerdentry = lowerpath->dentry; struct dentry *upperdir; const char *link = NULL; + struct ovl_fs *ofs = dentry->d_sb->s_fs_info; + /* Should we copyup with O_TMPFILE or with workdir? */ + bool tmpfile = S_ISREG(stat->mode) && ofs->tmpfile; if (WARN_ON(!workdir)) return -EROFS; @@ -373,7 +386,7 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, } err = ovl_copy_up_locked(workdir, upperdir, dentry, lowerpath, - stat, link, &pstat); + stat, link, &pstat, tmpfile); out_unlock: unlock_rename(workdir, upperdir); do_delayed_call(&done);