oe->opaque = upperopaque;
        oe->impure = upperimpure;
-       oe->redirect = upperredirect;
        memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr);
        dentry->d_fsdata = oe;
 
                inode = ovl_get_inode(dentry, upperdentry);
                if (!inode)
                        goto out_free_oe;
+
+               OVL_I(inode)->redirect = upperredirect;
        }
 
        revert_creds(old_cred);
 
        union {
                struct {
                        u64 version;
-                       const char *redirect;
                        bool opaque;
                        bool impure;
                        bool copying;
 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;
 
        if (oe) {
                unsigned int i;
 
-               kfree(oe->redirect);
                for (i = 0; i < oe->numlower; i++)
                        dput(oe->lowerstack[i].dentry);
                kfree_rcu(oe, rcu);
 {
        struct ovl_inode *oi = kmem_cache_alloc(ovl_inode_cachep, GFP_KERNEL);
 
+       oi->redirect = NULL;
        oi->__upperdentry = NULL;
        oi->lower = NULL;
 
        struct ovl_inode *oi = OVL_I(inode);
 
        dput(oi->__upperdentry);
+       kfree(oi->redirect);
 
        call_rcu(&inode->i_rcu, ovl_i_callback);
 }
 
 
 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,