ovl: warn if trusted xattr creation fails
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 27 Jul 2022 14:31:30 +0000 (16:31 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 27 Jul 2022 14:31:30 +0000 (16:31 +0200)
When mounting overlayfs in an unprivileged user namespace, trusted xattr
creation will fail.  This will lead to failures in some file operations,
e.g. in the following situation:

  mkdir lower upper work merged
  mkdir lower/directory
  mount -toverlay -olowerdir=lower,upperdir=upper,workdir=work none merged
  rmdir merged/directory
  mkdir merged/directory

The last mkdir will fail:

  mkdir: cannot create directory 'merged/directory': Input/output error

The cause for these failures is currently extremely non-obvious and hard to
debug.  Hence, warn the user and suggest using the userxattr mount option,
if it is not already supplied and xattr creation fails during the
self-check.

Reported-by: Alois Wohlschlager <alois1@gmx-topmail.de>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/super.c

index 1ce5c9698393731229d0a083cc1d7b4bad51c1e5..4c20961302094b68f1956cc4013936ad08e18308 100644 (file)
@@ -1418,11 +1418,12 @@ static int ovl_make_workdir(struct super_block *sb, struct ovl_fs *ofs,
         */
        err = ovl_setxattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE, "0", 1);
        if (err) {
+               pr_warn("failed to set xattr on upper\n");
                ofs->noxattr = true;
                if (ofs->config.index || ofs->config.metacopy) {
                        ofs->config.index = false;
                        ofs->config.metacopy = false;
-                       pr_warn("upper fs does not support xattr, falling back to index=off,metacopy=off.\n");
+                       pr_warn("...falling back to index=off,metacopy=off.\n");
                }
                /*
                 * xattr support is required for persistent st_ino.
@@ -1430,8 +1431,10 @@ static int ovl_make_workdir(struct super_block *sb, struct ovl_fs *ofs,
                 */
                if (ofs->config.xino == OVL_XINO_AUTO) {
                        ofs->config.xino = OVL_XINO_OFF;
-                       pr_warn("upper fs does not support xattr, falling back to xino=off.\n");
+                       pr_warn("...falling back to xino=off.\n");
                }
+               if (err == -EPERM && !ofs->config.userxattr)
+                       pr_info("try mounting with 'userxattr' option\n");
                err = 0;
        } else {
                ovl_removexattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE);