NFSv3: Refactor nfs3_proc_lookup() to split out the dentry

We want to reuse the lookup code in NFSv3 in order to emulate the
NFSv4 lookupp operation.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
Trond Myklebust 2020-10-19 12:40:59 -04:00
parent bd75475c2f
commit 5f447cb881

View file

@ -154,14 +154,14 @@ nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
} }
static int static int
nfs3_proc_lookup(struct inode *dir, struct dentry *dentry, __nfs3_proc_lookup(struct inode *dir, const char *name, size_t len,
struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs_fh *fhandle, struct nfs_fattr *fattr,
struct nfs4_label *label) unsigned short task_flags)
{ {
struct nfs3_diropargs arg = { struct nfs3_diropargs arg = {
.fh = NFS_FH(dir), .fh = NFS_FH(dir),
.name = dentry->d_name.name, .name = name,
.len = dentry->d_name.len .len = len
}; };
struct nfs3_diropres res = { struct nfs3_diropres res = {
.fh = fhandle, .fh = fhandle,
@ -173,17 +173,11 @@ nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
.rpc_resp = &res, .rpc_resp = &res,
}; };
int status; int status;
unsigned short task_flags = 0;
/* Is this is an attribute revalidation, subject to softreval? */
if (nfs_lookup_is_soft_revalidate(dentry))
task_flags |= RPC_TASK_TIMEOUT;
res.dir_attr = nfs_alloc_fattr(); res.dir_attr = nfs_alloc_fattr();
if (res.dir_attr == NULL) if (res.dir_attr == NULL)
return -ENOMEM; return -ENOMEM;
dprintk("NFS call lookup %pd2\n", dentry);
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags); status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
nfs_refresh_inode(dir, res.dir_attr); nfs_refresh_inode(dir, res.dir_attr);
@ -198,6 +192,23 @@ nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
return status; return status;
} }
static int
nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
struct nfs_fh *fhandle, struct nfs_fattr *fattr,
struct nfs4_label *label)
{
unsigned short task_flags = 0;
/* Is this is an attribute revalidation, subject to softreval? */
if (nfs_lookup_is_soft_revalidate(dentry))
task_flags |= RPC_TASK_TIMEOUT;
dprintk("NFS call lookup %pd2\n", dentry);
return __nfs3_proc_lookup(dir, dentry->d_name.name,
dentry->d_name.len, fhandle, fattr,
task_flags);
}
static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry) static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
{ {
struct nfs3_accessargs arg = { struct nfs3_accessargs arg = {