[pnfs] [PATCH 31/37] pnfs: client layout_cache: pnfs_update_layout returns an lseg

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


Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/pnfs.c |   20 ++++++++++++++------
 fs/nfs/pnfs.h |    4 +++-
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 6c5f527..71250ab 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -751,19 +751,23 @@ pnfs_has_layout(struct pnfs_layout_type *lo,
 
 /* Update the file's layout for the given range and iomode.
  * Layout is retreived from the server if needed.
+ * If lsegpp is given, the appropriate layout segment is referenced and
+ * returned to the caller.
  */
 int
 pnfs_update_layout(struct inode *ino,
 		   struct nfs_open_context *ctx,
 		   size_t count,
 		   loff_t pos,
-		   enum pnfs_iomode iomode)
+		   enum pnfs_iomode iomode,
+		   struct pnfs_layout_segment **lsegpp)
 {
 	struct nfs4_pnfs_layoutget_res res;
 	struct nfs4_pnfs_layoutget_arg arg;
 	struct nfs_inode *nfsi = NFS_I(ino);
 	struct nfs_server *nfss = NFS_SERVER(ino);
 	struct pnfs_layout_type *layout_new;
+	struct pnfs_layout_segment *lseg = NULL;
 	int result = -EIO;
 
 	layout_new = get_alloc_layout(ino, nfss->pnfs_curr_ld->ld_io_ops);
@@ -879,8 +883,10 @@ get_out:
 out:
 	put_unlock_current_layout(nfsi, layout_new);
 ret:
-	dprintk("%s end (err:%d) state 0x%lx\n",
-		__FUNCTION__, result, nfsi->pnfs_layout_state);
+	dprintk("%s end (err:%d) state 0x%lx lseg %p\n",
+		__FUNCTION__, result, nfsi->pnfs_layout_state, lseg);
+	if (lsegpp)
+		*lsegpp = lseg;
 	return result;
 }
 
@@ -1010,7 +1016,7 @@ pnfs_set_ds_rsize(struct inode *inode,
 
 
 	status = pnfs_update_layout(inode, ctx, count,
-						offset, IOMODE_READ);
+				    offset, IOMODE_READ, NULL);
 	dprintk("%s *rsize %Zd virt update returned %d\n",
 					__func__, *rsize, status);
 
@@ -1155,7 +1161,8 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
 				    args->context,
 				    args->count,
 				    args->offset,
-				    IOMODE_RW);
+				    IOMODE_RW,
+				    NULL);
 	if (status) {
 		status = 1;	/* retry with nfs I/O */
 		goto out;
@@ -1233,7 +1240,8 @@ pnfs_readpages(struct nfs_read_data *rdata)
 				    args->context,
 				    args->count,
 				    args->offset,
-				    IOMODE_READ);
+				    IOMODE_READ,
+				    NULL);
 	if (status) {
 		printk(KERN_WARNING
 		       "%s: ERROR %d from pnfs_update_layout\n",
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index ed1445e..310490c 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -14,9 +14,11 @@
 
 #ifdef CONFIG_PNFS
 #include <linux/nfs_page.h>
+#include <linux/nfs4_pnfs.h>
 
 int pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
-	size_t count, loff_t pos, enum pnfs_iomode access_type);
+	size_t count, loff_t pos, enum pnfs_iomode access_type,
+	struct pnfs_layout_segment **lsegpp);
 
 int pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range);
 int pnfs_return_layout_rpc(struct nfs_server *server, struct nfs4_pnfs_layoutreturn_arg *argp);
-- 
1.5.3.3



More information about the pNFS mailing list