|
@@ -2162,22 +2162,20 @@ nfsd4_encode_aclname(struct xdr_stream *xdr, struct svc_rqst *rqstp,
|
|
|
}
|
|
|
|
|
|
static inline __be32
|
|
|
-nfsd4_encode_layout_type(struct xdr_stream *xdr, enum pnfs_layouttype layout_type)
|
|
|
+nfsd4_encode_layout_types(struct xdr_stream *xdr, u32 layout_types)
|
|
|
{
|
|
|
- __be32 *p;
|
|
|
+ __be32 *p;
|
|
|
+ unsigned long i = hweight_long(layout_types);
|
|
|
|
|
|
- if (layout_type) {
|
|
|
- p = xdr_reserve_space(xdr, 8);
|
|
|
- if (!p)
|
|
|
- return nfserr_resource;
|
|
|
- *p++ = cpu_to_be32(1);
|
|
|
- *p++ = cpu_to_be32(layout_type);
|
|
|
- } else {
|
|
|
- p = xdr_reserve_space(xdr, 4);
|
|
|
- if (!p)
|
|
|
- return nfserr_resource;
|
|
|
- *p++ = cpu_to_be32(0);
|
|
|
- }
|
|
|
+ p = xdr_reserve_space(xdr, 4 + 4 * i);
|
|
|
+ if (!p)
|
|
|
+ return nfserr_resource;
|
|
|
+
|
|
|
+ *p++ = cpu_to_be32(i);
|
|
|
+
|
|
|
+ for (i = LAYOUT_NFSV4_1_FILES; i < LAYOUT_TYPE_MAX; ++i)
|
|
|
+ if (layout_types & (1 << i))
|
|
|
+ *p++ = cpu_to_be32(i);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -2752,13 +2750,13 @@ out_acl:
|
|
|
}
|
|
|
#ifdef CONFIG_NFSD_PNFS
|
|
|
if (bmval1 & FATTR4_WORD1_FS_LAYOUT_TYPES) {
|
|
|
- status = nfsd4_encode_layout_type(xdr, exp->ex_layout_type);
|
|
|
+ status = nfsd4_encode_layout_types(xdr, exp->ex_layout_types);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
if (bmval2 & FATTR4_WORD2_LAYOUT_TYPES) {
|
|
|
- status = nfsd4_encode_layout_type(xdr, exp->ex_layout_type);
|
|
|
+ status = nfsd4_encode_layout_types(xdr, exp->ex_layout_types);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
}
|