public inbox for linux-unionfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: linux-unionfs@vger.kernel.org
Subject: [PATCH 02/17] ovl: generalize ovl_create_workdir()
Date: Fri,  2 Jun 2017 17:04:29 +0300	[thread overview]
Message-ID: <1496412284-4113-3-git-send-email-amir73il@gmail.com> (raw)
In-Reply-To: <1496412284-4113-1-git-send-email-amir73il@gmail.com>

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 <amir73il@gmail.com>
---
 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 3d7b5c9bc042..3cdefd401713 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -450,22 +450,25 @@ static int ovl_verify_set_origin(struct dentry *dir, struct vfsmount *mnt,
 
 #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 = {
@@ -478,6 +481,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);
@@ -517,16 +523,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;
 }
 
@@ -940,14 +955,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.
@@ -1112,6 +1124,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++)
-- 
2.7.4

  parent reply	other threads:[~2017-06-02 14:04 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-02 14:04 [PATCH 00/17] Avoid breaking lower hardlinks on copy up Amir Goldstein
2017-06-02 14:04 ` [PATCH 01/17] vfs: add helper wait_on_inode_inuse() Amir Goldstein
2017-06-02 14:04 ` Amir Goldstein [this message]
2017-06-02 14:04 ` [PATCH 03/17] ovl: introduce the inodes index dir feature Amir Goldstein
2017-06-02 14:04 ` [PATCH 04/17] ovl: verify index dir matches upper dir Amir Goldstein
2017-06-02 14:04 ` [PATCH 05/17] ovl: create helper ovl_lookup_index() Amir Goldstein
2017-06-02 14:04 ` [PATCH 06/17] ovl: move inode helpers to inode.c Amir Goldstein
2017-06-02 14:04 ` [PATCH 07/17] ovl: create helpers for initializing hashed inode Amir Goldstein
2017-06-02 14:04 ` [PATCH 08/17] ovl: use ovl_inode_init() for initializing new inode Amir Goldstein
2017-06-02 14:04 ` [PATCH 09/17] ovl: allow hashing non upper inodes Amir Goldstein
2017-06-02 14:04 ` [PATCH 10/17] ovl: allow hashing inodes by arbitrary key Amir Goldstein
2017-06-02 14:04 ` [PATCH 11/17] ovl: hash overlay non-dir inodes by copy up origin inode Amir Goldstein
2017-06-05 12:42   ` Amir Goldstein
2017-06-02 14:04 ` [PATCH 12/17] ovl: defer upper dir lock to tempfile link Amir Goldstein
2017-06-02 14:04 ` [PATCH 13/17] ovl: factor out ovl_copy_up_inode() helper Amir Goldstein
2017-06-02 14:04 ` [PATCH 14/17] ovl: generalize ovl_copy_up_locked() using actors Amir Goldstein
2017-06-02 14:04 ` [PATCH 15/17] ovl: generalize ovl_copy_up_one() " Amir Goldstein
2017-06-02 14:04 ` [PATCH 16/17] ovl: implement index dir copy up method Amir Goldstein
2017-06-02 14:04 ` [PATCH 17/17] ovl: handle race of concurrent lower hardlinks copy up Amir Goldstein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1496412284-4113-3-git-send-email-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=linux-unionfs@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox