[pnfs] [PATCH 09/20] 2.6-latest pnfs client getdeviceinfo

William A. (Andy) Adamson andros at citi.umich.edu
Sat Dec 1 12:54:55 EST 2007


sure - i see your point. i just got tired of figuring out how many ->mountid
i needed, so i made a macro.

i'll change it to:

@@ -21,6 +21,9 @@
>  #define NFS4_PNFS_MAX_STRIPE_COUNT 16
>  #define NFS4_PNFS_MAX_MULTI_DS   2
>
> +
> +#define FILE_MOUNT(inode) ((struct filelayout_mount_type
*)(NFS_SERVER(inode)->pnfs_mountid->mountid))

-->Andy

On Nov 30, 2007 6:04 PM, Dean Hildebrand <seattleplus at gmail.com> wrote:

>
> > diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
> > index c3db428..93ba961 100644
> > --- a/fs/nfs/nfs4filelayout.c
> > +++ b/fs/nfs/nfs4filelayout.c
> > @@ -540,7 +540,7 @@ filelayout_commit(struct pnfs_layout_type *
> layoutid, struct inode* ino, struct
> >               nfs_execute_write(data);
> >               return 0;
> >       }
> > -     dev = nfs4_pnfs_device_item_get(layoutid, nfslay->dev_id);
> > +     dev = nfs4_pnfs_device_item_get(ino, nfslay->dev_id);
> >       fdev = &dev->stripe_devs[0];
> >
> >       for (i = 0; i < nfslay->num_fh; i++) {
> > diff --git a/fs/nfs/nfs4filelayout.h b/fs/nfs/nfs4filelayout.h
> > index d181473..b5e6c2f 100644
> > --- a/fs/nfs/nfs4filelayout.h
> > +++ b/fs/nfs/nfs4filelayout.h
> > @@ -21,6 +21,9 @@
> >  #define NFS4_PNFS_MAX_STRIPE_CNT 16
> >  #define NFS4_PNFS_MAX_MULTI_DS   2
> >
> > +
> > +#define FILE_MT(inode) ((struct filelayout_mount_type
> *)(NFS_SERVER(inode)->pnfs_mountid->mountid))
> > +
> >
> I would prefer to not get into the business of removing a few vowels
> here and a few letters there.  DS for data server is good as there is a
> significant reduction in length.  MT for mount is an unecessary abbrev.
> I would have to say the same thing for CNT above.
> I would suggest we use mount and count or, at the very minimum, mnt and
> cnt.
> Dean
>
>
> >  struct nfs4_session *nfs41_alloc_session(void);
> >  int _nfs4_proc_create_session(struct nfs_client *clp, struct
> nfs4_session *session,
> >                                  struct rpc_clnt *clnt);
> > @@ -105,10 +108,8 @@ int nfs4_pnfs_dserver_get(struct inode *inode,
> >                         struct nfs4_pnfs_dserver *dserver);
> >  int decode_and_add_devicelist(struct filelayout_mount_type *mt, struct
> pnfs_devicelist* devlist);
> >
> > -struct nfs4_pnfs_dev *
> > -nfs4_pnfs_device_get(struct inode *inode, u32 dev_id, u32
> stripe_index);
> >  struct nfs4_pnfs_dev_item *
> > -nfs4_pnfs_device_item_get(struct pnfs_layout_type *ltype, u32 dev_id);
> > +nfs4_pnfs_device_item_get(struct inode *inode, u32 dev_id);
> >
> >
> >  #define READ32(x)         (x) = ntohl(*p++)
> > diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
> > index e761546..b175fb9 100644
> > --- a/fs/nfs/nfs4filelayoutdev.c
> > +++ b/fs/nfs/nfs4filelayoutdev.c
> > @@ -598,18 +598,21 @@ decode_and_add_devicelist(struct
> filelayout_mount_type *mt, struct pnfs_deviceli
> >   * of available devices, and return it.
> >   */
> >  static struct nfs4_pnfs_dev_item *
> > -get_device_info(struct filelayout_mount_type *mt, u32 dev_id)
> > +get_device_info(struct inode *inode, u32 dev_id)
> >  {
> > -     int rc;
> > +     struct filelayout_mount_type *mt = FILE_MT(inode);
> >       struct pnfs_device *pdev = NULL;
> > +     int rc;
> >
> > +     dprintk("%s mt %p\n", __func__, mt);
> >       if ((pdev = kmalloc(sizeof(struct pnfs_device), GFP_KERNEL)) ==
> NULL) {
> >               return NULL;
> >       }
> >
> >       pdev->dev_id = dev_id;
> >
> > -     rc = pnfs_callback_ops->nfs_getdeviceinfo(mt->fl_sb, dev_id,
> pdev);
> > +     rc = pnfs_callback_ops->nfs_getdeviceinfo(inode, dev_id, pdev);
> > +     dprintk("%s getdevice info returns %d\n", __func__, rc);
> >       if (rc) {
> >               kfree(pdev);
> >               return NULL;
> > @@ -622,42 +625,20 @@ get_device_info(struct filelayout_mount_type *mt,
> u32 dev_id)
> >  }
> >
> >  struct nfs4_pnfs_dev_item *
> > -nfs4_pnfs_device_item_get(struct pnfs_layout_type *ltype, u32 dev_id)
> > +nfs4_pnfs_device_item_get(struct inode *inode, u32 dev_id)
> >  {
> > -     struct filelayout_mount_type *mt;
> > +     struct filelayout_mount_type *mt = FILE_MT(inode);
> >       struct nfs4_pnfs_dev_item *dev;
> >
> > -     mt = (struct filelayout_mount_type *)ltype->mountid->mountid;
> > -
> >       read_lock(&mt->hlist->dev_lock);
> >       dev = _device_lookup(mt->hlist, dev_id);
> >       read_unlock(&mt->hlist->dev_lock);
> >
> >       if (dev == NULL)
> > -             dev = get_device_info(mt, dev_id);
> > +             dev = get_device_info(inode, dev_id);
> >       return dev;
> >  }
> >
> > -/* Lookup and return the data server struct
> > - */
> > -struct nfs4_pnfs_dev *
> > -nfs4_pnfs_device_get(struct inode *inode, u32 dev_id, u32 stripe_idx)
> > -{
> > -     struct nfs4_pnfs_dev_item *dev;
> > -     struct nfs_server* server = NFS_SERVER(inode);
> > -     struct filelayout_mount_type *mt;
> > -
> > -     mt = (struct filelayout_mount_type*)server->pnfs_mountid->mountid;
> > -
> > -     read_lock(&mt->hlist->dev_lock);
> > -     dev = _device_lookup(mt->hlist, dev_id);
> > -     read_unlock(&mt->hlist->dev_lock);
> > -     if (dev == NULL)
> > -             dev = get_device_info(mt, dev_id);
> > -
> > -     return &dev->stripe_devs[stripe_idx];
> > -}
> > -
> >  /* Retrieve the rpc client for a specified byte range
> >   * in 'inode' by filling in the contents of 'dserver'.
> >   */
> > @@ -692,9 +673,11 @@ nfs4_pnfs_dserver_get(struct inode *inode,
> >
> >       BUG_ON(dbg_stripe_idx != stripe_idx);
> >
> > +     /* TODO: rewrite this function!
> >       dserver->dev = nfs4_pnfs_device_get(inode, layout->dev_id,
> stripe_idx);
> >       if (dserver->dev == NULL)
> >               return 1;
> > +     */
> >       dserver->fh = &layout->fh_array[stripe_idx];
> >
> >       dprintk("%s: dev_id=%u, idx=%u, offset=%Lu, count=%u\n",
> > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > index f78d4ef..d446721 100644
> > --- a/fs/nfs/nfs4proc.c
> > +++ b/fs/nfs/nfs4proc.c
> > @@ -5029,12 +5029,32 @@ int nfs4_pnfs_getdevicelist(struct nfs_fh *fh,
> >       return err;
> >  }
> >
> > -int nfs4_pnfs_getdeviceinfo(struct nfs_server *server,
> > +int nfs4_pnfs_getdeviceinfo(struct inode *inode,
> >                           u32 dev_id,
> > -                         struct pnfs_device* res)
> > +                         struct pnfs_device* dev)
> >  {
> > -     /* XXX Need to implement */
> > -     return -1;
> > +     struct nfs_server *server = NFS_SERVER(inode);
> > +     struct nfs4_pnfs_getdeviceinfo_arg args = {
> > +             .fh = NFS_FH(inode),
> > +             .dev_id = dev_id,
> > +             .layoutclass = server->pnfs_curr_ld->id,
> > +     };
> > +     struct nfs4_pnfs_getdeviceinfo_res res = {
> > +             .dev = dev,
> > +     };
> > +     struct rpc_message msg = {
> > +             .rpc_proc =
> &nfs4_procedures[NFSPROC4_CLNT_PNFS_GETDEVICEINFO],
> > +             .rpc_argp = &args,
> > +             .rpc_resp = &res,
> > +     };
> > +
> > +     int status = -ENOMEM;
> > +
> > +     NFS4_VALIDATE_STATE(server);
> > +     status = NFS4_RPC_CALL_SYNC(server, server->client, &msg, &args,
> > +                                                             &res, 0);
> > +
> > +     return status;
> >  }
> >
> >  #endif /* CONFIG_PNFS */
> > diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> > index 74963db..556ac0a 100644
> > --- a/fs/nfs/nfs4xdr.c
> > +++ b/fs/nfs/nfs4xdr.c
> > @@ -274,6 +274,9 @@ static int nr_sequence_quads = 0;
> >                                  (NFS4_VERIFIER_SIZE >> 2))
> >  #define decode_getdevicelist_maxsz (op_decode_hdr_maxsz + 5 + 2 +
>  \
> >
>  NFS4_PNFS_DEV_MAXCOUNT*NFS4_PNFS_DEV_MAXSIZE)
> > +#define encode_getdeviceinfo_maxsz (op_encode_hdr_maxsz + 2)
> > +#define decode_getdeviceinfo_maxsz (op_decode_hdr_maxsz + 3 + \
> > +                                NFS4_PNFS_DEV_MAXSIZE)
> >  #define encode_pnfs_layoutget_sz (op_encode_hdr_maxsz + 13)
> >  #define decode_pnfs_layoutget_maxsz (op_decode_hdr_maxsz + 8)
> >  #endif /* CONFIG_PNFS */
> > @@ -723,6 +726,14 @@ static int nr_sequence_quads = 0;
> >                                       decode_sequence_maxsz + \
> >                                       decode_putfh_maxsz + \
> >                                       decode_getdevicelist_maxsz)
> > +#define NFS41_enc_pnfs_getdeviceinfo_sz      (compound_encode_hdr_maxsz
> +    \
> > +                                     encode_sequence_maxsz +\
> > +                                     encode_putfh_maxsz +            \
> > +                                     encode_getdeviceinfo_maxsz)
> > +#define NFS41_dec_pnfs_getdeviceinfo_sz      (compound_decode_hdr_maxsz
> +    \
> > +                                     decode_sequence_maxsz + \
> > +                                     decode_putfh_maxsz +            \
> > +                                     decode_getdeviceinfo_maxsz)
> >  #define NFS41_enc_pnfs_layoutget_sz (compound_encode_hdr_maxsz + \
> >                                   encode_sequence_maxsz +\
> >                                      encode_putfh_maxsz +        \
> > @@ -1728,6 +1739,20 @@ static int encode_getdevicelist(struct xdr_stream
> *xdr, const struct nfs4_pnfs_g
> >  }
> >
> >  /*
> > + * Encode request to get information for a specific device.
> > + */
> > +static int encode_getdeviceinfo(struct xdr_stream *xdr, const struct
> nfs4_pnfs_getdeviceinfo_arg *args)
> > +{
> > +     uint32_t *p;
> > +     RESERVE_SPACE(16);
> > +     WRITE32(OP_GETDEVICEINFO);
> > +     WRITE32(args->dev_id);
> > +     WRITE32(args->layoutclass);
> > +     WRITE32(NFS4_PNFS_DEV_MAXSIZE);
> > +     return 0;
> > +}
> > +
> > +/*
> >   * Encode request to get pNFS layout.  Sent to the MDS
> >   */
> >  static int encode_pnfs_layoutget(struct xdr_stream *xdr, const struct
> nfs4_pnfs_layoutget_arg *args)
> > @@ -3369,6 +3394,30 @@ out:
> >  }
> >
> >  /*
> > + * Encode GETDEVICEINFO request
> > + */
> > +static int nfs41_xdr_enc_pnfs_getdeviceinfo(struct rpc_rqst *req,
> > +uint32_t *p,
> > +struct nfs4_pnfs_getdeviceinfo_arg *args)
> > +{
> > +     struct xdr_stream xdr;
> > +     struct compound_hdr hdr = {
> > +             .nops = 3,
> > +     };
> > +     int status;
> > +
> > +     xdr_init_encode(&xdr, &req->rq_snd_buf, p);
> > +     encode_compound_hdr(&xdr, &hdr, 1);
> > +     encode_sequence(&xdr, &args->seq_args);
> > +     status = encode_putfh(&xdr, args->fh);
> > +     if (status != 0)
> > +             goto out;
> > +     status = encode_getdeviceinfo(&xdr, args);
> > +out:
> > +     return status;
> > +}
> > +
> > +/*
> >   *  Encode LAYOUTGET request
> >   */
> >  static int nfs41_xdr_enc_pnfs_layoutget(struct rpc_rqst *req, uint32_t
> *p, struct nfs4_pnfs_layoutget_arg *args)
> > @@ -5228,6 +5277,32 @@ static int decode_getdevicelist(struct xdr_stream
> *xdr, struct pnfs_devicelist *
> >  }
> >
> >  /*
> > + * Decode GETDEVICEINFO reply
> > + */
> > +static int decode_getdeviceinfo(struct xdr_stream *xdr,
> > +struct pnfs_device *res)
> > +{
> > +     uint32_t *p;
> > +     uint32_t len, type;
> > +     int status;
> > +
> > +     status = decode_op_hdr(xdr, OP_GETDEVICEINFO);
> > +     if (status)
> > +             return status;
> > +
> > +     READ_BUF(4);    /* TODO: confirm layout type */
> > +     READ32(type);
> > +     READ_BUF(4);
> > +     READ32(len);
> > +     READ_BUF(len);
> > +
> > +     COPYMEM(&res->dev_addr_buf, len);
> > +     res->dev_addr_len = len;
> > +
> > +     return 0;
> > +}
> > +
> > +/*
> >   * Decode LAYOUT_GET reply
> >   */
> >  static int decode_pnfs_layoutget(struct xdr_stream *xdr, struct
> rpc_rqst *req, struct nfs4_pnfs_layoutget_res *res)
> > @@ -7094,6 +7169,30 @@ out:
> >  }
> >
> >  /*
> > + * Decode GETDEVINFO response
> > + */
> > +static int nfs41_xdr_dec_pnfs_getdeviceinfo(struct rpc_rqst *rqstp,
> uint32_t *p, struct nfs4_pnfs_getdeviceinfo_res *res)
> > +{
> > +     struct xdr_stream xdr;
> > +     struct compound_hdr hdr;
> > +     int status;
> > +
> > +     xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
> > +     status = decode_compound_hdr(&xdr, &hdr);
> > +     if (status != 0)
> > +             goto out;
> > +     status = decode_sequence(&xdr, &res->seq_res);
> > +     if (status != 0)
> > +             goto out;
> > +     status = decode_putfh(&xdr);
> > +     if (status != 0)
> > +             goto out;
> > +     status = decode_getdeviceinfo(&xdr, res->dev);
> > +out:
> > +     return status;
> > +}
> > +
> > +/*
> >   * Decode LAYOUTGET response
> >   */
> >  static int nfs41_xdr_dec_pnfs_layoutget(struct rpc_rqst *rqstp,
> uint32_t *p, struct nfs4_pnfs_layoutget_res *res)
> > @@ -7332,6 +7431,7 @@ struct rpc_procinfo     nfs41_procedures[] = {
> >    PROC(GET_LEASE_TIME,       enc_get_lease_time,
> dec_get_lease_time, 1),
> >  #if defined (CONFIG_PNFS)
> >    PROC(PNFS_GETDEVICELIST, enc_pnfs_getdevicelist,
> dec_pnfs_getdevicelist, 1),
> > +  PROC(PNFS_GETDEVICEINFO, enc_pnfs_getdeviceinfo,
> dec_pnfs_getdeviceinfo, 1),
> >    PROC(PNFS_LAYOUTGET,       enc_pnfs_layoutget,
> dec_pnfs_layoutget, 1),
> >  #endif /* CONFIG_PNFS */
> >  };
> > diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> > index d411c45..3f765ad 100644
> > --- a/fs/nfs/pnfs.c
> > +++ b/fs/nfs/pnfs.c
> > @@ -57,7 +57,7 @@
> >  extern int nfs_fsync(struct file *file, struct dentry *dentry, int
> datasync);
> >  extern int nfs4_pnfs_getdevicelist(struct nfs_fh *fh, struct nfs_server
> *server,
> >                                  struct pnfs_devicelist* devlist);
> > -extern int nfs4_pnfs_getdeviceinfo(struct nfs_server *server, u32
> dev_id,
> > +extern int nfs4_pnfs_getdeviceinfo(struct inode *inode, u32 dev_id,
> >                                  struct pnfs_device *res);
> >  extern void nfs_execute_write(struct nfs_write_data *data);
> >  extern void nfs_commit_rpcsetup(struct nfs_write_data *data, int sync);
> > @@ -1273,12 +1273,11 @@ pnfs_getdevicelist(struct super_block *sb,
> struct nfs_fh *fh, struct pnfs_device
> >  /* Retrieve the device information for a device.
> >   */
> >  int
> > -pnfs_getdeviceinfo(struct super_block *sb, u32 dev_id, struct
> pnfs_device* dev)
> > +pnfs_getdeviceinfo(struct inode *inode, u32 dev_id, struct pnfs_device*
> dev)
> >  {
> > -     struct nfs_server *server = NFS_SB(sb);
> >       int rc;
> >
> > -     rc = nfs4_pnfs_getdeviceinfo(server, dev_id, dev);
> > +     rc = nfs4_pnfs_getdeviceinfo(inode, dev_id, dev);
> >
> >       return rc;
> >  }
> > diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
> > index b59ee2b..67bc533 100644
> > --- a/include/linux/nfs4_pnfs.h
> > +++ b/include/linux/nfs4_pnfs.h
> > @@ -144,7 +144,7 @@ struct pnfs_devicelist {
> >  struct pnfs_client_operations {
> >       int (*nfs_fsync) (struct file * file, struct dentry * dentry, int
> datasync);
> >       int (*nfs_getdevicelist) (struct super_block * sb, struct nfs_fh
> *fh, struct pnfs_devicelist* devlist);
> > -     int (*nfs_getdeviceinfo) (struct super_block * sb, u32 dev_id,
> struct pnfs_device * dev);
> > +     int (*nfs_getdeviceinfo) (struct inode * inode, u32 dev_id, struct
> pnfs_device * dev);
> >
> >          /* Post read callback.  Layout driver calls this function if
> unstable data was
> >        * written and requires a commit call
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://linux-nfs.org/pipermail/pnfs/attachments/20071201/c5cf6e1b/attachment-0001.htm 


More information about the pNFS mailing list