[pnfs] [PATCH 32/37] pnfs: client layout_cache: hand off lseg to layout driver read/write functions

Benny Halevy bhalevy at panasas.com
Tue Jan 1 05:51:56 EST 2008


Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/pnfs.c           |   14 ++++++++++++--
 include/linux/nfs_xdr.h |    2 ++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 71250ab..c9851bb 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1127,6 +1127,7 @@ pnfs_writeback_done(struct nfs_write_data *data)
 {
 	dprintk("%s: Begin (status %d)\n", __FUNCTION__, data->task.tk_status);
 
+	put_lseg(data->lseg);
 	data->call_ops->rpc_call_done(&data->task, data);
 }
 
@@ -1149,6 +1150,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
 	int numpages, status, pgcount, temp;
 	struct nfs_server *nfss = NFS_SERVER(inode);
 	struct nfs_inode *nfsi = NFS_I(inode);
+	struct pnfs_layout_segment *lseg;
 
 	dprintk("%s: Writing ino:%lu %u@%llu\n",
 		__FUNCTION__,
@@ -1162,7 +1164,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
 				    args->count,
 				    args->offset,
 				    IOMODE_RW,
-				    NULL);
+				    &lseg);
 	if (status) {
 		status = 1;	/* retry with nfs I/O */
 		goto out;
@@ -1182,6 +1184,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
 		numpages);
 	if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
 		wdata->pnfsflags |= PNFS_NO_RPC;
+	wdata->lseg = lseg;
 	status = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(
 							nfsi->current_layout,
 							args->pages,
@@ -1192,6 +1195,8 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
 							how,
 							wdata);
 
+	if (status)
+		put_lseg(lseg);
 	if (status > 0) {
 		dprintk("%s: LD write_pagelist returned status %d > 0\n", __FUNCTION__, status);
 		pnfs_update_last_write(nfsi, args->offset, status);
@@ -1212,6 +1217,7 @@ pnfs_read_done(struct nfs_read_data *data)
 {
 	dprintk("%s: Begin (status %d)\n", __FUNCTION__, data->task.tk_status);
 
+	put_lseg(data->lseg);
 	data->call_ops->rpc_call_done(&data->task, data);
 }
 
@@ -1228,6 +1234,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
 	int numpages, status, pgcount, temp;
 	struct nfs_server *nfss = NFS_SERVER(inode);
 	struct nfs_inode *nfsi = NFS_I(inode);
+	struct pnfs_layout_segment *lseg;
 
 	dprintk("%s: Reading ino:%lu %u@%llu\n",
 		__FUNCTION__,
@@ -1241,7 +1248,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
 				    args->count,
 				    args->offset,
 				    IOMODE_READ,
-				    NULL);
+				    &lseg);
 	if (status) {
 		printk(KERN_WARNING
 		       "%s: ERROR %d from pnfs_update_layout\n",
@@ -1260,6 +1267,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
 	dprintk("%s: Calling layout driver read with %d pages\n", __FUNCTION__, numpages);
 	if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
 		rdata->pnfsflags |= PNFS_NO_RPC;
+	rdata->lseg = lseg;
 	status = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(
 							nfsi->current_layout,
 							args->pages,
@@ -1268,6 +1276,8 @@ pnfs_readpages(struct nfs_read_data *rdata)
 							(loff_t)args->offset,
 							args->count,
 							rdata);
+	if (status)
+		put_lseg(lseg);
 	if (status > 0) {
 		dprintk("%s: LD read_pagelist returned status %d > 0\n", __FUNCTION__, status);
 		status = 0;
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 320b8c0..07d8882 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1043,6 +1043,7 @@ struct nfs_read_data {
 	unsigned long		timestamp;	/* For lease renewal */
 #endif
 #if defined(CONFIG_PNFS)
+	struct pnfs_layout_segment *lseg;
 	const struct rpc_call_ops *call_ops;
 	struct rpc_clnt		*pnfs_client;	/* Holds pNFS device across async calls */
 	int			pnfsflags;
@@ -1076,6 +1077,7 @@ struct nfs_write_data {
 	unsigned long		timestamp;	/* For lease renewal */
 #endif
 #if defined(CONFIG_PNFS)
+	struct pnfs_layout_segment *lseg;
 	const struct rpc_call_ops *call_ops;
 	struct rpc_clnt		*pnfs_client;	/* Holds pNFS device across
 						   async calls */
-- 
1.5.3.3



More information about the pNFS mailing list