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>
This commit is contained in:

committed by
Anna Schumaker

parent
2813b626e3
commit
3132e49ece
@@ -4725,14 +4725,13 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode potentially multiple layout types. Currently we only support
|
||||
* one layout driver per file system.
|
||||
* Decode potentially multiple layout types.
|
||||
*/
|
||||
static int decode_first_pnfs_layout_type(struct xdr_stream *xdr,
|
||||
static int decode_pnfs_layout_types(struct xdr_stream *xdr,
|
||||
uint32_t *layouttype)
|
||||
{
|
||||
__be32 *p;
|
||||
int num;
|
||||
uint32_t num, i;
|
||||
|
||||
p = xdr_inline_decode(xdr, 4);
|
||||
if (unlikely(!p))
|
||||
@@ -4741,18 +4740,17 @@ static int decode_first_pnfs_layout_type(struct xdr_stream *xdr,
|
||||
|
||||
/* pNFS is not supported by the underlying file system */
|
||||
if (num == 0) {
|
||||
*layouttype = 0;
|
||||
return 0;
|
||||
}
|
||||
if (num > 1)
|
||||
printk(KERN_INFO "NFS: %s: Warning: Multiple pNFS layout "
|
||||
"drivers per filesystem not supported\n", __func__);
|
||||
if (num > NFS_MAX_LAYOUT_TYPES)
|
||||
printk(KERN_INFO "NFS: %s: Warning: Too many (%d) pNFS layout types\n", __func__, num);
|
||||
|
||||
/* Decode and set first layout type, move xdr->p past unused types */
|
||||
p = xdr_inline_decode(xdr, num * 4);
|
||||
if (unlikely(!p))
|
||||
goto out_overflow;
|
||||
*layouttype = be32_to_cpup(p);
|
||||
for(i = 0; i < num && i < NFS_MAX_LAYOUT_TYPES; i++)
|
||||
layouttype[i] = be32_to_cpup(p++);
|
||||
return 0;
|
||||
out_overflow:
|
||||
print_overflow_msg(__func__, xdr);
|
||||
@@ -4772,10 +4770,9 @@ static int decode_attr_pnfstype(struct xdr_stream *xdr, uint32_t *bitmap,
|
||||
if (unlikely(bitmap[1] & (FATTR4_WORD1_FS_LAYOUT_TYPES - 1U)))
|
||||
return -EIO;
|
||||
if (bitmap[1] & FATTR4_WORD1_FS_LAYOUT_TYPES) {
|
||||
status = decode_first_pnfs_layout_type(xdr, layouttype);
|
||||
status = decode_pnfs_layout_types(xdr, layouttype);
|
||||
bitmap[1] &= ~FATTR4_WORD1_FS_LAYOUT_TYPES;
|
||||
} else
|
||||
*layouttype = 0;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -4856,7 +4853,7 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
|
||||
status = decode_attr_time_delta(xdr, bitmap, &fsinfo->time_delta);
|
||||
if (status != 0)
|
||||
goto xdr_error;
|
||||
status = decode_attr_pnfstype(xdr, bitmap, &fsinfo->layouttype);
|
||||
status = decode_attr_pnfstype(xdr, bitmap, fsinfo->layouttype);
|
||||
if (status != 0)
|
||||
goto xdr_error;
|
||||
|
||||
|
Reference in New Issue
Block a user