@@ -1732,8 +1732,8 @@ static int nfs_lookup_revalidate_dentry(struct inode *dir,
17321732 * cached dentry and do a new lookup.
17331733 */
17341734static int
1735- nfs_do_lookup_revalidate (struct inode * dir , struct dentry * dentry ,
1736- unsigned int flags )
1735+ nfs_do_lookup_revalidate (struct inode * dir , const struct qstr * name ,
1736+ struct dentry * dentry , unsigned int flags )
17371737{
17381738 struct inode * inode ;
17391739 int error = 0 ;
@@ -1785,39 +1785,26 @@ nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
17851785}
17861786
17871787static int
1788- __nfs_lookup_revalidate (struct dentry * dentry , unsigned int flags ,
1789- int (* reval )(struct inode * , struct dentry * , unsigned int ))
1788+ __nfs_lookup_revalidate (struct dentry * dentry , unsigned int flags )
17901789{
1791- struct dentry * parent ;
1792- struct inode * dir ;
1793- int ret ;
1794-
17951790 if (flags & LOOKUP_RCU ) {
17961791 if (dentry -> d_fsdata == NFS_FSDATA_BLOCKED )
17971792 return - ECHILD ;
1798- parent = READ_ONCE (dentry -> d_parent );
1799- dir = d_inode_rcu (parent );
1800- if (!dir )
1801- return - ECHILD ;
1802- ret = reval (dir , dentry , flags );
1803- if (parent != READ_ONCE (dentry -> d_parent ))
1804- return - ECHILD ;
18051793 } else {
18061794 /* Wait for unlink to complete - see unblock_revalidate() */
18071795 wait_var_event (& dentry -> d_fsdata ,
18081796 smp_load_acquire (& dentry -> d_fsdata )
18091797 != NFS_FSDATA_BLOCKED );
1810- parent = dget_parent (dentry );
1811- ret = reval (d_inode (parent ), dentry , flags );
1812- dput (parent );
18131798 }
1814- return ret ;
1799+ return 0 ;
18151800}
18161801
18171802static int nfs_lookup_revalidate (struct inode * dir , const struct qstr * name ,
18181803 struct dentry * dentry , unsigned int flags )
18191804{
1820- return __nfs_lookup_revalidate (dentry , flags , nfs_do_lookup_revalidate );
1805+ if (__nfs_lookup_revalidate (dentry , flags ))
1806+ return - ECHILD ;
1807+ return nfs_do_lookup_revalidate (dir , name , dentry , flags );
18211808}
18221809
18231810static void block_revalidate (struct dentry * dentry )
@@ -2216,11 +2203,14 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
22162203EXPORT_SYMBOL_GPL (nfs_atomic_open );
22172204
22182205static int
2219- nfs4_do_lookup_revalidate (struct inode * dir , struct dentry * dentry ,
2220- unsigned int flags )
2206+ nfs4_lookup_revalidate (struct inode * dir , const struct qstr * name ,
2207+ struct dentry * dentry , unsigned int flags )
22212208{
22222209 struct inode * inode ;
22232210
2211+ if (__nfs_lookup_revalidate (dentry , flags ))
2212+ return - ECHILD ;
2213+
22242214 trace_nfs_lookup_revalidate_enter (dir , dentry , flags );
22252215
22262216 if (!(flags & LOOKUP_OPEN ) || (flags & LOOKUP_DIRECTORY ))
@@ -2259,14 +2249,7 @@ nfs4_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
22592249 return nfs_lookup_revalidate_dentry (dir , dentry , inode , flags );
22602250
22612251full_reval :
2262- return nfs_do_lookup_revalidate (dir , dentry , flags );
2263- }
2264-
2265- static int nfs4_lookup_revalidate (struct inode * dir , const struct qstr * name ,
2266- struct dentry * dentry , unsigned int flags )
2267- {
2268- return __nfs_lookup_revalidate (dentry , flags ,
2269- nfs4_do_lookup_revalidate );
2252+ return nfs_do_lookup_revalidate (dir , name , dentry , flags );
22702253}
22712254
22722255#endif /* CONFIG_NFSV4 */
0 commit comments