diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/nfsd/const.h | 15 | ||||
-rw-r--r-- | include/linux/sunrpc/auth.h | 3 | ||||
-rw-r--r-- | include/linux/sunrpc/msg_prot.h | 40 | ||||
-rw-r--r-- | include/linux/sunrpc/svc.h | 23 | ||||
-rw-r--r-- | include/linux/sunrpc/xprt.h | 8 |
5 files changed, 77 insertions, 12 deletions
diff --git a/include/linux/nfsd/const.h b/include/linux/nfsd/const.h index b75bb1b38d09..adbddf007898 100644 --- a/include/linux/nfsd/const.h +++ b/include/linux/nfsd/const.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/nfs2.h> | 13 | #include <linux/nfs2.h> |
14 | #include <linux/nfs3.h> | 14 | #include <linux/nfs3.h> |
15 | #include <linux/nfs4.h> | 15 | #include <linux/nfs4.h> |
16 | #include <linux/sunrpc/msg_prot.h> | ||
16 | 17 | ||
17 | /* | 18 | /* |
18 | * Maximum protocol version supported by knfsd | 19 | * Maximum protocol version supported by knfsd |
@@ -23,6 +24,8 @@ | |||
23 | * Maximum blocksize supported by daemon currently at 32K | 24 | * Maximum blocksize supported by daemon currently at 32K |
24 | */ | 25 | */ |
25 | #define NFSSVC_MAXBLKSIZE (32*1024) | 26 | #define NFSSVC_MAXBLKSIZE (32*1024) |
27 | /* NFSv2 is limited by the protocol specification, see RFC 1094 */ | ||
28 | #define NFSSVC_MAXBLKSIZE_V2 (8*1024) | ||
26 | 29 | ||
27 | #ifdef __KERNEL__ | 30 | #ifdef __KERNEL__ |
28 | 31 | ||
@@ -30,7 +33,17 @@ | |||
30 | # define NFS_SUPER_MAGIC 0x6969 | 33 | # define NFS_SUPER_MAGIC 0x6969 |
31 | #endif | 34 | #endif |
32 | 35 | ||
33 | #define NFSD_BUFSIZE (1024 + NFSSVC_MAXBLKSIZE) | 36 | /* |
37 | * Largest number of bytes we need to allocate for an NFS | ||
38 | * call or reply. Used to control buffer sizes. We use | ||
39 | * the length of v3 WRITE, READDIR and READDIR replies | ||
40 | * which are an RPC header, up to 26 XDR units of reply | ||
41 | * data, and some page data. | ||
42 | * | ||
43 | * Note that accuracy here doesn't matter too much as the | ||
44 | * size is rounded up to a page size when allocating space. | ||
45 | */ | ||
46 | #define NFSD_BUFSIZE ((RPC_MAX_HEADER_WITH_AUTH+26)*XDR_UNIT + NFSSVC_MAXBLKSIZE) | ||
34 | 47 | ||
35 | #ifdef CONFIG_NFSD_V4 | 48 | #ifdef CONFIG_NFSD_V4 |
36 | # define NFSSVC_XDRSIZE NFS4_SVC_XDRSIZE | 49 | # define NFSSVC_XDRSIZE NFS4_SVC_XDRSIZE |
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index 862c0d8c8381..534cdc7be58d 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
@@ -20,9 +20,6 @@ | |||
20 | /* size of the nodename buffer */ | 20 | /* size of the nodename buffer */ |
21 | #define UNX_MAXNODENAME 32 | 21 | #define UNX_MAXNODENAME 32 |
22 | 22 | ||
23 | /* Maximum size (in bytes) of an rpc credential or verifier */ | ||
24 | #define RPC_MAX_AUTH_SIZE (400) | ||
25 | |||
26 | /* Work around the lack of a VFS credential */ | 23 | /* Work around the lack of a VFS credential */ |
27 | struct auth_cred { | 24 | struct auth_cred { |
28 | uid_t uid; | 25 | uid_t uid; |
diff --git a/include/linux/sunrpc/msg_prot.h b/include/linux/sunrpc/msg_prot.h index 8d10d148834e..1e65f2dd80e5 100644 --- a/include/linux/sunrpc/msg_prot.h +++ b/include/linux/sunrpc/msg_prot.h | |||
@@ -11,6 +11,9 @@ | |||
11 | 11 | ||
12 | #define RPC_VERSION 2 | 12 | #define RPC_VERSION 2 |
13 | 13 | ||
14 | /* size of an XDR encoding unit in bytes, i.e. 32bit */ | ||
15 | #define XDR_UNIT (4) | ||
16 | |||
14 | /* spec defines authentication flavor as an unsigned 32 bit integer */ | 17 | /* spec defines authentication flavor as an unsigned 32 bit integer */ |
15 | typedef u32 rpc_authflavor_t; | 18 | typedef u32 rpc_authflavor_t; |
16 | 19 | ||
@@ -34,6 +37,9 @@ enum rpc_auth_flavors { | |||
34 | RPC_AUTH_GSS_SPKMP = 390011, | 37 | RPC_AUTH_GSS_SPKMP = 390011, |
35 | }; | 38 | }; |
36 | 39 | ||
40 | /* Maximum size (in bytes) of an rpc credential or verifier */ | ||
41 | #define RPC_MAX_AUTH_SIZE (400) | ||
42 | |||
37 | enum rpc_msg_type { | 43 | enum rpc_msg_type { |
38 | RPC_CALL = 0, | 44 | RPC_CALL = 0, |
39 | RPC_REPLY = 1 | 45 | RPC_REPLY = 1 |
@@ -101,5 +107,39 @@ typedef __be32 rpc_fraghdr; | |||
101 | #define RPC_FRAGMENT_SIZE_MASK (~RPC_LAST_STREAM_FRAGMENT) | 107 | #define RPC_FRAGMENT_SIZE_MASK (~RPC_LAST_STREAM_FRAGMENT) |
102 | #define RPC_MAX_FRAGMENT_SIZE ((1U << 31) - 1) | 108 | #define RPC_MAX_FRAGMENT_SIZE ((1U << 31) - 1) |
103 | 109 | ||
110 | /* | ||
111 | * RPC call and reply header size as number of 32bit words (verifier | ||
112 | * size computed separately, see below) | ||
113 | */ | ||
114 | #define RPC_CALLHDRSIZE (6) | ||
115 | #define RPC_REPHDRSIZE (4) | ||
116 | |||
117 | |||
118 | /* | ||
119 | * Maximum RPC header size, including authentication, | ||
120 | * as number of 32bit words (see RFCs 1831, 1832). | ||
121 | * | ||
122 | * xid 1 xdr unit = 4 bytes | ||
123 | * mtype 1 | ||
124 | * rpc_version 1 | ||
125 | * program 1 | ||
126 | * prog_version 1 | ||
127 | * procedure 1 | ||
128 | * cred { | ||
129 | * flavor 1 | ||
130 | * length 1 | ||
131 | * body<RPC_MAX_AUTH_SIZE> 100 xdr units = 400 bytes | ||
132 | * } | ||
133 | * verf { | ||
134 | * flavor 1 | ||
135 | * length 1 | ||
136 | * body<RPC_MAX_AUTH_SIZE> 100 xdr units = 400 bytes | ||
137 | * } | ||
138 | * TOTAL 210 xdr units = 840 bytes | ||
139 | */ | ||
140 | #define RPC_MAX_HEADER_WITH_AUTH \ | ||
141 | (RPC_CALLHDRSIZE + 2*(2+RPC_MAX_AUTH_SIZE/4)) | ||
142 | |||
143 | |||
104 | #endif /* __KERNEL__ */ | 144 | #endif /* __KERNEL__ */ |
105 | #endif /* _LINUX_SUNRPC_MSGPROT_H_ */ | 145 | #endif /* _LINUX_SUNRPC_MSGPROT_H_ */ |
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index cb0ed9beb227..74e52c245da4 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/in.h> | 13 | #include <linux/in.h> |
14 | #include <linux/sunrpc/types.h> | 14 | #include <linux/sunrpc/types.h> |
15 | #include <linux/sunrpc/xdr.h> | 15 | #include <linux/sunrpc/xdr.h> |
16 | #include <linux/sunrpc/auth.h> | ||
16 | #include <linux/sunrpc/svcauth.h> | 17 | #include <linux/sunrpc/svcauth.h> |
17 | #include <linux/wait.h> | 18 | #include <linux/wait.h> |
18 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
@@ -95,8 +96,28 @@ static inline void svc_get(struct svc_serv *serv) | |||
95 | * Maximum payload size supported by a kernel RPC server. | 96 | * Maximum payload size supported by a kernel RPC server. |
96 | * This is use to determine the max number of pages nfsd is | 97 | * This is use to determine the max number of pages nfsd is |
97 | * willing to return in a single READ operation. | 98 | * willing to return in a single READ operation. |
99 | * | ||
100 | * These happen to all be powers of 2, which is not strictly | ||
101 | * necessary but helps enforce the real limitation, which is | ||
102 | * that they should be multiples of PAGE_CACHE_SIZE. | ||
103 | * | ||
104 | * For UDP transports, a block plus NFS,RPC, and UDP headers | ||
105 | * has to fit into the IP datagram limit of 64K. The largest | ||
106 | * feasible number for all known page sizes is probably 48K, | ||
107 | * but we choose 32K here. This is the same as the historical | ||
108 | * Linux limit; someone who cares more about NFS/UDP performance | ||
109 | * can test a larger number. | ||
110 | * | ||
111 | * For TCP transports we have more freedom. A size of 1MB is | ||
112 | * chosen to match the client limit. Other OSes are known to | ||
113 | * have larger limits, but those numbers are probably beyond | ||
114 | * the point of diminishing returns. | ||
98 | */ | 115 | */ |
99 | #define RPCSVC_MAXPAYLOAD (64*1024u) | 116 | #define RPCSVC_MAXPAYLOAD (1*1024*1024u) |
117 | #define RPCSVC_MAXPAYLOAD_TCP RPCSVC_MAXPAYLOAD | ||
118 | #define RPCSVC_MAXPAYLOAD_UDP (32*1024u) | ||
119 | |||
120 | extern u32 svc_max_payload(const struct svc_rqst *rqstp); | ||
100 | 121 | ||
101 | /* | 122 | /* |
102 | * RPC Requsts and replies are stored in one or more pages. | 123 | * RPC Requsts and replies are stored in one or more pages. |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 6cf626580752..60394fbc4c70 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/kref.h> | 15 | #include <linux/kref.h> |
16 | #include <linux/sunrpc/sched.h> | 16 | #include <linux/sunrpc/sched.h> |
17 | #include <linux/sunrpc/xdr.h> | 17 | #include <linux/sunrpc/xdr.h> |
18 | #include <linux/sunrpc/msg_prot.h> | ||
18 | 19 | ||
19 | extern unsigned int xprt_udp_slot_table_entries; | 20 | extern unsigned int xprt_udp_slot_table_entries; |
20 | extern unsigned int xprt_tcp_slot_table_entries; | 21 | extern unsigned int xprt_tcp_slot_table_entries; |
@@ -24,13 +25,6 @@ extern unsigned int xprt_tcp_slot_table_entries; | |||
24 | #define RPC_MAX_SLOT_TABLE (128U) | 25 | #define RPC_MAX_SLOT_TABLE (128U) |
25 | 26 | ||
26 | /* | 27 | /* |
27 | * RPC call and reply header size as number of 32bit words (verifier | ||
28 | * size computed separately) | ||
29 | */ | ||
30 | #define RPC_CALLHDRSIZE 6 | ||
31 | #define RPC_REPHDRSIZE 4 | ||
32 | |||
33 | /* | ||
34 | * Parameters for choosing a free port | 28 | * Parameters for choosing a free port |
35 | */ | 29 | */ |
36 | extern unsigned int xprt_min_resvport; | 30 | extern unsigned int xprt_min_resvport; |