[pnfs] CVS: nfsv4

Marc Eshel IBM eshel at citi.umich.edu
Tue Sep 19 19:21:51 EDT 2006


CVSROOT:	/cvs
Module name:	nfsv4
Changes by:	eshel at citi.	2006/09/19 19:21:51

Modified files:
	cvs/pnfs/fs/nfsd: nfs4filelayoutxdr.c nfs4xdr.c 

Log message:
Do not pass struct nfsd4_compoundres to exported encode routines.

Index: nfs4filelayoutxdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4filelayoutxdr.c,v
retrieving revision 1.15
diff -u -r1.15 nfs4filelayoutxdr.c
--- nfs4filelayoutxdr.c	31 Aug 2006 22:46:07 -0000	1.15
+++ nfs4filelayoutxdr.c	19 Sep 2006 22:41:07 -0000
@@ -44,17 +44,18 @@

/* File layout export_operations->devaddr_encode()  */
-void
-filelayout_encode_devaddr(struct nfsd4_compoundres *resp, void *dev_addr)
+int
+filelayout_encode_devaddr(u32 *p, u32 *end, void *dev_addr)
{
struct pnfs_filelayout_devaddr *fdev;
int len;
-	ENCODE_HEAD;
+	u32 *p_in = p;

fdev = (struct pnfs_filelayout_devaddr *)dev_addr;
len = 4+XDR_QUADLEN(fdev->r_netid.len)+XDR_QUADLEN(fdev->r_addr.len);
len = len << 2;
-	RESERVE_SPACE(len);
+	if (p + XDR_QUADLEN(len) > end)
+		return -ENOMEM;
WRITE32(len);
WRITE32(fdev->r_dev_type);
WRITE32(1);
@@ -62,7 +63,7 @@
WRITEMEM(fdev->r_netid.data,fdev->r_netid.len);
WRITE32(fdev->r_addr.len);
WRITEMEM(fdev->r_addr.data,fdev->r_addr.len);
-	ADJUST_ARGS();
+	return ((p - p_in) << 2);
}
EXPORT_SYMBOL(filelayout_encode_devaddr);

@@ -83,36 +84,36 @@
EXPORT_SYMBOL(filelayout_free_devaddr);

static int
-filelayout_encode_layoutlist_item(struct nfsd4_compoundres *resp, struct nfsd4_pnfs_layoutlist *item)
+filelayout_encode_layoutlist_item(u32 *p, u32 *end, struct nfsd4_pnfs_layoutlist *item)
{
int len;
unsigned int fhlen = item->fhp->fh_size;
-	ENCODE_HEAD;

len = 12 + fhlen;
-	RESERVE_SPACE(len);
+	if (p + XDR_QUADLEN(len) > end)
+		return -ENOMEM;
WRITE32(item->dev_id);
WRITE32(item->dev_index);
WRITE32(fhlen);
WRITEMEM(&item->fhp->fh_base, fhlen);
-	ADJUST_ARGS();
return len;
}

/* File layout export_operations->layout_encode()  */
-void
-filelayout_encode_layout(struct nfsd4_compoundres *resp, void *layout)
+int
+filelayout_encode_layout(u32 *p, u32 *end, void *layout)
{
struct nfsd4_pnfs_filelayout *flp;
struct nfsd4_pnfs_layoutlist *item;
-	int i, len;
+	int i, full_len, len;
u32 *totlen;
-	ENCODE_HEAD;

flp = (struct nfsd4_pnfs_filelayout *)layout;
len = 32;
-	RESERVE_SPACE(len + 4);
-	totlen = p; 	/* fill-in  opaque layout length later*/
+	if (p + XDR_QUADLEN(len + 4) > end)
+		return -ENOMEM;
+	full_len = len + 4;
+	totlen = p; 	/* fill-in opaque layout length later*/
p++;
WRITE32(flp->lg_stripe_type);
WRITE32(flp->lg_commit_through_mds);
@@ -123,12 +124,21 @@
printk("filelayout_encode_layout: XXX add loop for index list\n");
}
WRITE32(flp->lg_llistlen);
-	ADJUST_ARGS();
for (i=0; i < flp->lg_llistlen; i++) {
item = &flp->lg_llist[i];
-		len += filelayout_encode_layoutlist_item(resp, item);
+		len = filelayout_encode_layoutlist_item(p, end, item);
+		if (len > 0) {
+			p += XDR_QUADLEN(len);
+			full_len += len;
+		}
+		else
+			break;
+	}
+	if (len > 0) {
+		*totlen = htonl(full_len);
+		full_len += 4;
}
-	*totlen = htonl(len);
+	return full_len;
}
EXPORT_SYMBOL(filelayout_encode_layout);

