On Sat, 2021-06-12 at 08:43 +0800, Ian Kent wrote: > 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. But if I change to take the read lock to ensure there's no operation in progress for the revision check I would need the dget_parent(), yes? > > > > > > + /* 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; > > > + } >