提交 fab728e1 编写于 作者: T Trond Myklebust

NFS: Ensure nfs_instantiate() invalidates the parent dir on error

Also ensure that it drops the dentry in this case.
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 4b841736
......@@ -1174,32 +1174,39 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc)
int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
struct nfs_fattr *fattr)
{
struct dentry *parent = dget_parent(dentry);
struct inode *dir = parent->d_inode;
struct inode *inode;
int error = -EACCES;
d_drop(dentry);
/* We may have been initialized further down */
if (dentry->d_inode)
return 0;
goto out;
if (fhandle->size == 0) {
struct inode *dir = dentry->d_parent->d_inode;
error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr);
if (error)
return error;
goto out_error;
}
if (!(fattr->valid & NFS_ATTR_FATTR)) {
struct nfs_server *server = NFS_SB(dentry->d_sb);
error = server->nfs_client->rpc_ops->getattr(server, fhandle, fattr);
if (error < 0)
return error;
goto out_error;
}
inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
error = PTR_ERR(inode);
if (IS_ERR(inode))
return error;
d_instantiate(dentry, inode);
if (d_unhashed(dentry))
d_rehash(dentry);
goto out_error;
d_add(dentry, inode);
out:
dput(parent);
return 0;
out_error:
nfs_mark_for_revalidate(dir);
dput(parent);
return error;
}
/*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册