struct path link;
                void *cookie;
                const char *name;
+               struct inode *inode;
        } *stack, internal[EMBEDDED_LEVELS];
 };
 
 static inline void put_link(struct nameidata *nd)
 {
        struct saved *last = nd->stack + --nd->depth;
-       struct inode *inode = last->link.dentry->d_inode;
+       struct inode *inode = last->inode;
        if (last->cookie && inode->i_op->put_link)
                inode->i_op->put_link(last->link.dentry, last->cookie);
        path_put(&last->link);
                return 0;
 
        /* Allowed if owner and follower match. */
-       inode = nd->stack[0].link.dentry->d_inode;
+       inode = nd->stack[0].inode;
        if (uid_eq(current_cred()->fsuid, inode->i_uid))
                return 0;
 
 {
        struct saved *last = nd->stack + nd->depth - 1;
        struct dentry *dentry = last->link.dentry;
-       struct inode *inode = dentry->d_inode;
+       struct inode *inode = last->inode;
        int error;
        const char *res;
 
        last = nd->stack + nd->depth++;
        last->link = *link;
        last->cookie = NULL;
+       last->inode = d_backing_inode(link->dentry);
        return 1;
 }