[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