[pnfs] [PATCH 14/29] pnfs: data server read validate and release

Benny Halevy bhalevy at panasas.com
Fri Dec 28 03:45:12 EST 2007


From: Andy Adamson <andros at umich.edu>

Use the rpc_call_ops read validate and release functions to setup the
NFSv4.1 communication using the data server session.

Signed-off-by: Andy Adamson<andros at umich.edu>
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/nfs4filelayout.c |    9 +++++----
 fs/nfs/read.c           |    5 +++++
 include/linux/nfs_xdr.h |    2 +-
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index f4e8ea3..e493f3a 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -239,7 +239,9 @@ static void filelayout_write_call_done(struct rpc_task *task, void *data)
 }
 
 struct rpc_call_ops filelayout_read_call_ops = {
+	.rpc_call_validate_args = nfs_read_validate,
 	.rpc_call_done = filelayout_read_call_done,
+	.rpc_release = nfs_readdata_release,
 };
 
 struct rpc_call_ops filelayout_write_call_ops = {
@@ -274,7 +276,6 @@ ssize_t filelayout_read_pagelist(
 	struct nfs4_filelayout *nfslay = NULL;
 	struct nfs4_pnfs_dserver dserver;
 	int status;
-	struct nfs_server *server = NFS_SERVER(inode);
 
 	if (layoutid) {
 		nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
@@ -288,7 +289,7 @@ ssize_t filelayout_read_pagelist(
 			printk(KERN_ERR "%s: dserver get failed status %d use MDS\n",
 							__FUNCTION__, status);
 			data->pnfs_client = NFS_CLIENT(inode);
-			data->session = server->session;
+			data->ds_nfs_client = NULL;
 			data->args.fh = NFS_FH(inode);
 			status = 0;
 		} else {
@@ -296,7 +297,7 @@ ssize_t filelayout_read_pagelist(
 
 			/* just try the first data server for the index..*/
 			data->pnfs_client = ds->ds_clp->cl_rpcclient;
-			data->session = ds->ds_clp->cl_ds_session;
+			data->ds_nfs_client = ds->ds_clp;
 			data->args.fh = dserver.fh;
 
 			/* Now get the file offset on the dserver
@@ -309,7 +310,7 @@ ssize_t filelayout_read_pagelist(
 	} else { /* If no layout use MDS */
 		dprintk("%s: no layout, use MDS\n", __FUNCTION__);
 		data->pnfs_client = NFS_CLIENT(inode);
-		data->session = server->session;
+		data->ds_nfs_client = NULL;
 		data->args.fh = NFS_FH(inode);
 	}
 
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index d7d8a02..31142df 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -438,6 +438,11 @@ void nfs_read_validate(struct rpc_task *task, void *calldata)
 
 	setup_sequence = server->nfs_client->rpc_ops->validate_sequence_args;
 
+#ifdef CONFIG_PNFS
+	if (data->ds_nfs_client)
+		session = data->ds_nfs_client->cl_ds_session;
+#endif /* CONFIG_PNFS */
+
 	if (!setup_sequence || !setup_sequence(session,
 						&data->args.seq_args,
 						&data->res.seq_res,
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index bccc4bd..04f679c 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1047,7 +1047,7 @@ struct nfs_read_data {
 	struct rpc_clnt		*pnfs_client;	/* Holds pNFS device across async calls */
 	int			pnfsflags;
 	__u64			orig_offset;
-	struct nfs4_session	*session;
+	struct nfs_client	*ds_nfs_client;
 #endif /* CONFIG_PNFS */
 	struct page		*page_array[NFS_PAGEVEC_SIZE];
 };
-- 
1.5.3.3



More information about the pNFS mailing list