diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index 1f873e2e8a79389651791e0b0dde5171c27abe39..1b6092b80330c369f4d3a5387661b78b97fce4fa 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -435,7 +435,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
 
 	oe->opaque = upperopaque;
 	oe->impure = upperimpure;
-	oe->redirect = upperredirect;
 	memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr);
 	dentry->d_fsdata = oe;
 
@@ -444,6 +443,8 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
 		inode = ovl_get_inode(dentry, upperdentry);
 		if (!inode)
 			goto out_free_oe;
+
+		OVL_I(inode)->redirect = upperredirect;
 	}
 
 	revert_creds(old_cred);
diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h
index ddd937490f0dcbf89274a57bc8d4cfd30ef38a7d..477d21738656fd26015d7bee8354add4092cd912 100644
--- a/fs/overlayfs/ovl_entry.h
+++ b/fs/overlayfs/ovl_entry.h
@@ -40,7 +40,6 @@ struct ovl_entry {
 	union {
 		struct {
 			u64 version;
-			const char *redirect;
 			bool opaque;
 			bool impure;
 			bool copying;
@@ -54,6 +53,7 @@ struct ovl_entry {
 struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
 
 struct ovl_inode {
+	const char *redirect;
 	struct inode vfs_inode;
 	struct dentry *__upperdentry;
 	struct inode *lower;
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 1b865716110a18b7dd8b94789e81197c9f49d88a..7346518846c5a55e3875a3567201ca9bba86ea6a 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -41,7 +41,6 @@ static void ovl_dentry_release(struct dentry *dentry)
 	if (oe) {
 		unsigned int i;
 
-		kfree(oe->redirect);
 		for (i = 0; i < oe->numlower; i++)
 			dput(oe->lowerstack[i].dentry);
 		kfree_rcu(oe, rcu);
@@ -170,6 +169,7 @@ static struct inode *ovl_alloc_inode(struct super_block *sb)
 {
 	struct ovl_inode *oi = kmem_cache_alloc(ovl_inode_cachep, GFP_KERNEL);
 
+	oi->redirect = NULL;
 	oi->__upperdentry = NULL;
 	oi->lower = NULL;
 
@@ -188,6 +188,7 @@ static void ovl_destroy_inode(struct inode *inode)
 	struct ovl_inode *oi = OVL_I(inode);
 
 	dput(oi->__upperdentry);
+	kfree(oi->redirect);
 
 	call_rcu(&inode->i_rcu, ovl_i_callback);
 }
diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
index e5d9e8daa55cb378c6da5bc7658dd584b157b887..be0670f1addfc32c6f22989fc8966b6e63e96826 100644
--- a/fs/overlayfs/util.c
+++ b/fs/overlayfs/util.c
@@ -206,17 +206,15 @@ bool ovl_redirect_dir(struct super_block *sb)
 
 const char *ovl_dentry_get_redirect(struct dentry *dentry)
 {
-	struct ovl_entry *oe = dentry->d_fsdata;
-
-	return oe->redirect;
+	return OVL_I(d_inode(dentry))->redirect;
 }
 
 void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect)
 {
-	struct ovl_entry *oe = dentry->d_fsdata;
+	struct ovl_inode *oi = OVL_I(d_inode(dentry));
 
-	kfree(oe->redirect);
-	oe->redirect = redirect;
+	kfree(oi->redirect);
+	oi->redirect = redirect;
 }
 
 void ovl_inode_init(struct inode *inode, struct dentry *upperdentry,