Index: nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4xdr.c,v
retrieving revision 1.27
diff -u -r1.27 nfs4xdr.c
--- nfs4xdr.c	14 Sep 2006 16:32:44 -0000	1.27
+++ nfs4xdr.c	19 Sep 2006 22:41:07 -0000
@@ -2674,24 +2674,35 @@
}
}

-static void
+static int
nfsd4_encode_devlist_item(struct nfsd4_compoundres *resp, struct nfsd4_pnfs_devlist *dlist, struct export_operations *ex_ops, int lotype)
{
+	int len;
ENCODE_HEAD;

RESERVE_SPACE(4);
WRITE32(dlist->dev_id);
ADJUST_ARGS();
+
if (ex_ops->devaddr_encode == NULL && lotype == LAYOUT_NFSV4_FILES)
{
-		filelayout_encode_devaddr(resp, dlist->dev_addr);
+		len = filelayout_encode_devaddr(p, resp->end, dlist->dev_addr);
filelayout_free_devaddr(dlist->dev_addr);
}
else {
-		ex_ops->devaddr_encode(resp, dlist->dev_addr);
+		len = ex_ops->devaddr_encode(p,  resp->end, dlist->dev_addr);
ex_ops->devaddr_free(dlist->dev_addr);
}
kfree(dlist->dev_addr);
+
+	if (len > 0) {
+		p += XDR_QUADLEN(len);
+		ADJUST_ARGS();
+	}
+	else {
+		BUG_ON(len <= 0);
+	}
+	return len;
}

/* GETDEVICELIST: minorversion1-01.txt
@@ -2706,7 +2717,7 @@
static void
nfsd4_encode_getdevlist(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_pnfs_getdevlist *gdevl)
{
-	int i;
+	int i, len;
struct nfsd4_pnfs_devlist *item;

ENCODE_HEAD;
@@ -2721,9 +2732,12 @@
item = gdevl->gd_devlist;
for (i = 0; i < gdevl->gd_devlist_len; i++) {
dprintk("%s: i %d item %p\n",__FUNCTION__, i, item);
-			nfsd4_encode_devlist_item (resp, item, gdevl->gd_ops,
-								gdevl->gd_type);
+			len = nfsd4_encode_devlist_item (resp, item,
+						gdevl->gd_ops, gdevl->gd_type);
item++;
+			if (len <= 0) {
+			        break;
+			}
}
RESERVE_SPACE(4);
WRITE32(gdevl->gd_eof);
@@ -2741,20 +2755,29 @@
static void
nfsd4_encode_getdevinfo(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_pnfs_getdevinfo *gdev)
{
+	int len;
ENCODE_HEAD;

printk("%s: err %d\n",__FUNCTION__, nfserr);
if (!nfserr) {
+		RESERVE_SPACE(4);
if (gdev->gd_ops->devaddr_encode == NULL &&
gdev->gd_type == LAYOUT_NFSV4_FILES)
{
-			filelayout_encode_devaddr(resp, gdev->gd_devaddr);
+			len = filelayout_encode_devaddr(p, resp->end,gdev->gd_devaddr);
filelayout_free_devaddr(gdev->gd_devaddr);
}
else {
-			gdev->gd_ops->devaddr_encode(resp, gdev->gd_devaddr);
+			len = gdev->gd_ops->devaddr_encode(p, resp->end, gdev->gd_devaddr);
gdev->gd_ops->devaddr_free(gdev->gd_devaddr);
}
+		if (len > 0) {
+			p += XDR_QUADLEN(len);
+			ADJUST_ARGS();
+		}
+		else {
+			BUG_ON(len <= 0);
+		}
}
}

@@ -2768,6 +2791,7 @@
static void
nfsd4_encode_layoutget(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_pnfs_layoutget *lgp)
{
+	int len;
ENCODE_HEAD;

if (!nfserr) {
@@ -2780,12 +2804,19 @@
if (lgp->lg_ops->layout_encode == NULL &&
lgp->lg_type == LAYOUT_NFSV4_FILES)
{
-			filelayout_encode_layout(resp, lgp->lg_layout);
+			len = filelayout_encode_layout(p, resp->end, lgp->lg_layout);
filelayout_free_layout(lgp->lg_layout);
}
else {
-			lgp->lg_ops->layout_encode((void *)resp, lgp->lg_layout);
+			len = lgp->lg_ops->layout_encode(p, resp->end, lgp->lg_layout);
lgp->lg_ops->layout_free(lgp->lg_layout);
+		}
+		if (len > 0) {
+			p += XDR_QUADLEN(len);
+			ADJUST_ARGS();
+		}
+		else {
+			BUG_ON(len <= 0);
}
}
};



More information about the pNFS mailing list