[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