NFSv4.1 Fix gdia_maxcount calculation to fit in ca_maxresponsesize
The GETDEVICEINFO gdia_maxcount represents all of the data being returned within the GETDEVICEINFO4resok structure and includes the XDR overhead. The CREATE_SESSION ca_maxresponsesize is the maximum reply and includes the RPC headers (including security flavor credentials and verifiers). Split out the struct pnfs_device field maxcount which is the gdia_maxcount from the pglen field which is the reply (the total) buffer length. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
committed by
Trond Myklebust
parent
ffa57b9e53
commit
f1c097be2b
@@ -255,6 +255,7 @@ extern int nfs4_decode_dirent(struct xdr_stream *,
|
|||||||
#ifdef CONFIG_NFS_V4_1
|
#ifdef CONFIG_NFS_V4_1
|
||||||
extern const u32 nfs41_maxread_overhead;
|
extern const u32 nfs41_maxread_overhead;
|
||||||
extern const u32 nfs41_maxwrite_overhead;
|
extern const u32 nfs41_maxwrite_overhead;
|
||||||
|
extern const u32 nfs41_maxgetdevinfo_overhead;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* nfs4proc.c */
|
/* nfs4proc.c */
|
||||||
|
@@ -711,6 +711,7 @@ filelayout_get_device_info(struct inode *inode,
|
|||||||
pdev->pgbase = 0;
|
pdev->pgbase = 0;
|
||||||
pdev->pglen = max_resp_sz;
|
pdev->pglen = max_resp_sz;
|
||||||
pdev->mincount = 0;
|
pdev->mincount = 0;
|
||||||
|
pdev->maxcount = max_resp_sz - nfs41_maxgetdevinfo_overhead;
|
||||||
|
|
||||||
rc = nfs4_proc_getdeviceinfo(server, pdev, cred);
|
rc = nfs4_proc_getdeviceinfo(server, pdev, cred);
|
||||||
dprintk("%s getdevice info returns %d\n", __func__, rc);
|
dprintk("%s getdevice info returns %d\n", __func__, rc);
|
||||||
|
@@ -853,6 +853,12 @@ const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH +
|
|||||||
decode_sequence_maxsz +
|
decode_sequence_maxsz +
|
||||||
decode_putfh_maxsz) *
|
decode_putfh_maxsz) *
|
||||||
XDR_UNIT);
|
XDR_UNIT);
|
||||||
|
|
||||||
|
const u32 nfs41_maxgetdevinfo_overhead = ((RPC_MAX_REPHEADER_WITH_AUTH +
|
||||||
|
compound_decode_hdr_maxsz +
|
||||||
|
decode_sequence_maxsz) *
|
||||||
|
XDR_UNIT);
|
||||||
|
EXPORT_SYMBOL_GPL(nfs41_maxgetdevinfo_overhead);
|
||||||
#endif /* CONFIG_NFS_V4_1 */
|
#endif /* CONFIG_NFS_V4_1 */
|
||||||
|
|
||||||
static const umode_t nfs_type2fmt[] = {
|
static const umode_t nfs_type2fmt[] = {
|
||||||
@@ -1889,7 +1895,7 @@ encode_getdeviceinfo(struct xdr_stream *xdr,
|
|||||||
p = xdr_encode_opaque_fixed(p, args->pdev->dev_id.data,
|
p = xdr_encode_opaque_fixed(p, args->pdev->dev_id.data,
|
||||||
NFS4_DEVICEID4_SIZE);
|
NFS4_DEVICEID4_SIZE);
|
||||||
*p++ = cpu_to_be32(args->pdev->layout_type);
|
*p++ = cpu_to_be32(args->pdev->layout_type);
|
||||||
*p++ = cpu_to_be32(args->pdev->pglen); /* gdia_maxcount */
|
*p++ = cpu_to_be32(args->pdev->maxcount); /* gdia_maxcount */
|
||||||
*p++ = cpu_to_be32(0); /* bitmap length 0 */
|
*p++ = cpu_to_be32(0); /* bitmap length 0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -149,9 +149,10 @@ struct pnfs_device {
|
|||||||
struct nfs4_deviceid dev_id;
|
struct nfs4_deviceid dev_id;
|
||||||
unsigned int layout_type;
|
unsigned int layout_type;
|
||||||
unsigned int mincount;
|
unsigned int mincount;
|
||||||
|
unsigned int maxcount; /* gdia_maxcount */
|
||||||
struct page **pages;
|
struct page **pages;
|
||||||
unsigned int pgbase;
|
unsigned int pgbase;
|
||||||
unsigned int pglen;
|
unsigned int pglen; /* reply buffer length */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NFS4_PNFS_GETDEVLIST_MAXNUM 16
|
#define NFS4_PNFS_GETDEVLIST_MAXNUM 16
|
||||||
|
Reference in New Issue
Block a user