[pnfs] [PATCH 09/20] 2.6-latest pnfs client getdeviceinfo
Dean Hildebrand
seattleplus at gmail.com
Fri Nov 30 18:04:40 EST 2007
> 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
>
More information about the pNFS
mailing list