On Wed, Jun 09, 2021 at 04:50:27PM +0800, Ian Kent wrote: > + if (d_really_is_negative(dentry)) { > + struct dentry *d_parent = dget_parent(dentry); > + struct kernfs_node *parent; What the hell is dget_parent() for? You don't do anything blocking here, so why not simply grab dentry->d_lock - that'll stabilize the value of ->d_parent just fine. Just don't forget to drop the lock before returning and that's it... > + /* If the kernfs parent node has changed discard and > + * proceed to ->lookup. > + */ > + parent = kernfs_dentry_node(d_parent); > + if (parent) { > + if (kernfs_dir_changed(parent, dentry)) { > + dput(d_parent); > + return 0; > + } > + } > + dput(d_parent); > + > + /* The kernfs node doesn't exist, leave the dentry > + * negative and return success. > + */ > + return 1; > + }