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

Iyer, Rahul Rahul.Iyer at netapp.com
Wed Aug 30 20:59:55 EDT 2006


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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: xdr_patch
Type: application/octet-stream
Size: 4361 bytes
Desc: xdr_patch
Url : http://linux-nfs.org/pipermail/pnfs/attachments/20060830/164097b0/xdr_patch-0001.obj


More information about the pNFS mailing list