On Sat, 2021-06-12 at 00:07 +0000, Al Viro wrote: > 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... Thanks Al, I'll change 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; > > + }