summary refs log tree commit diff
path: root/fs/overlayfs/super.c
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@redhat.com>2017-11-09 10:23:28 +0100
committerMiklos Szeredi <mszeredi@redhat.com>2017-11-09 10:23:28 +0100
commit87ad447a9d4f807b5542e6d92c6d740103b82bda (patch)
treebe2d852cdfbc60e1952e8651f57234e3e62c9e5e /fs/overlayfs/super.c
parent6ee8acf0f72b89b3c6d9df9cbe9b815711af3c7b (diff)
downloadlinux-87ad447a9d4f807b5542e6d92c6d740103b82bda.tar.gz
ovl: split out ovl_get_workpath() from ovl_fill_super()
It's okay to get rid of the intermediate error label due to ufs being
zeroed on allocation.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs/super.c')
-rw-r--r--fs/overlayfs/super.c61
1 files changed, 37 insertions, 24 deletions
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index c1abd66527ce..6d02ca31bb90 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -860,6 +860,41 @@ out:
 	return err;
 }
 
+static int ovl_get_workpath(struct ovl_fs *ufs, struct path *upperpath,
+			    struct path *workpath)
+{
+	int err;
+
+	err = ovl_mount_dir(ufs->config.workdir, workpath);
+	if (err)
+		goto out;
+
+	err = -EINVAL;
+	if (upperpath->mnt != workpath->mnt) {
+		pr_err("overlayfs: workdir and upperdir must reside under the same mount\n");
+		goto out;
+	}
+	if (!ovl_workdir_ok(workpath->dentry, upperpath->dentry)) {
+		pr_err("overlayfs: workdir and upperdir must be separate subtrees\n");
+		goto out;
+	}
+
+	err = -EBUSY;
+	if (ovl_inuse_trylock(workpath->dentry)) {
+		ufs->workdir_locked = true;
+	} else if (ufs->config.index) {
+		pr_err("overlayfs: workdir is in-use by another mount, mount with '-o index=off' to override exclusive workdir protection.\n");
+		goto out;
+	} else {
+		pr_warn("overlayfs: workdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n");
+	}
+
+	ufs->workbasedir = workpath->dentry;
+	err = 0;
+out:
+	return err;
+}
+
 static int ovl_fill_super(struct super_block *sb, void *data, int silent)
 {
 	struct path upperpath = { };
@@ -907,31 +942,10 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
 		if (err)
 			goto out_unlock_upperdentry;
 
-		err = ovl_mount_dir(ufs->config.workdir, &workpath);
+		err = ovl_get_workpath(ufs, &upperpath, &workpath);
 		if (err)
-			goto out_unlock_upperdentry;
-
-		err = -EINVAL;
-		if (upperpath.mnt != workpath.mnt) {
-			pr_err("overlayfs: workdir and upperdir must reside under the same mount\n");
-			goto out_put_workpath;
-		}
-		if (!ovl_workdir_ok(workpath.dentry, upperpath.dentry)) {
-			pr_err("overlayfs: workdir and upperdir must be separate subtrees\n");
-			goto out_put_workpath;
-		}
-
-		err = -EBUSY;
-		if (ovl_inuse_trylock(workpath.dentry)) {
-			ufs->workdir_locked = true;
-		} else if (ufs->config.index) {
-			pr_err("overlayfs: workdir is in-use by another mount, mount with '-o index=off' to override exclusive workdir protection.\n");
-			goto out_put_workpath;
-		} else {
-			pr_warn("overlayfs: workdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n");
-		}
+			goto out_unlock_workdentry;
 
-		ufs->workbasedir = workpath.dentry;
 		sb->s_stack_depth = upperpath.mnt->mnt_sb->s_stack_depth;
 	}
 	err = -ENOMEM;
@@ -1203,7 +1217,6 @@ out_free_lowertmp:
 out_unlock_workdentry:
 	if (ufs->workdir_locked)
 		ovl_inuse_unlock(workpath.dentry);
-out_put_workpath:
 	path_put(&workpath);
 out_unlock_upperdentry:
 	if (ufs->upperdir_locked)