Skip to content

Commit 39f644a

Browse files
author
Al Viro
committed
nfs{,4}_lookup_validate(): use stable parent inode passed by caller
we can't kill __nfs_lookup_revalidate() completely, but ->d_parent boilerplate in it is gone Reviewed-by: Jeff Layton <[email protected]> Signed-off-by: Al Viro <[email protected]>
1 parent eab2a11 commit 39f644a

File tree

1 file changed

+13
-30
lines changed

1 file changed

+13
-30
lines changed

fs/nfs/dir.c

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,8 +1732,8 @@ static int nfs_lookup_revalidate_dentry(struct inode *dir,
17321732
* cached dentry and do a new lookup.
17331733
*/
17341734
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)
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

17871787
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)
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

18171802
static 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

18231810
static void block_revalidate(struct dentry *dentry)
@@ -2216,11 +2203,14 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
22162203
EXPORT_SYMBOL_GPL(nfs_atomic_open);
22172204

22182205
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)
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

22612251
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);
22702253
}
22712254

22722255
#endif /* CONFIG_NFSV4 */

0 commit comments

Comments
 (0)