[pnfs] [PATCH 06/10] pnfs: refactor get_layout

andros at umihc.edu andros at umihc.edu
Fri Mar 14 12:23:42 EDT 2008


From: Andy Adamson <andros at umich.edu>

Allocate nfs4_pnfs_layoutget for async rpc.
Remove stateid memcpy. Stateid will processed in a later patch.

Signed-off-by: Andy Adamson<andros at umich.edu>
---
 fs/nfs/nfs4proc.c        |   16 ++++++------
 fs/nfs/pnfs.c            |   62 +++++++++++++++++++++++----------------------
 include/linux/pnfs_xdr.h |    4 +-
 3 files changed, 42 insertions(+), 40 deletions(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 4718237..9be0f80 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -5215,8 +5215,8 @@ static void nfs4_pnfs_layoutget_prepare(struct rpc_task *task, void *calldata)
 	struct nfs4_pnfs_layoutget *lgp = calldata;
 	struct rpc_message msg = {
 		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PNFS_LAYOUTGET],
-		.rpc_argp = lgp->args,
-		.rpc_resp = lgp->res,
+		.rpc_argp = &lgp->args,
+		.rpc_resp = &lgp->res,
 	};
 
 	dprintk("--> %s\n", __func__);
@@ -5228,28 +5228,28 @@ static int
 nfs4_pnfs_layoutget_validate(struct rpc_task *task, void *calldata)
 {
 	struct nfs4_pnfs_layoutget *lgp = calldata;
-	struct inode *ino = lgp->args->inode;
+	struct inode *ino = lgp->args.inode;
 	struct nfs_server *server = NFS_SERVER(ino);
 	struct nfs4_session *session = server->session;
 
 	dprintk("--> %s\n", __func__);
 	return nfs41_call_validate_seq_args(server, session,
-					    &lgp->args->seq_args,
-					    &lgp->res->seq_res,
+					    &lgp->args.seq_args,
+					    &lgp->res.seq_res,
 					    0, task);
 }
 
 static void nfs4_pnfs_layoutget_done(struct rpc_task *task, void *calldata)
 {
 	struct nfs4_pnfs_layoutget *lgp = calldata;
-	struct inode *ino = lgp->args->inode;
+	struct inode *ino = lgp->args.inode;
 	struct nfs_server *server = NFS_SERVER(ino);
 	struct nfs_inode *nfsi = NFS_I(ino);
 	struct pnfs_layout_type *lo;
 
 	dprintk("--> %s\n", __func__);
 
-	nfs4_sequence_done(server, &lgp->res->seq_res, task->tk_status);
+	nfs4_sequence_done(server, &lgp->res.seq_res, task->tk_status);
 	if (RPC_ASSASSINATED(task))
 		return;
 	lo = nfsi->current_layout;
@@ -5275,7 +5275,7 @@ static const struct rpc_call_ops nfs4_pnfs_layoutget_call_ops = {
 
 static int nfs4_proc_pnfs_layoutget(struct nfs4_pnfs_layoutget *lgp)
 {
-	struct inode *ino = lgp->args->inode;
+	struct inode *ino = lgp->args.inode;
 	struct nfs_server *server = NFS_SERVER(ino);
 	struct rpc_task *task;
 	int status;
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 7a44f18..9b889df 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -472,25 +472,32 @@ lo_seg_intersecting(struct nfs4_pnfs_layout_segment *l1,
 static int
 get_layout(struct inode *ino,
 	   struct nfs_open_context *ctx,
-	   struct nfs4_pnfs_layoutget_arg *arg,
-	   struct nfs4_pnfs_layoutget_res *res)
+	   struct nfs4_pnfs_layout_segment *range,
+	   struct pnfs_layout_segment **lsegpp)
 {
 	int status;
 	struct nfs_server *server = NFS_SERVER(ino);
-	struct nfs4_pnfs_layoutget gdata = {
-		.args = arg,
-		.res = res,
-	};
-	dprintk("%s:Begin\n", __FUNCTION__);
+	struct nfs4_pnfs_layoutget *lgp;
 
-	arg->type = server->pnfs_curr_ld->id;
-	arg->minlength = arg->lseg.length;
-	arg->maxcount = PNFS_LAYOUT_MAXSIZE;
-	arg->inode = ino;
-	arg->ctx = ctx;
+	dprintk("--> %s\n", __func__);
+
+	lgp = kzalloc(sizeof(*lgp), GFP_KERNEL);
+	if (lgp == NULL)
+		return -ENOMEM;
+	lgp->args.lseg.iomode = range->iomode;
+	lgp->args.lseg.offset = range->offset;
+	lgp->args.lseg.length = range->length;
+	lgp->args.type = server->pnfs_curr_ld->id;
+	lgp->args.minlength = lgp->args.lseg.length;
+	lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE;
+	lgp->args.inode = ino;
+	lgp->args.ctx = ctx;
+	lgp->lsegpp = lsegpp;
 
 	/* Retrieve layout information from server */
-	status = NFS_PROTO(ino)->pnfs_layoutget(&gdata);
+	status = NFS_PROTO(ino)->pnfs_layoutget(lgp);
+
+	dprintk("<-- %s status %d\n", __func__, status);
 	return status;
 }
 
@@ -821,8 +828,11 @@ pnfs_update_layout(struct inode *ino,
 		   enum pnfs_iomode iomode,
 		   struct pnfs_layout_segment **lsegpp)
 {
-	struct nfs4_pnfs_layoutget_res res;
-	struct nfs4_pnfs_layoutget_arg arg;
+	struct nfs4_pnfs_layout_segment arg = {
+		.iomode = iomode,
+		.offset = pos,
+		.length = count
+	};
 	struct nfs_inode *nfsi = NFS_I(ino);
 	struct nfs_server *nfss = NFS_SERVER(ino);
 	struct pnfs_layout_type *lo;
@@ -836,18 +846,15 @@ pnfs_update_layout(struct inode *ino,
 		goto out;
 	}
 
-	arg.lseg.iomode = iomode;
-	arg.lseg.offset = pos;
-	arg.lseg.length = count;
 	/* Check to see if the layout for the given range already exists */
-	lseg = pnfs_has_layout(lo, &arg.lseg, lsegpp != NULL);
+	lseg = pnfs_has_layout(lo, &arg, lsegpp != NULL);
 	if (lseg) {
 		dprintk("%s: Using cached layout %p for %llu@%llu iomode %d)\n",
 			__func__,
 			nfsi->current_layout,
-			arg.lseg.length,
-			arg.lseg.offset,
-			arg.lseg.iomode);
+			arg.length,
+			arg.offset,
+			arg.iomode);
 
 		result = 0;
 		goto out_put;
@@ -866,11 +873,9 @@ pnfs_update_layout(struct inode *ino,
 		}
 	}
 
-	res.layout.buf = NULL;
-	memcpy(&lo->stateid.data, &arg.stateid.data, NFS4_STATEID_SIZE);
 	spin_unlock(&nfsi->lo_lock);
 
-	result = get_layout(ino, ctx, &arg, &res);
+	result = get_layout(ino, ctx, &arg, lsegpp);
 out:
 	dprintk("%s end (err:%d) state 0x%lx lseg %p\n",
 			__func__, result, nfsi->pnfs_layout_state, lseg);
@@ -887,7 +892,7 @@ pnfs_get_layout_done(struct pnfs_layout_type *lo,
 		     struct nfs4_pnfs_layoutget *lgp,
 		     int rpc_status)
 {
-	struct nfs4_pnfs_layoutget_res *res = lgp->res;
+	struct nfs4_pnfs_layoutget_res *res = &lgp->res;
 	struct pnfs_layout_segment *lseg = NULL;
 	struct nfs_inode *nfsi = NFS_I(lo->inode);
 
@@ -897,9 +902,6 @@ pnfs_get_layout_done(struct pnfs_layout_type *lo,
 
 	BUG_ON(nfsi->current_layout != lo);
 
-	/* FIXME: check for reordering using the returned sequence id */
-	memcpy(&res->stateid.data, &lo->stateid.data, NFS4_STATEID_SIZE);
-
 	lgp->status = rpc_status;
 	if (rpc_status) {
 		dprintk("%s: ERROR retrieving layout %d\n",
@@ -936,7 +938,7 @@ pnfs_get_layout_done(struct pnfs_layout_type *lo,
 
 	if (res->layout.len <= 0) {
 		printk(KERN_ERR
-		       "%s: ERROR!  Layout size is ZERO!\n", __FUNCTION__);
+		       "%s: ERROR!  Layout size is ZERO!\n", __func__);
 		lgp->status =  -EIO;
 		goto get_out;
 	}
diff --git a/include/linux/pnfs_xdr.h b/include/linux/pnfs_xdr.h
index 039c271..d68aab1 100644
--- a/include/linux/pnfs_xdr.h
+++ b/include/linux/pnfs_xdr.h
@@ -54,8 +54,8 @@ struct nfs4_pnfs_layoutget_res {
 };
 
 struct nfs4_pnfs_layoutget {
-	struct nfs4_pnfs_layoutget_arg *args;
-	struct nfs4_pnfs_layoutget_res *res;
+	struct nfs4_pnfs_layoutget_arg args;
+	struct nfs4_pnfs_layoutget_res res;
 	struct pnfs_layout_segment **lsegpp;
 	int status;
 };
-- 
1.5.0.2



More information about the pNFS mailing list