|
@@ -211,9 +211,10 @@ static void ovl_put_super(struct super_block *sb)
|
|
|
|
|
|
dput(ufs->indexdir);
|
|
|
dput(ufs->workdir);
|
|
|
- ovl_inuse_unlock(ufs->workbasedir);
|
|
|
+ if (ufs->workdir_locked)
|
|
|
+ ovl_inuse_unlock(ufs->workbasedir);
|
|
|
dput(ufs->workbasedir);
|
|
|
- if (ufs->upper_mnt)
|
|
|
+ if (ufs->upper_mnt && ufs->upperdir_locked)
|
|
|
ovl_inuse_unlock(ufs->upper_mnt->mnt_root);
|
|
|
mntput(ufs->upper_mnt);
|
|
|
for (i = 0; i < ufs->numlower; i++)
|
|
@@ -881,9 +882,13 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
|
|
|
goto out_put_upperpath;
|
|
|
|
|
|
err = -EBUSY;
|
|
|
- if (!ovl_inuse_trylock(upperpath.dentry)) {
|
|
|
- pr_err("overlayfs: upperdir is in-use by another mount\n");
|
|
|
+ if (ovl_inuse_trylock(upperpath.dentry)) {
|
|
|
+ ufs->upperdir_locked = true;
|
|
|
+ } else if (ufs->config.index) {
|
|
|
+ pr_err("overlayfs: upperdir is in-use by another mount, mount with '-o index=off' to override exclusive upperdir protection.\n");
|
|
|
goto out_put_upperpath;
|
|
|
+ } else {
|
|
|
+ pr_warn("overlayfs: upperdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n");
|
|
|
}
|
|
|
|
|
|
err = ovl_mount_dir(ufs->config.workdir, &workpath);
|
|
@@ -901,9 +906,13 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
|
|
|
}
|
|
|
|
|
|
err = -EBUSY;
|
|
|
- if (!ovl_inuse_trylock(workpath.dentry)) {
|
|
|
- pr_err("overlayfs: workdir is in-use by another mount\n");
|
|
|
+ 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");
|
|
|
}
|
|
|
|
|
|
ufs->workbasedir = workpath.dentry;
|
|
@@ -1156,11 +1165,13 @@ out_put_lowerpath:
|
|
|
out_free_lowertmp:
|
|
|
kfree(lowertmp);
|
|
|
out_unlock_workdentry:
|
|
|
- ovl_inuse_unlock(workpath.dentry);
|
|
|
+ if (ufs->workdir_locked)
|
|
|
+ ovl_inuse_unlock(workpath.dentry);
|
|
|
out_put_workpath:
|
|
|
path_put(&workpath);
|
|
|
out_unlock_upperdentry:
|
|
|
- ovl_inuse_unlock(upperpath.dentry);
|
|
|
+ if (ufs->upperdir_locked)
|
|
|
+ ovl_inuse_unlock(upperpath.dentry);
|
|
|
out_put_upperpath:
|
|
|
path_put(&upperpath);
|
|
|
out_free_config:
|