summaryrefslogtreecommitdiff
path: root/fs/overlayfs/super.c
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@redhat.com>2017-11-10 11:39:15 +0300
committerMiklos Szeredi <mszeredi@redhat.com>2017-11-10 11:39:15 +0300
commitbca44b52f8355b9b391fadfe6e6e8662f23238c2 (patch)
tree7c89d47cd66d3081a4427d3e02946b3343ee331b /fs/overlayfs/super.c
parent5064975e7fecdf9c7fc550ddef345aa50d0b04bb (diff)
downloadlinux-bca44b52f8355b9b391fadfe6e6e8662f23238c2.tar.xz
ovl: clean up workdir creation
Move calling ovl_get_workdir() into ovl_get_workpath(). Rename ovl_get_workdir() to ovl_make_workdir() and ovl_get_workpath() to ovl_get_workdir(). Workpath is now not needed outside ovl_get_workdir(). Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs/super.c')
-rw-r--r--fs/overlayfs/super.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 03202ad7b481..115cbf3303de 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -876,7 +876,7 @@ out:
return err;
}
-static int ovl_get_workdir(struct ovl_fs *ufs, struct path *workpath)
+static int ovl_make_workdir(struct ovl_fs *ufs, struct path *workpath)
{
struct dentry *temp;
int err;
@@ -931,27 +931,27 @@ static int ovl_get_workdir(struct ovl_fs *ufs, struct path *workpath)
return 0;
}
-static int ovl_get_workpath(struct ovl_fs *ufs, struct path *upperpath,
- struct path *workpath)
+static int ovl_get_workdir(struct ovl_fs *ufs, struct path *upperpath)
{
int err;
+ struct path workpath = { };
- err = ovl_mount_dir(ufs->config.workdir, workpath);
+ err = ovl_mount_dir(ufs->config.workdir, &workpath);
if (err)
goto out;
err = -EINVAL;
- if (upperpath->mnt != workpath->mnt) {
+ 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)) {
+ 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)) {
+ 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");
@@ -960,9 +960,15 @@ static int ovl_get_workpath(struct ovl_fs *ufs, struct path *upperpath,
pr_warn("overlayfs: workdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n");
}
- ufs->workbasedir = dget(workpath->dentry);
+ ufs->workbasedir = dget(workpath.dentry);
+ err = ovl_make_workdir(ufs, &workpath);
+ if (err)
+ goto out;
+
err = 0;
out:
+ path_put(&workpath);
+
return err;
}
@@ -1124,7 +1130,6 @@ out_free_stack:
static int ovl_fill_super(struct super_block *sb, void *data, int silent)
{
struct path upperpath = { };
- struct path workpath = { };
struct dentry *root_dentry;
struct ovl_entry *oe = NULL;
struct ovl_fs *ufs;
@@ -1168,11 +1173,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
if (err)
goto out_err;
- err = ovl_get_workpath(ufs, &upperpath, &workpath);
- if (err)
- goto out_err;
-
- err = ovl_get_workdir(ufs, &workpath);
+ err = ovl_get_workdir(ufs, &upperpath);
if (err)
goto out_err;
@@ -1238,7 +1239,6 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
for (i = 0; i < numlower; i++)
mntput(stack[i].mnt);
kfree(stack);
- path_put(&workpath);
if (upperpath.dentry) {
oe->has_upper = true;
@@ -1262,7 +1262,6 @@ out_err:
for (i = 0; i < numlower; i++)
path_put(&stack[i]);
kfree(stack);
- path_put(&workpath);
path_put(&upperpath);
ovl_free_fs(ufs);
out: