ovl: mount read-only if workdir can't be created

Miklos Szeredi mszeredi at suse.cz
Tue May 19 08:30:12 EDT 2015


From: Miklos Szeredi <mszeredi at suse.cz>

commit cc6f67bcafcb6bbbb2d1be1603dcd95125a52800 upstream.

OpenWRT folks reported that overlayfs fails to mount if upper fs is full,
because workdir can't be created.  Wordir creation can fail for various
other reasons too.

There's no reason that the mount itself should fail, overlayfs can work
fine without a workdir, as long as the overlay isn't modified.

So mount it read-only and don't allow remounting read-write.

Add a couple of WARN_ON()s for the impossible case of workdir being used
despite being read-only.

Reported-by: Bastian Bittorf <bittorf at bluebottle.com>
Signed-off-by: Miklos Szeredi <mszeredi at suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

---
 fs/overlayfs/copy_up.c |    3 +++
 fs/overlayfs/dir.c     |    9 +++++++++
 fs/overlayfs/super.c   |   10 +++++-----
 3 files changed, 17 insertions(+), 5 deletions(-)

--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -299,6 +299,9 @@ int ovl_copy_up_one(struct dentry *paren
 	struct cred *override_cred;
 	char *link =3D NULL;
 =

+	if (WARN_ON(!workdir))
+		return -EROFS;
+
 	ovl_path_upper(parent, &parentpath);
 	upperdir =3D parentpath.dentry;
 =

--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -222,6 +222,9 @@ static struct dentry *ovl_clear_empty(st
 	struct kstat stat;
 	int err;
 =

+	if (WARN_ON(!workdir))
+		return ERR_PTR(-EROFS);
+
 	err =3D ovl_lock_rename_workdir(workdir, upperdir);
 	if (err)
 		goto out;
@@ -322,6 +325,9 @@ static int ovl_create_over_whiteout(stru
 	struct dentry *newdentry;
 	int err;
 =

+	if (WARN_ON(!workdir))
+		return -EROFS;
+
 	err =3D ovl_lock_rename_workdir(workdir, upperdir);
 	if (err)
 		goto out;
@@ -506,6 +512,9 @@ static int ovl_remove_and_whiteout(struc
 	struct dentry *opaquedir =3D NULL;
 	int err;
 =

+	if (WARN_ON(!workdir))
+		return -EROFS;
+
 	if (is_dir) {
 		if (OVL_TYPE_MERGE_OR_LOWER(ovl_path_type(dentry))) {
 			opaquedir =3D ovl_check_empty_and_clear(dentry);
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -529,7 +529,7 @@ static int ovl_remount(struct super_bloc
 {
 	struct ovl_fs *ufs =3D sb->s_fs_info;
 =

-	if (!(*flags & MS_RDONLY) && !ufs->upper_mnt)
+	if (!(*flags & MS_RDONLY) && (!ufs->upper_mnt || !ufs->workdir))
 		return -EROFS;
 =

 	return 0;
@@ -925,9 +925,10 @@ static int ovl_fill_super(struct super_b
 		ufs->workdir =3D ovl_workdir_create(ufs->upper_mnt, workpath.dentry);
 		err =3D PTR_ERR(ufs->workdir);
 		if (IS_ERR(ufs->workdir)) {
-			pr_err("overlayfs: failed to create directory %s/%s\n",
-			       ufs->config.workdir, OVL_WORKDIR_NAME);
-			goto out_put_upper_mnt;
+			pr_warn("overlayfs: failed to create directory %s/%s (errno: %i); mount=
ing read-only\n",
+				ufs->config.workdir, OVL_WORKDIR_NAME, -err);
+			sb->s_flags |=3D MS_RDONLY;
+			ufs->workdir =3D NULL;
 		}
 	}
 =

@@ -997,7 +998,6 @@ out_put_lower_mnt:
 	kfree(ufs->lower_mnt);
 out_put_workdir:
 	dput(ufs->workdir);
-out_put_upper_mnt:
 	mntput(ufs->upper_mnt);
 out_put_lowerpath:
 	for (i =3D 0; i < numlower; i++)


Patches currently in stable-queue which might be from mszeredi at suse.cz are

queue-4.0/ovl-don-t-remove-non-empty-opaque-directory.patch
queue-4.0/ovl-mount-read-only-if-workdir-can-t-be-created.patch

----- End forwarded message -----

mit drahtlosen Gr=FC=DFen,
Bastian Bittorf

-- =

bittorf wireless ))
Verantwortlicher Entwicklung
Telefon: +49 3643 4965 235
Mobil: +49 176 242 234 19

Inhaber: Bastian Bittorf


with wireless greetings,
Bastian Bittorf

-- =

bittorf wireless ))
Head of development
Phone: +49 3643 4965 235

Owner: Bastian Bittorf
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list