[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