summaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4xdr.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2016-08-10 15:58:24 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2016-09-19 13:08:35 -0400
commit3132e49ecef9dab43d858d8e7066662c6a1efb16 (patch)
tree48a987372d1e75667b487b1bb8770b7a7b01851a /fs/nfs/nfs4xdr.c
parent2813b626e395f9de1ca0549c1c7d2217c1ce80ea (diff)
pnfs: track multiple layout types in fsinfo structure
Current NFSv4.1/pNFS client assumes that MDS supports only one layout type. While it's true for most existing servers, nevertheless, this can be change in the near future. For now, this patch just plumbs in the ability to track a list of layouts in the fsinfo structure. The existing behavior of the client is preserved, by having it just select the first entry in the list. Signed-off-by: Tigran Mkrtchyan <tigran.mkrtchyan@desy.de> Signed-off-by: Jeff Layton <jlayton@poochiereds.net> Reviewed-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r--fs/nfs/nfs4xdr.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 7bd3a5c09d31..41a02f994976 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -4725,14 +4725,13 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
4725} 4725}
4726 4726
4727/* 4727/*
4728 * Decode potentially multiple layout types. Currently we only support 4728 * Decode potentially multiple layout types.
4729 * one layout driver per file system.
4730 */ 4729 */
4731static int decode_first_pnfs_layout_type(struct xdr_stream *xdr, 4730static int decode_pnfs_layout_types(struct xdr_stream *xdr,
4732 uint32_t *layouttype) 4731 uint32_t *layouttype)
4733{ 4732{
4734 __be32 *p; 4733 __be32 *p;
4735 int num; 4734 uint32_t num, i;
4736 4735
4737 p = xdr_inline_decode(xdr, 4); 4736 p = xdr_inline_decode(xdr, 4);
4738 if (unlikely(!p)) 4737 if (unlikely(!p))
@@ -4741,18 +4740,17 @@ static int decode_first_pnfs_layout_type(struct xdr_stream *xdr,
4741 4740
4742 /* pNFS is not supported by the underlying file system */ 4741 /* pNFS is not supported by the underlying file system */
4743 if (num == 0) { 4742 if (num == 0) {
4744 *layouttype = 0;
4745 return 0; 4743 return 0;
4746 } 4744 }
4747 if (num > 1) 4745 if (num > NFS_MAX_LAYOUT_TYPES)
4748 printk(KERN_INFO "NFS: %s: Warning: Multiple pNFS layout " 4746 printk(KERN_INFO "NFS: %s: Warning: Too many (%d) pNFS layout types\n", __func__, num);
4749 "drivers per filesystem not supported\n", __func__);
4750 4747
4751 /* Decode and set first layout type, move xdr->p past unused types */ 4748 /* Decode and set first layout type, move xdr->p past unused types */
4752 p = xdr_inline_decode(xdr, num * 4); 4749 p = xdr_inline_decode(xdr, num * 4);
4753 if (unlikely(!p)) 4750 if (unlikely(!p))
4754 goto out_overflow; 4751 goto out_overflow;
4755 *layouttype = be32_to_cpup(p); 4752 for(i = 0; i < num && i < NFS_MAX_LAYOUT_TYPES; i++)
4753 layouttype[i] = be32_to_cpup(p++);
4756 return 0; 4754 return 0;
4757out_overflow: 4755out_overflow:
4758 print_overflow_msg(__func__, xdr); 4756 print_overflow_msg(__func__, xdr);
@@ -4772,10 +4770,9 @@ static int decode_attr_pnfstype(struct xdr_stream *xdr, uint32_t *bitmap,
4772 if (unlikely(bitmap[1] & (FATTR4_WORD1_FS_LAYOUT_TYPES - 1U))) 4770 if (unlikely(bitmap[1] & (FATTR4_WORD1_FS_LAYOUT_TYPES - 1U)))
4773 return -EIO; 4771 return -EIO;
4774 if (bitmap[1] & FATTR4_WORD1_FS_LAYOUT_TYPES) { 4772 if (bitmap[1] & FATTR4_WORD1_FS_LAYOUT_TYPES) {
4775 status = decode_first_pnfs_layout_type(xdr, layouttype); 4773 status = decode_pnfs_layout_types(xdr, layouttype);
4776 bitmap[1] &= ~FATTR4_WORD1_FS_LAYOUT_TYPES; 4774 bitmap[1] &= ~FATTR4_WORD1_FS_LAYOUT_TYPES;
4777 } else 4775 }
4778 *layouttype = 0;
4779 return status; 4776 return status;
4780} 4777}
4781 4778
@@ -4856,7 +4853,7 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
4856 status = decode_attr_time_delta(xdr, bitmap, &fsinfo->time_delta); 4853 status = decode_attr_time_delta(xdr, bitmap, &fsinfo->time_delta);
4857 if (status != 0) 4854 if (status != 0)
4858 goto xdr_error; 4855 goto xdr_error;
4859 status = decode_attr_pnfstype(xdr, bitmap, &fsinfo->layouttype); 4856 status = decode_attr_pnfstype(xdr, bitmap, fsinfo->layouttype);
4860 if (status != 0) 4857 if (status != 0)
4861 goto xdr_error; 4858 goto xdr_error;
4862 4859