[pnfs] CVS: nfsv4
Benny Halevy Panasas
bhalevy at citi.umich.edu
Sat Feb 3 13:40:09 EST 2007
CVSROOT: /cvs
Module name: nfsv4
Changes by: bhalevy at citi.umich.edu 2007/02/03 13:40:09
Modified files:
cvs/pnfs/fs/nfs: nfs4proc.c pnfs.c
Log message:
Make layoutreturn sync rpc as it is not implemented correctly for async yet
(must do post call stuff in done function, not by caller)
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
Index: fs/nfs/nfs4proc.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4proc.c,v
retrieving revision 1.43
diff -d -u -p -r1.43 nfs4proc.c
--- fs/nfs/nfs4proc.c 31 Jan 2007 23:42:54 -0000 1.43
+++ fs/nfs/nfs4proc.c 3 Feb 2007 18:32:25 -0000
@@ -2220,53 +2220,16 @@ out:
return status;
}
-static void layoutreturn_prepare(struct rpc_task *task, void *data)
+static int nfs4_proc_pnfs_layoutreturn(struct nfs4_pnfs_layoutreturn* layout)
{
- struct nfs4_pnfs_layoutreturn *layout = (struct nfs4_pnfs_layoutreturn *)data;
-
+ struct inode* ino = layout->args->inode;
struct rpc_message msg = {
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PNFS_LAYOUTRETURN],
.rpc_argp = layout->args,
.rpc_resp = layout->res,
};
- rpc_call_setup(task, &msg, 0);
-}
-
-static void layoutreturn_call_done(struct rpc_task *task, void *data)
-{
- struct nfs4_pnfs_layoutreturn *layout = (struct nfs4_pnfs_layoutreturn *)data;
-
- if (task->tk_status)
- printk(KERN_NOTICE "LAYOUTRETURN failed! Returned with error code %d\n", task->tk_status);
-
- layout->rpc_status = task->tk_status;
-}
-
-struct rpc_call_ops layoutreturn_call_ops = {
- .rpc_call_prepare = layoutreturn_prepare,
- .rpc_call_done = layoutreturn_call_done,
-};
-
-static int nfs4_proc_pnfs_layoutreturn(struct nfs4_pnfs_layoutreturn* layout)
-{
- struct inode* ino = layout->args->inode;
- struct rpc_task *task;
- int status;
-
- task = rpc_run_task(NFS_CLIENT(ino), RPC_TASK_ASYNC, &layoutreturn_call_ops, layout);
-
- if (IS_ERR(task))
- return PTR_ERR(task);
-
- status = nfs4_wait_for_completion_rpc_task(task);
-
- if (!status)
- status = layout->rpc_status;
-
- rpc_release_task(task);
-
- return status;
+ return rpc_call_sync(NFS_CLIENT(ino), &msg, 0);
}
/* DH: Retrieve a list of devices from the server.
Index: fs/nfs/pnfs.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/pnfs.c,v
retrieving revision 1.60
diff -d -u -p -r1.60 pnfs.c
--- fs/nfs/pnfs.c 30 Jan 2007 07:16:42 -0000 1.60
+++ fs/nfs/pnfs.c 3 Feb 2007 18:32:26 -0000
@@ -352,6 +352,8 @@ pnfs_return_layout(struct inode* ino)
{
struct nfs4_pnfs_layoutreturn_arg arg;
struct nfs4_pnfs_layoutreturn_res res;
+ struct nfs41_sequence_args seqarg;
+ struct nfs41_sequence_res seqres;
int status;
struct nfs_inode* nfsi = NFS_I(ino);
@@ -374,40 +376,27 @@ pnfs_return_layout(struct inode* ino)
arg.offset = 0;
arg.length = ~0;
arg.inode = ino;
+ arg.minorversion_info = &seqarg;
+ res.minorversion_info = &seqres;
- status = -ENOMEM;
-
- arg.minorversion_info = kzalloc(sizeof(struct nfs41_sequence_args),
- GFP_KERNEL);
-
- if (!arg.minorversion_info)
- goto out;
-
- res.minorversion_info = kzalloc(sizeof(struct nfs41_sequence_res),
- GFP_KERNEL);
- if (!res.minorversion_info)
- goto out_free1;
-
if ((status = server->rpc_ops->setup_sequence(server->nfs4_state->cl_session,
arg.minorversion_info,
res.minorversion_info)))
- goto out_free2;
+ goto out;
- /* Retrieve layout information from server */
+ /* Return layout to server */
status = NFS_PROTO(ino)->pnfs_layoutreturn(&gdata);
server->rpc_ops->sequence_done(server->nfs4_state->cl_session,
res.minorversion_info, status);
- dprintk ("%s: removing layout\n", __FUNCTION__);
- server->pnfs_curr_ld->ld_io_ops->free_layout(NFS_I(ino)->current_layout, ino, 0, 0);
- nfsi->current_layout = NULL;
+ if (!status) {
+ dprintk ("%s: removing layout\n", __FUNCTION__);
+ server->pnfs_curr_ld->ld_io_ops->free_layout(NFS_I(ino)->current_layout, ino, 0, 0);
+ nfsi->current_layout = NULL;
+ }
dprintk("%s:Exit status %d\n", __FUNCTION__, status);
-out_free2:
- kfree(res.minorversion_info);
-out_free1:
- kfree(arg.minorversion_info);
out:
return status;
}
More information about the pNFS
mailing list