OSDN Git Service

NFSv3: Refactor nfs3_proc_lookup() to split out the dentry
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 19 Oct 2020 16:40:59 +0000 (12:40 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 2 Dec 2020 19:05:51 +0000 (14:05 -0500)
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>
fs/nfs/nfs3proc.c

index 2397cee..acbdf74 100644 (file)
@@ -154,14 +154,14 @@ nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 }
 
 static int
-nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
-                struct nfs_fh *fhandle, struct nfs_fattr *fattr,
-                struct nfs4_label *label)
+__nfs3_proc_lookup(struct inode *dir, const char *name, size_t len,
+                  struct nfs_fh *fhandle, struct nfs_fattr *fattr,
+                  unsigned short task_flags)
 {
        struct nfs3_diropargs   arg = {
                .fh             = NFS_FH(dir),
-               .name           = dentry->d_name.name,
-               .len            = dentry->d_name.len
+               .name           = name,
+               .len            = len
        };
        struct nfs3_diropres    res = {
                .fh             = fhandle,
@@ -173,17 +173,11 @@ nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
                .rpc_resp       = &res,
        };
        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();
        if (res.dir_attr == NULL)
                return -ENOMEM;
 
-       dprintk("NFS call  lookup %pd2\n", dentry);
        nfs_fattr_init(fattr);
        status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
        nfs_refresh_inode(dir, res.dir_attr);
@@ -198,6 +192,23 @@ nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
        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)
 {
        struct nfs3_accessargs  arg = {