[pnfs] CVS: nfsv4

Benny Halevy Panasas bhalevy at citi.umich.edu
Wed Feb 21 12:05:20 EST 2007


CVSROOT:	/cvs
Module name:	nfsv4
Changes by:	bhalevy at citi.umich.edu	2007/02/21 12:05:20

Modified files:
	cvs/pnfs/fs/nfs: pnfs.c 
	cvs/pnfs/fs/nfsd: nfs4xdr.c 
	cvs/pnfs/include/linux: nfs4_pnfs.h 

Log message:
* pnfs layout driver setup_layoutcommit may allocate memory hence it
should return status. propagate status via pnfs_layoutcommit_setup()
* fix nfsd layout commit xdr routine to correctly read the layout update
buffer

Signed-off-by: Benny Halevy <bhalevy at panasas.com>

Index: fs/nfs/pnfs.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/pnfs.c,v
retrieving revision 1.61
diff -d -u -p -r1.61 pnfs.c
--- fs/nfs/pnfs.c	3 Feb 2007 18:40:09 -0000	1.61
+++ fs/nfs/pnfs.c	21 Feb 2007 17:00:01 -0000
@@ -1329,18 +1329,20 @@ static const struct rpc_call_ops pnfs_la
/*
* Set up the argument/result storage required for the RPC call.
*/
-static void
+static int
pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
{
struct nfs_inode *nfsi = NFS_I(data->inode);
struct nfs_server *nfss = NFS_SERVER(data->inode);
+	int result = 0;

dprintk("%s Begin (sync:%d)\n", __FUNCTION__, sync);
data->args.fh = NFS_FH(data->inode);
data->args.layout_type = nfss->pnfs_curr_ld->id;

/* Initialize new layout size.
-	 * TODO: Needs to be set to the actual size of an updated layout.
+	 * layout driver's setup_layoutcommit may optionally set
+	 * the actual size of an updated layout.
*/
data->args.new_layout_size = 0;

@@ -1360,16 +1362,20 @@ pnfs_layoutcommit_setup(struct pnfs_layo
* TODO: We may want to avoid memory copies by delay this
* until xdr time.
*/
-	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
-		nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(nfsi->current_layout,
-								  data->inode,
-								  &data->args);
+	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
+		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
+				nfsi->current_layout,
+				data->inode,
+				&data->args);
+		if (result)
+			goto out;
+	}

data->res.fattr = &data->fattr;
nfs_fattr_init(&data->fattr);

if (sync)
-		return;
+		goto out;

/* Finalize the task. */
rpc_init_task(&data->task, NFS_CLIENT(data->inode), RPC_TASK_ASYNC,
@@ -1380,12 +1386,17 @@ pnfs_layoutcommit_setup(struct pnfs_layo
data->task.tk_priority = RPC_PRIORITY_NORMAL;
data->task.tk_cookie = (unsigned long)data->inode;

-	dprintk("NFS: %4d initiated layoutcommit call. %llu@%llu lbw: %llu type: %d\n",
+	dprintk("NFS: %4d initiated layoutcommit call. %llu@%llu lbw: %llu "
+		"type: %d new_layout_size: %d\n",
data->task.tk_pid,
data->args.length,
data->args.offset,
data->args.lastbytewritten,
-		data->args.layout_type);
+		data->args.layout_type,
+		data->args.new_layout_size);
+out:
+	dprintk("%s End Status %d\n", __FUNCTION__, result);
+	return result;
}

/* Issue a async layoutcommit for an inode.
@@ -1414,7 +1425,9 @@ pnfs_layoutcommit_inode(struct inode *in
data->ctx = nfsi->layoutcommit_ctx;

/* Set up layout commit args*/
-	pnfs_layoutcommit_setup(data, sync);
+	status = pnfs_layoutcommit_setup(data, sync);
+	if (status)
+		goto out_unlock;

/* Clear layoutcommit properties in the inode so
* new lc info can be generated
Index: fs/nfsd/nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4xdr.c,v
retrieving revision 1.35
diff -d -u -p -r1.35 nfs4xdr.c
--- fs/nfsd/nfs4xdr.c	31 Jan 2007 21:15:19 -0000	1.35
+++ fs/nfsd/nfs4xdr.c	21 Feb 2007 17:00:06 -0000
@@ -1260,7 +1260,7 @@ nfsd4_decode_layoutcommit(struct nfsd4_c
READ32(lcp->lc_access_sec);
READ32(lcp->lc_access_nsec);
}
-	READ_BUF(8 + lcp->lc_loup.up_len);
+	READ_BUF(8);
READ32(lcp->lc_loup.up_type);
/* XXX: saving XDR'ed layout update. Since we don't have the
* current_fh yet, and therefore no export_ops, we can't call
@@ -1268,8 +1268,8 @@ nfsd4_decode_layoutcommit(struct nfsd4_c
* do not use the layout update....
*/
READ32(lcp->lc_loup.up_len);
-	if (lcp->lc_loup.up_len > 0 && lcp->lc_loup.up_len <= PNFS_LAYOUT_MAXSIZE)
-		COPYMEM(lcp->lc_loup.up_layout, lcp->lc_loup.up_len);
+	READ_BUF(lcp->lc_loup.up_len);
+	READMEM(lcp->lc_loup.up_layout, lcp->lc_loup.up_len);

DECODE_TAIL;
}
Index: include/linux/nfs4_pnfs.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4_pnfs.h,v
retrieving revision 1.14
diff -d -u -p -r1.14 nfs4_pnfs.h
--- include/linux/nfs4_pnfs.h	12 Dec 2006 10:08:34 -0000	1.14
+++ include/linux/nfs4_pnfs.h	21 Feb 2007 17:00:06 -0000
@@ -65,7 +65,7 @@ struct layoutdriver_io_operations {
void (*free_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, loff_t offset, size_t count);
struct pnfs_layout_type* (*set_layout) (struct pnfs_layout_type * layoutid, struct inode * inode, void* layout);

-	void (*setup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg);
+	int (*setup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg);
void (*cleanup_layoutcommit) (struct pnfs_layout_type * layoutid, struct inode * inode, struct pnfs_layoutcommit_arg* arg, struct pnfs_layoutcommit_res* res);

/* Registration information for a new mounted file system



More information about the pNFS mailing list