Commit 972d0093 authored by Amir Goldstein's avatar Amir Goldstein Committed by Miklos Szeredi

ovl: force r/o mount when index dir creation fails

When work dir creation fails, a warning is emitted and overlay is
mounted r/o. Trying to remount r/w will fail with no work dir.

When index dir creation fails, the same warning is emitted and overlay
is mounted r/o, but trying to remount r/w will succeed. This may cause
unintentional corruption of filesystem consistency.

Adjust the behavior of index dir creation failure to that of work dir
creation failure and do not allow to remount r/w. User needs to state
an explicitly intention to work without an index by mounting with
option 'index=off' to allow r/w mount with no index dir.

When mounting with option 'index=on' and no 'upperdir', index is
implicitly disabled, so do not warn about no file handle support.

The issue was introduced with inodes index feature in v4.13, but this
patch will not apply cleanly before ovl_fill_super() re-factoring in
v4.15.

Fixes: 02bcd157 ("ovl: introduce the inodes index dir feature")
Cc: <stable@vger.kernel.org> #v4.13
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent a683737b
...@@ -699,7 +699,8 @@ static int ovl_lower_dir(const char *name, struct path *path, ...@@ -699,7 +699,8 @@ static int ovl_lower_dir(const char *name, struct path *path,
* The inodes index feature needs to encode and decode file * The inodes index feature needs to encode and decode file
* handles, so it requires that all layers support them. * handles, so it requires that all layers support them.
*/ */
if (ofs->config.index && !ovl_can_decode_fh(path->dentry->d_sb)) { if (ofs->config.index && ofs->config.upperdir &&
!ovl_can_decode_fh(path->dentry->d_sb)) {
ofs->config.index = false; ofs->config.index = false;
pr_warn("overlayfs: fs on '%s' does not support file handles, falling back to index=off.\n", name); pr_warn("overlayfs: fs on '%s' does not support file handles, falling back to index=off.\n", name);
} }
...@@ -1268,11 +1269,16 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) ...@@ -1268,11 +1269,16 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
if (err) if (err)
goto out_free_oe; goto out_free_oe;
if (!ofs->indexdir) /* Force r/o mount with no index dir */
if (!ofs->indexdir) {
dput(ofs->workdir);
ofs->workdir = NULL;
sb->s_flags |= SB_RDONLY; sb->s_flags |= SB_RDONLY;
} }
/* Show index=off/on in /proc/mounts for any of the reasons above */ }
/* Show index=off in /proc/mounts for forced r/o mount */
if (!ofs->indexdir) if (!ofs->indexdir)
ofs->config.index = false; ofs->config.index = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment