[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