[pnfs] [PATCH 12/23] 2.6-latest pnfs client data server read validate and release

andros at umich.edu andros at umich.edu
Thu Dec 13 15:51:38 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>
---
 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 93ba961..8bbcb1c 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("%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;
 		}
@@ -297,7 +298,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
@@ -311,7 +312,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 10b9b7e..4a4d1ed 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -437,6 +437,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 c7970a5..84c87dc 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1060,7 +1060,7 @@ struct nfs_read_data {
         int                     pnfsflags;
         __u64                   orig_offset;
 	int                     how;            /* for FLUSH_STABLE */
-	struct nfs4_session *	session;	/* XXX Do await w/o it? */
+	struct nfs_client *	ds_nfs_client;	/* XXX Do await w/o it? */
 #endif
 	struct page		*page_array[NFS_PAGEVEC_SIZE];
 };
-- 
1.5.0.2



More information about the pNFS mailing list