From patchwork Wed Jun 7 07:51:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9770803 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 F0DF260364 for ; Wed, 7 Jun 2017 07:51:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DB49A2848D for ; Wed, 7 Jun 2017 07:51:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D01C728528; Wed, 7 Jun 2017 07:51:22 +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 6E4B82848D for ; Wed, 7 Jun 2017 07:51:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751444AbdFGHvU (ORCPT ); Wed, 7 Jun 2017 03:51:20 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:34523 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751203AbdFGHvR (ORCPT ); Wed, 7 Jun 2017 03:51:17 -0400 Received: by mail-wm0-f68.google.com with SMTP id 70so1225690wme.1; Wed, 07 Jun 2017 00:51:16 -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=eBWWlAW2Q4VxI/T4WwZLjEDonzNCzloH6wl7JHheUS8=; b=aAoXLeBWetYaEexsAAMWNXKERUY5nXMj97sZDK4bJbGKopAzk0PxYohi379mloyDOe ixuHSApgReqEnyWhVvUgHL2ZpY0eUnsyl7UpKwQwO83LRwtlhXPhFgIa3DqSpNrq6tbe EGpYoLKYFbGQ9UhRFqrerZm3qE+uVr/euslxwyYftX25Na9HqELlhUrRschqbJc/HCp+ hBolrIeRjnLd1Ck2QQNDtGVIMuElGU6lfqauEAIjGBRFQRMhl6ObqCe/IX3t6ugpg2e+ mqNdGdrtDxsKqI/GT/65vPSs1jmWOZ0ikJ09zY6Y24XMzN7ZRW30oZIuyY0ozqfBCZc+ yATQ== 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=eBWWlAW2Q4VxI/T4WwZLjEDonzNCzloH6wl7JHheUS8=; b=Cz8c0XrQIeY5TRX6EiiLsVKlyw2qB3a/lcQ4LPpoq/BKDDGLItKz7E1YxfjAE53vYh EDgzp2XWwRD5dWzswABRWB4ySgRJugGgusrbMflRlSC1wjGy2QYlQIYVX74sgMYW7FxW iULoyf+mzme/cndbRzny4Av1X/2jV2+/LvpSbLa5qPlAC/Xaqgs8pkkyRud/7FS861tt jO++8zoHDaJ38a8AsIA+t8RF1XKADEuDhmRuq7r9Y9eSl7AEjr/Hb+o08iPtYvc/z0gV 8TkaFTpkzqIKANCrFo+g3p2wDe6uDNWZqoxqCBbkKv2uG1IqzZuhpwWzZHc8UUj/pjjt fIyA== X-Gm-Message-State: AODbwcDpMfLWUXyesf5Kb+dPWiroPhJ3l0XCMQOF9St+fk9tNDg8hnyV z1aZaTIU6/uonQ== X-Received: by 10.28.178.9 with SMTP id b9mr1055031wmf.110.1496821875826; Wed, 07 Jun 2017 00:51:15 -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.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Jun 2017 00:51:15 -0700 (PDT) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 04/20] ovl: generalize ovl_create_workdir() Date: Wed, 7 Jun 2017 10:51:08 +0300 Message-Id: <1496821884-5178-5-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 Pass in the subdir name to create and specify if subdir is persistent or if it should be cleaned up on every mount. Move fallback to readonly mount on failure to create dir and print of error message into the helper. This function is going to be used for creating the persistent 'index' dir under workbasedir. Signed-off-by: Amir Goldstein --- fs/overlayfs/super.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 476f021baf2a..5114627799e9 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -395,22 +395,25 @@ static int ovl_parse_opt(char *opt, struct ovl_config *config) #define OVL_WORKDIR_NAME "work" -static struct dentry *ovl_workdir_create(struct vfsmount *mnt, - struct dentry *dentry) +static struct dentry *ovl_workdir_create(struct super_block *sb, + struct ovl_fs *ufs, + struct dentry *dentry, + const char *name, bool persist) { - struct inode *dir = dentry->d_inode; - struct dentry *work; + struct vfsmount *mnt = ufs->upper_mnt; + struct inode *dir = NULL; + struct dentry *work = NULL; int err; bool retried = false; err = mnt_want_write(mnt); if (err) - return ERR_PTR(err); + goto out_err; + dir = d_inode(dentry); inode_lock_nested(dir, I_MUTEX_PARENT); retry: - work = lookup_one_len(OVL_WORKDIR_NAME, dentry, - strlen(OVL_WORKDIR_NAME)); + work = lookup_one_len(name, dentry, strlen(name)); if (!IS_ERR(work)) { struct iattr attr = { @@ -423,6 +426,9 @@ static struct dentry *ovl_workdir_create(struct vfsmount *mnt, if (retried) goto out_dput; + if (persist) + goto out_unlock; + retried = true; ovl_workdir_cleanup(dir, mnt, work, 0); dput(work); @@ -462,16 +468,25 @@ static struct dentry *ovl_workdir_create(struct vfsmount *mnt, inode_unlock(work->d_inode); if (err) goto out_dput; + } else { + err = PTR_ERR(work); + goto out_err; } + out_unlock: - inode_unlock(dir); + if (dir) + inode_unlock(dir); mnt_drop_write(mnt); return work; out_dput: dput(work); - work = ERR_PTR(err); +out_err: + pr_warn("overlayfs: failed to create directory %s/%s (errno: %i); mounting read-only\n", + ufs->config.workdir, name, -err); + sb->s_flags |= MS_RDONLY; + work = NULL; goto out_unlock; } @@ -885,14 +900,11 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) sb->s_time_gran = ufs->upper_mnt->mnt_sb->s_time_gran; - ufs->workdir = ovl_workdir_create(ufs->upper_mnt, workpath.dentry); + ufs->workdir = ovl_workdir_create(sb, ufs, workpath.dentry, + OVL_WORKDIR_NAME, false); err = PTR_ERR(ufs->workdir); - if (IS_ERR(ufs->workdir)) { - pr_warn("overlayfs: failed to create directory %s/%s (errno: %i); mounting read-only\n", - ufs->config.workdir, OVL_WORKDIR_NAME, -err); - sb->s_flags |= MS_RDONLY; - ufs->workdir = NULL; - } + if (IS_ERR(ufs->workdir)) + goto out_put_upper_mnt; /* * Upper should support d_type, else whiteouts are visible. @@ -1035,6 +1047,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) kfree(ufs->lower_mnt); out_put_workdir: dput(ufs->workdir); +out_put_upper_mnt: mntput(ufs->upper_mnt); out_put_lowerpath: for (i = 0; i < numlower; i++)