@@ -1842,6 +1842,12 @@ static inline u32 nfsd4_status_stateid_rsize(struct svc_rqst *rqstp, struct nfsd
1842
1842
return (op_encode_hdr_size + op_encode_stateid_maxsz )* sizeof (__be32 );
1843
1843
}
1844
1844
1845
+ static inline u32 nfsd4_access_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1846
+ {
1847
+ /* ac_supported, ac_resp_access */
1848
+ return (op_encode_hdr_size + 2 )* sizeof (__be32 );
1849
+ }
1850
+
1845
1851
static inline u32 nfsd4_commit_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1846
1852
{
1847
1853
return (op_encode_hdr_size + op_encode_verifier_maxsz ) * sizeof (__be32 );
@@ -1896,6 +1902,11 @@ static inline u32 nfsd4_getattr_rsize(struct svc_rqst *rqstp,
1896
1902
return ret ;
1897
1903
}
1898
1904
1905
+ static inline u32 nfsd4_getfh_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1906
+ {
1907
+ return (op_encode_hdr_size + 1 ) * sizeof (__be32 ) + NFS4_FHSIZE ;
1908
+ }
1909
+
1899
1910
static inline u32 nfsd4_link_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1900
1911
{
1901
1912
return (op_encode_hdr_size + op_encode_change_info_maxsz )
@@ -1937,6 +1948,11 @@ static inline u32 nfsd4_readdir_rsize(struct svc_rqst *rqstp, struct nfsd4_op *o
1937
1948
XDR_QUADLEN (rlen )) * sizeof (__be32 );
1938
1949
}
1939
1950
1951
+ static inline u32 nfsd4_readlink_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1952
+ {
1953
+ return (op_encode_hdr_size + 1 ) * sizeof (__be32 ) + PAGE_SIZE ;
1954
+ }
1955
+
1940
1956
static inline u32 nfsd4_remove_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1941
1957
{
1942
1958
return (op_encode_hdr_size + op_encode_change_info_maxsz )
@@ -1956,11 +1972,23 @@ static inline u32 nfsd4_sequence_rsize(struct svc_rqst *rqstp,
1956
1972
+ XDR_QUADLEN (NFS4_MAX_SESSIONID_LEN ) + 5 ) * sizeof (__be32 );
1957
1973
}
1958
1974
1975
+ static inline u32 nfsd4_test_stateid_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1976
+ {
1977
+ return (op_encode_hdr_size + 1 + op -> u .test_stateid .ts_num_ids )
1978
+ * sizeof (__be32 );
1979
+ }
1980
+
1959
1981
static inline u32 nfsd4_setattr_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1960
1982
{
1961
1983
return (op_encode_hdr_size + nfs4_fattr_bitmap_maxsz ) * sizeof (__be32 );
1962
1984
}
1963
1985
1986
+ static inline u32 nfsd4_secinfo_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1987
+ {
1988
+ return (op_encode_hdr_size + RPC_AUTH_MAXFLAVOR *
1989
+ (4 + XDR_QUADLEN (GSS_OID_MAX_LEN ))) * sizeof (__be32 );
1990
+ }
1991
+
1964
1992
static inline u32 nfsd4_setclientid_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
1965
1993
{
1966
1994
return (op_encode_hdr_size + 2 + XDR_QUADLEN (NFS4_VERIFIER_SIZE )) *
@@ -2015,6 +2043,19 @@ static inline u32 nfsd4_copy_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op)
2015
2043
}
2016
2044
2017
2045
#ifdef CONFIG_NFSD_PNFS
2046
+ static inline u32 nfsd4_getdeviceinfo_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
2047
+ {
2048
+ u32 maxcount = 0 , rlen = 0 ;
2049
+
2050
+ maxcount = svc_max_payload (rqstp );
2051
+ rlen = min (op -> u .getdeviceinfo .gd_maxcount , maxcount );
2052
+
2053
+ return (op_encode_hdr_size +
2054
+ 1 /* gd_layout_type*/ +
2055
+ XDR_QUADLEN (rlen ) +
2056
+ 2 /* gd_notify_types */ ) * sizeof (__be32 );
2057
+ }
2058
+
2018
2059
/*
2019
2060
* At this stage we don't really know what layout driver will handle the request,
2020
2061
* so we need to define an arbitrary upper bound here.
@@ -2044,10 +2085,17 @@ static inline u32 nfsd4_layoutreturn_rsize(struct svc_rqst *rqstp, struct nfsd4_
2044
2085
}
2045
2086
#endif /* CONFIG_NFSD_PNFS */
2046
2087
2088
+
2089
+ static inline u32 nfsd4_seek_rsize (struct svc_rqst * rqstp , struct nfsd4_op * op )
2090
+ {
2091
+ return (op_encode_hdr_size + 3 ) * sizeof (__be32 );
2092
+ }
2093
+
2047
2094
static struct nfsd4_operation nfsd4_ops [] = {
2048
2095
[OP_ACCESS ] = {
2049
2096
.op_func = (nfsd4op_func )nfsd4_access ,
2050
2097
.op_name = "OP_ACCESS" ,
2098
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_access_rsize ,
2051
2099
},
2052
2100
[OP_CLOSE ] = {
2053
2101
.op_func = (nfsd4op_func )nfsd4_close ,
@@ -2085,6 +2133,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2085
2133
[OP_GETFH ] = {
2086
2134
.op_func = (nfsd4op_func )nfsd4_getfh ,
2087
2135
.op_name = "OP_GETFH" ,
2136
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_getfh_rsize ,
2088
2137
},
2089
2138
[OP_LINK ] = {
2090
2139
.op_func = (nfsd4op_func )nfsd4_link ,
@@ -2103,6 +2152,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2103
2152
[OP_LOCKT ] = {
2104
2153
.op_func = (nfsd4op_func )nfsd4_lockt ,
2105
2154
.op_name = "OP_LOCKT" ,
2155
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_lock_rsize ,
2106
2156
},
2107
2157
[OP_LOCKU ] = {
2108
2158
.op_func = (nfsd4op_func )nfsd4_locku ,
@@ -2115,15 +2165,18 @@ static struct nfsd4_operation nfsd4_ops[] = {
2115
2165
.op_func = (nfsd4op_func )nfsd4_lookup ,
2116
2166
.op_flags = OP_HANDLES_WRONGSEC | OP_CLEAR_STATEID ,
2117
2167
.op_name = "OP_LOOKUP" ,
2168
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_only_status_rsize ,
2118
2169
},
2119
2170
[OP_LOOKUPP ] = {
2120
2171
.op_func = (nfsd4op_func )nfsd4_lookupp ,
2121
2172
.op_flags = OP_HANDLES_WRONGSEC | OP_CLEAR_STATEID ,
2122
2173
.op_name = "OP_LOOKUPP" ,
2174
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_only_status_rsize ,
2123
2175
},
2124
2176
[OP_NVERIFY ] = {
2125
2177
.op_func = (nfsd4op_func )nfsd4_nverify ,
2126
2178
.op_name = "OP_NVERIFY" ,
2179
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_only_status_rsize ,
2127
2180
},
2128
2181
[OP_OPEN ] = {
2129
2182
.op_func = (nfsd4op_func )nfsd4_open ,
@@ -2181,6 +2234,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2181
2234
[OP_READLINK ] = {
2182
2235
.op_func = (nfsd4op_func )nfsd4_readlink ,
2183
2236
.op_name = "OP_READLINK" ,
2237
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_readlink_rsize ,
2184
2238
},
2185
2239
[OP_REMOVE ] = {
2186
2240
.op_func = (nfsd4op_func )nfsd4_remove ,
@@ -2219,6 +2273,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2219
2273
.op_func = (nfsd4op_func )nfsd4_secinfo ,
2220
2274
.op_flags = OP_HANDLES_WRONGSEC ,
2221
2275
.op_name = "OP_SECINFO" ,
2276
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_secinfo_rsize ,
2222
2277
},
2223
2278
[OP_SETATTR ] = {
2224
2279
.op_func = (nfsd4op_func )nfsd4_setattr ,
@@ -2244,6 +2299,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2244
2299
[OP_VERIFY ] = {
2245
2300
.op_func = (nfsd4op_func )nfsd4_verify ,
2246
2301
.op_name = "OP_VERIFY" ,
2302
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_only_status_rsize ,
2247
2303
},
2248
2304
[OP_WRITE ] = {
2249
2305
.op_func = (nfsd4op_func )nfsd4_write ,
@@ -2318,11 +2374,13 @@ static struct nfsd4_operation nfsd4_ops[] = {
2318
2374
.op_func = (nfsd4op_func )nfsd4_secinfo_no_name ,
2319
2375
.op_flags = OP_HANDLES_WRONGSEC ,
2320
2376
.op_name = "OP_SECINFO_NO_NAME" ,
2377
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_secinfo_rsize ,
2321
2378
},
2322
2379
[OP_TEST_STATEID ] = {
2323
2380
.op_func = (nfsd4op_func )nfsd4_test_stateid ,
2324
2381
.op_flags = ALLOWED_WITHOUT_FH ,
2325
2382
.op_name = "OP_TEST_STATEID" ,
2383
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_test_stateid_rsize ,
2326
2384
},
2327
2385
[OP_FREE_STATEID ] = {
2328
2386
.op_func = (nfsd4op_func )nfsd4_free_stateid ,
@@ -2336,6 +2394,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2336
2394
.op_func = (nfsd4op_func )nfsd4_getdeviceinfo ,
2337
2395
.op_flags = ALLOWED_WITHOUT_FH ,
2338
2396
.op_name = "OP_GETDEVICEINFO" ,
2397
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_getdeviceinfo_rsize ,
2339
2398
},
2340
2399
[OP_LAYOUTGET ] = {
2341
2400
.op_func = (nfsd4op_func )nfsd4_layoutget ,
@@ -2385,6 +2444,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
2385
2444
[OP_SEEK ] = {
2386
2445
.op_func = (nfsd4op_func )nfsd4_seek ,
2387
2446
.op_name = "OP_SEEK" ,
2447
+ .op_rsize_bop = (nfsd4op_rsize )nfsd4_seek_rsize ,
2388
2448
},
2389
2449
};
2390
2450
@@ -2429,14 +2489,11 @@ bool nfsd4_spo_must_allow(struct svc_rqst *rqstp)
2429
2489
2430
2490
int nfsd4_max_reply (struct svc_rqst * rqstp , struct nfsd4_op * op )
2431
2491
{
2432
- struct nfsd4_operation * opdesc ;
2433
- nfsd4op_rsize estimator ;
2434
-
2435
2492
if (op -> opnum == OP_ILLEGAL )
2436
2493
return op_encode_hdr_size * sizeof (__be32 );
2437
- opdesc = OPDESC ( op );
2438
- estimator = opdesc -> op_rsize_bop ;
2439
- return estimator ? estimator ( rqstp , op ) : PAGE_SIZE ;
2494
+
2495
+ BUG_ON ( OPDESC ( op ) -> op_rsize_bop == NULL ) ;
2496
+ return OPDESC ( op ) -> op_rsize_bop ( rqstp , op );
2440
2497
}
2441
2498
2442
2499
void warn_on_nonidempotent_op (struct nfsd4_op * op )
0 commit comments