diff options
author | Andy Adamson <andros@netapp.com> | 2013-06-25 19:02:53 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-06-28 15:34:43 -0400 |
commit | f1c097be2b35dcfc06c1c591194d78058dd67284 (patch) | |
tree | 62c9361ea865c30757d0400dbadb1676b3bfb72e /fs/nfs | |
parent | ffa57b9e53cf7ace3e63e5fa9f91ffb31e0aacf6 (diff) |
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>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/internal.h | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4filelayoutdev.c | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4xdr.c | 8 | ||||
-rw-r--r-- | fs/nfs/pnfs.h | 3 |
4 files changed, 11 insertions, 2 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 91e59a39fc08..4bd53f4e0fd2 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
@@ -255,6 +255,7 @@ extern int nfs4_decode_dirent(struct xdr_stream *, | |||
255 | #ifdef CONFIG_NFS_V4_1 | 255 | #ifdef CONFIG_NFS_V4_1 |
256 | extern const u32 nfs41_maxread_overhead; | 256 | extern const u32 nfs41_maxread_overhead; |
257 | extern const u32 nfs41_maxwrite_overhead; | 257 | extern const u32 nfs41_maxwrite_overhead; |
258 | extern const u32 nfs41_maxgetdevinfo_overhead; | ||
258 | #endif | 259 | #endif |
259 | 260 | ||
260 | /* nfs4proc.c */ | 261 | /* nfs4proc.c */ |
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c index 0493dbd129c5..95604f64cab8 100644 --- a/fs/nfs/nfs4filelayoutdev.c +++ b/fs/nfs/nfs4filelayoutdev.c | |||
@@ -711,6 +711,7 @@ filelayout_get_device_info(struct inode *inode, | |||
711 | pdev->pgbase = 0; | 711 | pdev->pgbase = 0; |
712 | pdev->pglen = max_resp_sz; | 712 | pdev->pglen = max_resp_sz; |
713 | pdev->mincount = 0; | 713 | pdev->mincount = 0; |
714 | pdev->maxcount = max_resp_sz - nfs41_maxgetdevinfo_overhead; | ||
714 | 715 | ||
715 | rc = nfs4_proc_getdeviceinfo(server, pdev, cred); | 716 | rc = nfs4_proc_getdeviceinfo(server, pdev, cred); |
716 | dprintk("%s getdevice info returns %d\n", __func__, rc); | 717 | dprintk("%s getdevice info returns %d\n", __func__, rc); |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 4be8d135ed61..27cc76d88f9a 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -853,6 +853,12 @@ const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH + | |||
853 | decode_sequence_maxsz + | 853 | decode_sequence_maxsz + |
854 | decode_putfh_maxsz) * | 854 | decode_putfh_maxsz) * |
855 | XDR_UNIT); | 855 | XDR_UNIT); |
856 | |||
857 | const u32 nfs41_maxgetdevinfo_overhead = ((RPC_MAX_REPHEADER_WITH_AUTH + | ||
858 | compound_decode_hdr_maxsz + | ||
859 | decode_sequence_maxsz) * | ||
860 | XDR_UNIT); | ||
861 | EXPORT_SYMBOL_GPL(nfs41_maxgetdevinfo_overhead); | ||
856 | #endif /* CONFIG_NFS_V4_1 */ | 862 | #endif /* CONFIG_NFS_V4_1 */ |
857 | 863 | ||
858 | static const umode_t nfs_type2fmt[] = { | 864 | static const umode_t nfs_type2fmt[] = { |
@@ -1889,7 +1895,7 @@ encode_getdeviceinfo(struct xdr_stream *xdr, | |||
1889 | p = xdr_encode_opaque_fixed(p, args->pdev->dev_id.data, | 1895 | p = xdr_encode_opaque_fixed(p, args->pdev->dev_id.data, |
1890 | NFS4_DEVICEID4_SIZE); | 1896 | NFS4_DEVICEID4_SIZE); |
1891 | *p++ = cpu_to_be32(args->pdev->layout_type); | 1897 | *p++ = cpu_to_be32(args->pdev->layout_type); |
1892 | *p++ = cpu_to_be32(args->pdev->pglen); /* gdia_maxcount */ | 1898 | *p++ = cpu_to_be32(args->pdev->maxcount); /* gdia_maxcount */ |
1893 | *p++ = cpu_to_be32(0); /* bitmap length 0 */ | 1899 | *p++ = cpu_to_be32(0); /* bitmap length 0 */ |
1894 | } | 1900 | } |
1895 | 1901 | ||
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 1441dff9b0e7..a4f41810a7f4 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h | |||
@@ -149,9 +149,10 @@ struct pnfs_device { | |||
149 | struct nfs4_deviceid dev_id; | 149 | struct nfs4_deviceid dev_id; |
150 | unsigned int layout_type; | 150 | unsigned int layout_type; |
151 | unsigned int mincount; | 151 | unsigned int mincount; |
152 | unsigned int maxcount; /* gdia_maxcount */ | ||
152 | struct page **pages; | 153 | struct page **pages; |
153 | unsigned int pgbase; | 154 | unsigned int pgbase; |
154 | unsigned int pglen; | 155 | unsigned int pglen; /* reply buffer length */ |
155 | }; | 156 | }; |
156 | 157 | ||
157 | #define NFS4_PNFS_GETDEVLIST_MAXNUM 16 | 158 | #define NFS4_PNFS_GETDEVLIST_MAXNUM 16 |