[pnfs] new version of xdr for pNFS Linux client/server

Marc Eshel eshel at almaden.ibm.com
Wed Aug 30 23:07:50 EDT 2006


Check-in the changed you made to client code and I will update the server 
tomorrow.
Marc.

"Iyer, Rahul" <Rahul.Iyer at netapp.com> wrote on 08/30/2006 05:59:55 PM:

> Hi!
> My apologies for looking into Marc's patch so late. We had a few bugs in
> our server that needed fixing before we could move onto the new xdr. I
> went through the .x that Garth sent out and the patch that Marc sent
> out. There seem to be some inconsistencies in the code.
> 
> * encode_pnfs_layoutget() was missing the signal_layout_available flag
> * encode_pnfs_layoutcommit() was missing the reclaim flag and the
> newoffset flag of the layoutupdate switched 
>   union.
> * encode_pnfs_layoutreturn was missing the returntype field of the
> layoutreturn4 type.
> 
> I also moved the code around a bit. I moved the file layout specific
> code from decode_devicelist/info into decode_device. decode_deviceinfo
> was looking for a dev_id field in the results, but that is not returned.
> So, I removed that. 
> 
> And finally, there's the change of the FS_LAYOUT_TYPES from 56 to 64.
> This poses a larger problem as the value 64 would need a new word since
> the 2 words defined (FATTR4_WORD0 and FATTR4_WORD1) would not be enough.
> We would have to introduce a new FATTR4_WORD2. This however might break
> things like GETATTR and would require a greater amount of testing. I was
> unsure of whether we should do this now, and so have not made that
> change. 
> 
> The rest of the patch is attached. These are only client changes
> however, and similar changes to be made to the Linux server.
> Regards
> Rahul
> 
> 
> -----Original Message-----
> From: Benny Halevy [mailto:bhalevy at panasas.com] 
> Sent: Tuesday, August 29, 2006 2:09 AM
> To: Marc Eshel; pnfs at linux-nfs.org
> Subject: Re: [pnfs] new version of xdr for pNFS Linux client/server
> 
> attached now...
> 
> Benny Halevy wrote:
> > It looks like the nfs error codes are stale...
> > Attached is a patch to fix that and if there's no objection I'd like 
> > to submit it to the cvs tree (well, it compiles ;-)
> >
> > The only change in it that's not mechanical is in nfsd4_layoutget() in
> 
> > which the handling of the status returned by the file system's
> > layout_get() method didn't make much sense to me, especially since 
> > nfserr_nomatching_layouttype does not exist in nfsv4.1.
> > The gist of it is to return nfserr_layouttrylater for transient errors
> 
> > like ENOENT, nfserr_badlayout if layout are supported but no layout 
> > matches the client provided layout identification (I guessed the 
> > layout driver would return -ENOENT in this case) and in the default 
> > case return nfserr_layoutunavailable indicating that layouts are not 
> > supported for the file.
> >
> > I'm not sure if the default error is the best one... Should we allow 
> > the file system to return nfs errors rather than only system errors if
> 
> > it wishes to return a specific nfs error code (e.g. NFS4ERR_INVAL if a
> 
> > layoutget is called on a non-regular file). The nfsd can still verify 
> > that the file-system provided error code is within the spec before 
> > converting it to network order and returning upstream.
> >
> >                switch (status) {
> >                        case 0:
> >                                break;
> > -                       case -ENOENT:
> >                        case -ENOMEM:
> > -                               status = nfserr_layoutunavailable;
> > +                               status = nfserr_layouttrylater;
> > +                               break;
> > +                       case -ENOENT:
> > +                               status = nfserr_badlayout;
> >                                break;
> >                        default:
> > -                               status = nfserr_nomatching_layouttype;
> > +                               status = nfserr_layoutunavailable;
> >                }
> >
> > Benny
> >
> > Marc Eshel wrote:
> >> Attached is the patch to upgrade the pNFS Linux client and server 
> >> code to the latest spec. If there are no objection I will check it in
> 
> >> to the cvs tree in a couple of days.
> >> Marc.
> >>
> >> ---------------------------------------------------------------------
> >> ---
> >>
> >> Index: nfs4.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4.h,v
> >> retrieving revision 1.8
> >> diff -u -r1.8 nfs4.h
> >> --- nfs4.h    13 Jul 2006 17:18:46 -0000    1.8
> >> +++ nfs4.h    22 Aug 2006 22:12:29 -0000
> >> @@ -152,11 +152,11 @@
> >>      OP_VERIFY = 37,
> >>      OP_WRITE = 38,
> >>      OP_RELEASE_LOCKOWNER = 39,
> >> -    OP_LAYOUTGET = 40,
> >> -    OP_LAYOUTCOMMIT = 41,
> >> -    OP_LAYOUTRETURN = 42,
> >> -    OP_GETDEVICEINFO = 43,
> >> -    OP_GETDEVICELIST = 44,
> >> +    OP_GETDEVICEINFO = 47,
> >> +    OP_GETDEVICELIST = 48,
> >> +    OP_LAYOUTCOMMIT = 49,
> >> +    OP_LAYOUTGET = 50,
> >> +    OP_LAYOUTRETURN = 51,
> >>      OP_ILLEGAL = 10044,
> >>  };
> >> 
> >> Index: nfs4_pnfs.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4_pnfs.h,v
> >> retrieving revision 1.10
> >> diff -u -r1.10 nfs4_pnfs.h
> >> --- nfs4_pnfs.h    18 Aug 2006 14:09:33 -0000    1.10
> >> +++ nfs4_pnfs.h    22 Aug 2006 22:12:29 -0000
> >> @@ -116,14 +116,16 @@
> >> 
> >>  struct pnfs_device
> >>  {
> >> -    unsigned int  layoutclass;
> >>      int           dev_id;
> >> +    int           dev_type;
> >> +    unsigned int  dev_count;
> >>      unsigned int  dev_addr_len;
> >>      char          dev_addr_buf[NFS4_PNFS_DEV_MAXSIZE];
> >>  };
> >> 
> >>  struct pnfs_devicelist {
> >>      unsigned int        num_devs;
> >> +    unsigned int        eof;
> >>      unsigned int        devs_len;
> >>      struct pnfs_device  devs[NFS4_PNFS_DEV_MAXCOUNT];  }; @@ -168,6 
> >> +170,11 @@
> >>      LAYOUT_OSD2_OBJECTS = 2,
> >>      LAYOUT_BLOCK_VOLUME = 3,
> >>      LAYOUT_PVFS2        = 4
> >> +};
> >> +
> >> +enum file_layout_device_type {
> >> +    FILE_SIMPLE  = 1,
> >> +    FILE_COMPLEX = 2
> >>  };
> >> 
> >>  #endif /* LINUX_NFS4_PNFS_H */
> >> Index: nfsd/nfs4layoutxdr.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/nfs4layoutxdr.h,v
> >> retrieving revision 1.2
> >> diff -u -r1.2 nfs4layoutxdr.h
> >> --- nfsd/nfs4layoutxdr.h    12 Apr 2006 17:59:58 -0000    1.2
> >> +++ nfsd/nfs4layoutxdr.h    22 Aug 2006 22:12:30 -0000
> >> @@ -62,13 +62,9 @@
> >>      struct xdr_netobj r_addr;
> >>  };
> >> 
> >> -struct nfsd4_pnfs_layoutdevlist {
> >> -    u32     len;
> >> -    u32     *list;
> >> -};
> >> -
> >>  struct nfsd4_pnfs_layoutlist {
> >> -    struct nfsd4_pnfs_layoutdevlist dev_ids;
> >> +    u32                dev_id;
> >> +    u32                             dev_index;
> >>      struct knfsd_fh                 *fhp;
> >>  };
> >> 
> >> @@ -77,6 +73,8 @@
> >>      u32                             lg_commit_through_mds; /* 
> >> response */
> >>      u64                             lg_stripe_unit; /* response */
> >>      u64                             lg_file_size;   /* response */
> >> +    u32                             lg_indexlen;    /* response */
> >> +    u32                *lg_indexlist;  /* response */
> >>      u32                             lg_llistlen;    /* response */
> >>      struct nfsd4_pnfs_layoutlist    *lg_llist;      /* response */
> >>  };
> >> Index: nfsd/nfsd4_pnfs.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/nfsd4_pnfs.h,v
> >> retrieving revision 1.4
> >> diff -u -r1.4 nfsd4_pnfs.h
> >> --- nfsd/nfsd4_pnfs.h    25 Jul 2006 04:35:03 -0000    1.4
> >> +++ nfsd/nfsd4_pnfs.h    22 Aug 2006 22:12:30 -0000
> >> @@ -45,7 +45,7 @@
> >>   * the gd_ops->layout_encode() callback */  struct 
> >> nfsd4_pnfs_devlist {
> >>      u32        dev_id;
> >> -    u32        dev_lotype;
> >> +    u32        dev_type;
> >>      void         *dev_addr;  /* encoded by callback */
> >>  };
> >> 
> >> @@ -56,8 +56,10 @@
> >>      /* nfs4_verifier */
> >>      u64                    gd_verf;        /* request - response */
> >>      struct export_operations    *gd_ops;
> >> +    u32                     gd_dev_type;    /* response */
> >>      u32                gd_devlist_len; /* response */
> >>      struct nfsd4_pnfs_devlist     *gd_devlist;    /*response */
> >> +    u32                gd_eof;
> >>  };
> >> 
> >>  struct nfsd4_pnfs_getdevinfo {
> >> @@ -65,7 +67,9 @@
> >>      u32                             gd_dev_id;    /* request */
> >>      u32                             gd_maxcnt;    /* request */
> >>      struct export_operations    *gd_ops;
> >> -    void                *gd_devaddr;  /*response */
> >> +    u32                     gd_dev_type;    /* response */
> >> +    u32                gd_devlist_len; /* response */
> >> +    void                *gd_devaddr;    /*response */
> >>  };
> >> 
> >>  struct nfsd4_pnfs_layoutget {
> >> Index: nfsd/state.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/state.h,v
> >> retrieving revision 1.7
> >> diff -u -r1.7 state.h
> >> --- nfsd/state.h    25 Jul 2006 04:35:03 -0000    1.7
> >> +++ nfsd/state.h    22 Aug 2006 22:12:30 -0000
> >> @@ -139,7 +139,8 @@
> >> 
> >>  enum layout_recall_type {
> >>      RECALL_FILE = 1,
> >> -    RECALL_FSID = 2
> >> +    RECALL_FSID = 2,
> >> +    RECALL_ALL  = 3
> >>  };
> >> 
> >>  struct nfs4_cb_layout {
> >>
> >> Index: callback.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/callback.h,v
> >> retrieving revision 1.4
> >> diff -u -r1.4 callback.h
> >> --- callback.h    25 Jul 2006 04:35:02 -0000    1.4
> >> +++ callback.h    22 Aug 2006 22:11:58 -0000
> >> @@ -62,7 +62,8 @@
> >>
> >>  enum layout_recall_type {
> >>      RECALL_FILE = 1,
> >> -    RECALL_FSID = 2
> >> +    RECALL_FSID = 2,
> >> +    RECALL_ALL  = 3
> >>  };
> >>
> >>  struct cb_pnfs_layoutrecallargs {
> >> Index: callback_xdr.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/callback_xdr.c,v
> >> retrieving revision 1.5
> >> diff -u -r1.5 callback_xdr.c
> >> --- callback_xdr.c    25 Jul 2006 04:35:02 -0000    1.5
> >> +++ callback_xdr.c    22 Aug 2006 22:11:58 -0000
> >> @@ -228,7 +228,7 @@
> >>          READ64(args->cbl_fsid.major);
> >>          READ64(args->cbl_fsid.minor);
> >>          }
> >> -        else {
> >> +        else if (args->cbl_recall_type == RECALL_FILE) {
> >>          status = decode_fh(xdr, &args->cbl_fh);
> >>          if (unlikely(status != 0))
> >>              goto out;
> >> Index: nfs4filelayout.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4filelayout.c,v
> >> retrieving revision 1.25
> >> diff -u -r1.25 nfs4filelayout.c
> >> --- nfs4filelayout.c    31 Jul 2006 23:32:59 -0000    1.25
> >> +++ nfs4filelayout.c    22 Aug 2006 22:11:58 -0000
> >> @@ -443,6 +443,10 @@
> >>      READ32(fl->commit_through_mds);
> >>      READ64(fl->stripe_unit);
> >>      READ64(fl->file_size);
> >> +    READ32(fl->index_len);
> >> +    if (fl->index_len > 0) { //??? if>0 must build index list
> >> +        printk("filelayout_set_layout: XXX add loop for index
> list\n");
> >> +    }
> >>      READ32(fl->num_devs);
> >>
> >>      dprintk("DEBUG: %s: type %d stripe_unit %lld file_size %lld devs
> 
> >> %d\n", @@ -450,18 +454,11 @@
> >>                  fl->file_size, fl->num_devs);
> >>
> >>      for (i = 0; i < fl->num_devs; i++) {
> >> -        uint32_t devs_per_stripe, j;
> >> -
> >> -        READ32(devs_per_stripe);
> >>
> >>          /* dev_id */
> >>          READ32(fl->devs[i].dev_id);
> >> +        READ32(fl->devs[i].dev_index);
> >>
> >> -        for (j = 1; j < devs_per_stripe; j++) {
> >> -            uint32_t tmp_id;
> >> -            READ32(tmp_id);
> >> -        }
> >> -
> >>          /* fh */
> >>          memset(&fl->devs[i].fh, 0, sizeof(struct nfs_fh));
> >>          READ32(fl->devs[i].fh.size);
> >> Index: nfs4filelayout.h
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4filelayout.h,v
> >> retrieving revision 1.5
> >> diff -u -r1.5 nfs4filelayout.h
> >> --- nfs4filelayout.h    13 Jul 2006 17:18:40 -0000    1.5
> >> +++ nfs4filelayout.h    22 Aug 2006 22:11:58 -0000
> >> @@ -56,6 +56,7 @@
> >>
> >>  struct nfs4_filelayout_devs {
> >>      u32 dev_id;
> >> +    u32 dev_index;
> >>      struct nfs_fh fh;
> >>  };
> >>
> >> @@ -70,6 +71,7 @@
> >>      u32 stripe_type;
> >>      u32 commit_through_mds;
> >>      u64 stripe_unit;
> >> +    unsigned int index_len;
> >>      unsigned int num_devs;
> >>      struct nfs4_filelayout_devs devs[NFS4_PNFS_MAX_DEVS];  };
> >> Index: nfs4xdr.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4xdr.c,v
> >> retrieving revision 1.19
> >> diff -u -r1.19 nfs4xdr.c
> >> --- nfs4xdr.c    13 Jul 2006 17:18:41 -0000    1.19
> >> +++ nfs4xdr.c    22 Aug 2006 22:11:59 -0000
> >> @@ -3787,7 +3787,7 @@
> >>          READ32(res->devs[cnt].dev_id);  /* device id */
> >>
> >>          READ_BUF(4);
> >> -        READ32(res->devs[cnt].layoutclass);
> >> +        READ32(res->devs[cnt].dev_type);
> >>
> >>          READ_BUF(4);
> >>          READ32(len);
> >> @@ -3807,6 +3807,8 @@
> >>          total_len += len;
> >>          cnt++;
> >>      }
> >> +    READ_BUF(4);
> >> +    READ32(res->eof);
> >>
> >>      res->devs_len = total_len;
> >>      return 0;
> >> @@ -3829,7 +3831,13 @@
> >>      READ32(res->dev_id);  /* device id */
> >>
> >>      READ_BUF(4);
> >> -    READ32(res->layoutclass);
> >> +    READ32(res->dev_type);
> >> +
> >> +    READ_BUF(4);
> >> +    READ32(res->dev_count);
> >> +    if (res->dev_count > 1) { //??? if>1 must loop on list
> >> +        printk("decode_getdeviceinfo: XXX add loop \n");
> >> +    }
> >>
> >>      READ_BUF(4);
> >>      READ32(len);
> >> @@ -4820,11 +4828,14 @@
> >>      RESERVE_SPACE(40);
> >>      WRITE32(OP_LAYOUTRETURN);
> >>      WRITE64(args->clientid);
> >> -    WRITE64(args->offset);
> >> -    WRITE64(args->length);
> >>      WRITE32(args->reclaim);
> >> -    WRITE32(args->iomode);
> >>      WRITE32(args->type);
> >> +    WRITE32(args->iomode);
> >> +    if (args->type == LAYOUT_NFSV4_FILES)
> >> +    {
> >> +        WRITE64(args->offset);
> >> +        WRITE64(args->length);
> >> +    }
> >>      return 0;
> >>  }
> >>
> >> Index: nfs4callback.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4callback.c,v
> >> retrieving revision 1.2
> >> diff -u -r1.2 nfs4callback.c
> >> --- nfs4callback.c    25 Jul 2006 04:35:03 -0000    1.2
> >> +++ nfs4callback.c    22 Aug 2006 22:12:16 -0000
> >> @@ -264,7 +264,7 @@
> >>              lr->cbl_layoutchanged, lr->cbl_recall_type,
> >>              lr->cbl_fsid.major, lr->cbl_fsid.minor);
> >>      }
> >> -    else {
> >> +    else if (lr->cbl_recall_type == RECALL_FILE) {
> >>          WRITE32(len);
> >>          WRITEMEM(lr->cbl_fhval, len);
> >>          WRITE64(lr->cbl_offset);
> >> Index: nfs4filelayoutxdr.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4filelayoutxdr.c,v
> >> retrieving revision 1.13
> >> diff -u -r1.13 nfs4filelayoutxdr.c
> >> --- nfs4filelayoutxdr.c    12 Apr 2006 18:03:42 -0000    1.13
> >> +++ nfs4filelayoutxdr.c    22 Aug 2006 22:12:16 -0000
> >> @@ -83,21 +83,14 @@
> >>  static int
> >>  filelayout_encode_layoutlist_item(struct nfsd4_compoundres *resp, 
> >> struct nfsd4_pnfs_layoutlist *item)  {
> >> -    struct nfsd4_pnfs_layoutdevlist *dlist;
> >> -    int i, len;
> >> +    int len;
> >>      unsigned int fhlen = item->fhp->fh_size;
> >> -    u32 *devid;
> >>      ENCODE_HEAD;
> >>
> >> -    dlist = &item->dev_ids;
> >> -    len = 8 + (4 * dlist->len) + fhlen;
> >> +    len = 12 + fhlen;
> >>      RESERVE_SPACE(len);
> >> -    WRITE32(dlist->len);
> >> -
> >> -    devid = dlist->list;
> >> -    for (i=0; i < dlist->len; i++) {
> >> -        WRITE32(devid[i]);
> >> -    }
> >> +    WRITE32(item->dev_id);
> >> +    WRITE32(item->dev_index);
> >>      WRITE32(fhlen);
> >>      WRITEMEM(&item->fhp->fh_base, fhlen);
> >>      ADJUST_ARGS();
> >> @@ -115,7 +108,7 @@
> >>      ENCODE_HEAD;
> >>
> >>      flp = (struct nfsd4_pnfs_filelayout *)layout;
> >> -    len = 28;
> >> +    len = 32;
> >>      RESERVE_SPACE(len + 4);
> >>      totlen = p;     /* fill-in  opaque layout length later*/
> >>      p++;
> >> @@ -123,6 +116,10 @@
> >>      WRITE32(flp->lg_commit_through_mds);
> >>      WRITE64(flp->lg_stripe_unit);
> >>      WRITE64(flp->lg_file_size);
> >> +    WRITE32(flp->lg_indexlen);
> >> +    if (flp->lg_indexlen > 0) {   //??? if>0 must build index list
> >> +        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++) { @@ -147,8 +144,6 @@
> >>          return;
> >>      item = flp->lg_llist;
> >>      for (i=0; i < flp->lg_llistlen; i++) {
> >> -        if (item->dev_ids.list)
> >> -            kfree(item->dev_ids.list);
> >>  #if 0 /* the fh is part of nfsd4_pnfs_layoutget struct */
> >>          if (item->fhp)
> >>              kfree(item->fhp);
> >> Index: nfs4proc.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4proc.c,v
> >> retrieving revision 1.18
> >> diff -u -r1.18 nfs4proc.c
> >> --- nfs4proc.c    13 Jul 2006 17:18:41 -0000    1.18
> >> +++ nfs4proc.c    22 Aug 2006 22:12:16 -0000
> >> @@ -970,7 +970,6 @@
> >>
> >>          /* set the ops for encoding the devaddr */
> >>          gdp->gd_ops = sb->s_export_op;
> >> -
> >>      if (sb && sb->s_export_op->get_deviceinfo) {
> >>          status = sb->s_export_op->get_deviceinfo(sb, (void *)gdp);
> >>
> >> Index: nfs4xdr.c
> >> ===================================================================
> >> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4xdr.c,v
> >> retrieving revision 1.23
> >> diff -u -r1.23 nfs4xdr.c
> >> --- nfs4xdr.c    13 Jul 2006 17:18:41 -0000    1.23
> >> +++ nfs4xdr.c    22 Aug 2006 22:12:16 -0000
> >> @@ -1108,13 +1108,16 @@
> >>  {
> >>      DECODE_HEAD;
> >>
> >> -    READ_BUF(36);
> >> +    READ_BUF(40);
> >>      READ64(lrp->lr_clientid);
> >> -    READ64(lrp->lr_offset);
> >> -    READ64(lrp->lr_length);
> >> -    READ32(lrp->lr_iomode);
> >>      READ32(lrp->lr_reclaim);
> >>      READ32(lrp->lr_type);
> >> +    READ32(lrp->lr_iomode);
> >> +    if (lrp->lr_type == LAYOUT_NFSV4_FILES)
> >> +    {
> >> +        READ64(lrp->lr_offset);
> >> +        READ64(lrp->lr_length);
> >> +    } 
> >>
> >>      DECODE_TAIL;
> >>  }
> >> @@ -1606,6 +1609,7 @@
> >>      BUG_ON(bmval0 & ~NFSD_SUPPORTED_ATTRS_WORD0);
> >>      BUG_ON(bmval1 & ~NFSD_SUPPORTED_ATTRS_WORD1);
> >>
> >> +
> >>      if (exp->ex_fslocs.migrated) {
> >>          status = fattr_handle_absent_fs(&bmval0, &bmval1,
> &rdattr_err);
> >>          if (status)
> >> @@ -2668,16 +2672,15 @@
> >>  }
> >>
> >>  static void
> >> -nfsd4_encode_devlist_item(struct nfsd4_compoundres *resp, struct 
> >> nfsd4_pnfs_devlist *dlist, struct export_operations *ex_ops)
> >> +nfsd4_encode_devlist_item(struct nfsd4_compoundres *resp, struct
> >> nfsd4_pnfs_devlist *dlist, struct export_operations *ex_ops, int 
> >> lotype)  {
> >>      ENCODE_HEAD;
> >>
> >>      RESERVE_SPACE(8);
> >>      WRITE32(dlist->dev_id);
> >> -    WRITE32(dlist->dev_lotype);
> >> +    WRITE32(dlist->dev_type);
> >>      ADJUST_ARGS();
> >> -    if (ex_ops->devaddr_encode == NULL &&
> >> -                dlist->dev_lotype == LAYOUT_NFSV4_FILES)
> >> +    if (ex_ops->devaddr_encode == NULL && lotype == 
> >> + LAYOUT_NFSV4_FILES)
> >>      {
> >>          filelayout_encode_devaddr(resp, dlist->dev_addr);
> >>          filelayout_free_devaddr(dlist->dev_addr);
> >> @@ -2716,9 +2719,13 @@
> >>          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);
> >> +            nfsd4_encode_devlist_item (resp, item, gdevl->gd_ops,
> >> +                                gdevl->gd_type);
> >>              item++;
> >>          }
> >> +        RESERVE_SPACE(4);
> >> +        WRITE32(gdevl->gd_eof);
> >> +        ADJUST_ARGS();
> >>          kfree(gdevl->gd_devlist);
> >>      }
> >>  }
> >> @@ -2736,9 +2743,13 @@
> >>
> >>      printk("%s: err %d\n",__FUNCTION__, nfserr);
> >>      if (!nfserr) {
> >> -        RESERVE_SPACE(8);
> >> +        RESERVE_SPACE(12);
> >>          WRITE32(gdev->gd_dev_id);
> >> -        WRITE32(gdev->gd_type);
> >> +        WRITE32(gdev->gd_dev_type);
> >> +        WRITE32(gdev->gd_devlist_len);
> >> +        if (gdev->gd_devlist_len > 1) { //??? if>1 must build list
> >> +            printk("nfsd4_encode_getdevinfo: XXX add loop list");
> >> +        }
> >>          ADJUST_ARGS();
> >>          if (gdev->gd_ops->devaddr_encode == NULL &&
> >>                      gdev->gd_type == LAYOUT_NFSV4_FILES)
> >>
> >> 
> >> ---------------------------------------------------------------------
> >> ---
> >>
> >> _______________________________________________
> >> pNFS mailing list
> >> pNFS at linux-nfs.org
> >> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> >
> > _______________________________________________
> > pNFS mailing list
> > pNFS at linux-nfs.org
> > http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> 
> [attachment "xdr_patch" deleted by Marc Eshel/Almaden/IBM] 


More information about the pNFS mailing list