ovl: split out ovl_get_upper() from ovl_fill_super()

And don't clobber ufs->upper_mnt on error.

Signed-off-by: Miklos Szeredi <[email protected]>
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 6c87031..21f93cd 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -895,6 +895,23 @@ static int ovl_get_workpath(struct ovl_fs *ufs, struct path *upperpath,
 	return err;
 }
 
+static int ovl_get_upper(struct ovl_fs *ufs, struct path *upperpath)
+{
+	struct vfsmount *upper_mnt;
+
+	upper_mnt = clone_private_mount(upperpath);
+	if (IS_ERR(upper_mnt)) {
+		pr_err("overlayfs: failed to clone upperpath\n");
+		return PTR_ERR(upper_mnt);
+	}
+
+	/* Don't inherit atime flags */
+	upper_mnt->mnt_flags &= ~(MNT_NOATIME | MNT_NODIRATIME | MNT_RELATIME);
+	ufs->upper_mnt = upper_mnt;
+
+	return 0;
+}
+
 static int ovl_get_lowerstack(struct super_block *sb, struct ovl_fs *ufs,
 			      struct path **stackp, unsigned int *stacklenp)
 {
@@ -1018,15 +1035,9 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
 		goto out_unlock_workdentry;
 
 	if (ufs->config.upperdir) {
-		ufs->upper_mnt = clone_private_mount(&upperpath);
-		err = PTR_ERR(ufs->upper_mnt);
-		if (IS_ERR(ufs->upper_mnt)) {
-			pr_err("overlayfs: failed to clone upperpath\n");
+		err = ovl_get_upper(ufs, &upperpath);
+		if (err)
 			goto out_put_lowerpath;
-		}
-
-		/* Don't inherit atime flags */
-		ufs->upper_mnt->mnt_flags &= ~(MNT_NOATIME | MNT_NODIRATIME | MNT_RELATIME);
 
 		sb->s_time_gran = ufs->upper_mnt->mnt_sb->s_time_gran;