diff --git a/fs/namei.c b/fs/namei.c index 62a0db6e6725..16535040af11 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1039,7 +1039,7 @@ const char *get_link(struct nameidata *nd) return ERR_PTR(error); nd->last_type = LAST_BIND; - res = inode->i_link; + res = READ_ONCE(inode->i_link); if (!res) { const char * (*get)(struct dentry *, struct inode *, struct delayed_call *); @@ -4674,9 +4674,11 @@ static int generic_readlink(struct dentry *dentry, char __user *buffer, { DEFINE_DELAYED_CALL(done); struct inode *inode = d_inode(dentry); - const char *link = inode->i_link; + const char *link; int res; + link = READ_ONCE(inode->i_link); + if (!link) { link = inode->i_op->get_link(dentry, inode, &done); if (IS_ERR(link))