@@ -1732,8 +1732,8 @@ static int nfs_lookup_revalidate_dentry(struct inode *dir,
1732
1732
* cached dentry and do a new lookup.
1733
1733
*/
1734
1734
static 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 )
1737
1737
{
1738
1738
struct inode * inode ;
1739
1739
int error = 0 ;
@@ -1785,39 +1785,26 @@ nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
1785
1785
}
1786
1786
1787
1787
static 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 )
1790
1789
{
1791
- struct dentry * parent ;
1792
- struct inode * dir ;
1793
- int ret ;
1794
-
1795
1790
if (flags & LOOKUP_RCU ) {
1796
1791
if (dentry -> d_fsdata == NFS_FSDATA_BLOCKED )
1797
1792
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 ;
1805
1793
} else {
1806
1794
/* Wait for unlink to complete - see unblock_revalidate() */
1807
1795
wait_var_event (& dentry -> d_fsdata ,
1808
1796
smp_load_acquire (& dentry -> d_fsdata )
1809
1797
!= NFS_FSDATA_BLOCKED );
1810
- parent = dget_parent (dentry );
1811
- ret = reval (d_inode (parent ), dentry , flags );
1812
- dput (parent );
1813
1798
}
1814
- return ret ;
1799
+ return 0 ;
1815
1800
}
1816
1801
1817
1802
static int nfs_lookup_revalidate (struct inode * dir , const struct qstr * name ,
1818
1803
struct dentry * dentry , unsigned int flags )
1819
1804
{
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 );
1821
1808
}
1822
1809
1823
1810
static void block_revalidate (struct dentry * dentry )
@@ -2216,11 +2203,14 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
2216
2203
EXPORT_SYMBOL_GPL (nfs_atomic_open );
2217
2204
2218
2205
static 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 )
2221
2208
{
2222
2209
struct inode * inode ;
2223
2210
2211
+ if (__nfs_lookup_revalidate (dentry , flags ))
2212
+ return - ECHILD ;
2213
+
2224
2214
trace_nfs_lookup_revalidate_enter (dir , dentry , flags );
2225
2215
2226
2216
if (!(flags & LOOKUP_OPEN ) || (flags & LOOKUP_DIRECTORY ))
@@ -2259,14 +2249,7 @@ nfs4_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
2259
2249
return nfs_lookup_revalidate_dentry (dir , dentry , inode , flags );
2260
2250
2261
2251
full_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 );
2270
2253
}
2271
2254
2272
2255
#endif /* CONFIG_NFSV4 */
0 commit comments