[pnfs] [PATCH 08/14] 2.6-latest pnfs client pnfs_try_to_read

andros at umich.edu andros at umich.edu
Mon Nov 12 14:29:20 EST 2007


From: Andy Adamson <andros at umich.edu>

Call pnfs_try_to_read in read data path
Use data server session in nfs_read_validate.

Signed-off by: Andy Adamson<andros at umich.edu>
---
 fs/nfs/read.c |  102 ++++++++++++++++++++++++++++-----------------------------
 1 files changed, 50 insertions(+), 52 deletions(-)

diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 7b07865..bba6f22 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -160,6 +160,43 @@ static void nfs_readpage_release(struct nfs_page *req)
 }
 
 /*
+ * Start an async read operation
+ */
+static void nfs_execute_read(struct nfs_read_data *data)
+{
+	struct rpc_clnt *clnt = NFS_CLIENT(data->inode);
+	sigset_t oldset;
+
+	rpc_clnt_sigmask(clnt, &oldset);
+	rpc_execute(&data->task);
+	rpc_clnt_sigunmask(clnt, &oldset);
+}
+
+void nfs_initiate_read(struct nfs_read_data *data, struct rpc_clnt *clnt,
+		       const struct rpc_call_ops *call_ops)
+{
+	struct inode *inode = data->inode;
+	int flags;
+
+	/* Set up the initial task struct. */
+	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)?NFS_RPC_SWAPFLAGS : 0);
+	rpc_init_task(&data->task, clnt, flags, call_ops, data);
+
+	NFS_PROTO(inode)->read_setup(data);
+
+	data->task.tk_cookie = (unsigned long)inode;
+
+	dprintk("NFS: %4d initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
+		data->task.tk_pid,
+		inode->i_sb->s_id,
+		(long long)NFS_FILEID(inode),
+		data->args.count,
+		(unsigned long long)data->args.offset);
+
+	nfs_execute_read(data);
+}
+
+/*
  * Set up the NFS read request struct
  */
 static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
@@ -167,7 +204,6 @@ static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
 		unsigned int count, unsigned int offset)
 {
 	struct inode *inode;
-	int flags;
 	struct nfs_server *server = data->args.server;
 
 	BUG_ON(server == NULL);
@@ -187,19 +223,16 @@ static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
 	data->res.eof     = 0;
 	nfs_fattr_init(&data->fattr);
 
-	/* Set up the initial task struct. */
-	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
-	rpc_init_task(&data->task, NFS_CLIENT(inode), flags, call_ops, data);
-	NFS_PROTO(inode)->read_setup(data);
-
-	data->task.tk_cookie = (unsigned long)inode;
+#ifdef CONFIG_PNFS
+	/* XXX pnfs_try_to_read_data should never return an error less than 0.
+	* ret == 0 means pnfs read succees.
+	* ret == 1 means do an NFSv4.1 read to the MDS.
+	*/
+	if ((pnfs_try_to_read_data(data, call_ops)) <= 0)
+		return;
+#endif /* CONFIG_PNFS*/
 
-	dprintk("NFS: %5u initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
-			data->task.tk_pid,
-			inode->i_sb->s_id,
-			(long long)NFS_FILEID(inode),
-			count,
-			(unsigned long long)data->args.offset);
+	nfs_initiate_read(data, NFS_CLIENT(inode), call_ops);
 }
 
 static void
@@ -216,43 +249,6 @@ nfs_async_read_error(struct list_head *head)
 }
 
 /*
- * Start an async read operation
- */
-static void nfs_execute_read(struct nfs_read_data *data)
-{
-	struct rpc_clnt *clnt = NFS_CLIENT(data->inode);
-	sigset_t oldset;
-
-	rpc_clnt_sigmask(clnt, &oldset);
-	rpc_execute(&data->task);
-	rpc_clnt_sigunmask(clnt, &oldset);
-}
-
-void nfs_initiate_read(struct nfs_read_data *data, struct rpc_clnt *clnt,
-		       const struct rpc_call_ops *call_ops)
-{
-	struct inode *inode = data->inode;
-	int flags;
-
-	/* Set up the initial task struct. */
-	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)?NFS_RPC_SWAPFLAGS : 0);
-	rpc_init_task(&data->task, clnt, flags, call_ops, data);
-
-	NFS_PROTO(inode)->read_setup(data);
-
-	data->task.tk_cookie = (unsigned long)inode;
-
-	dprintk("NFS: %4d initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
-		data->task.tk_pid,
-		inode->i_sb->s_id,
-		(long long)NFS_FILEID(inode),
-		data->args.count,
-		(unsigned long long)data->args.offset);
-
-	nfs_execute_read(data);
-}
-
-/*
  * Generate multiple requests to fill a single page.
  *
  * We optimize to reduce the number of read operations on the wire.  If we
@@ -307,7 +303,6 @@ static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigne
 				  rsize, offset);
 		offset += rsize;
 		nbytes -= rsize;
-		nfs_execute_read(data);
 	} while (nbytes != 0);
 
 	return 0;
@@ -347,7 +342,6 @@ static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned
 
 	nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0);
 
-	nfs_execute_read(data);
 	return 0;
 out_bad:
 	nfs_async_read_error(head);
@@ -435,6 +429,10 @@ void nfs_read_validate(struct rpc_task *task, void *calldata)
 	int (*setup_sequence)(struct nfs4_session *,
 				void *, void *, int, struct rpc_task *);
 
+#ifdef CONFIG_PNFS
+	if (data->session)
+		session = data->session;
+#endif /* CONFIG_PNFS */
 	setup_sequence = server->nfs_client->rpc_ops->validate_sequence_args;
 
 	if (!setup_sequence || !setup_sequence(session,
-- 
1.5.0.2



More information about the pNFS mailing list