diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-20 17:04:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-20 17:04:11 -0500 |
commit | 982197277c85018cc6eb77f1d3bef17933b0c5fd (patch) | |
tree | 805fcef9ec7c1e83867b89332fd37f751594fae3 /include/linux/sunrpc | |
parent | 40889e8d9fc6355980cf2bc94ef4356c10dec4ec (diff) | |
parent | 24ffb93872f7363a01ad639e3c8a9889b46c3f0a (diff) |
Merge branch 'for-3.8' of git://linux-nfs.org/~bfields/linux
Pull nfsd update from Bruce Fields:
"Included this time:
- more nfsd containerization work from Stanislav Kinsbursky: we're
not quite there yet, but should be by 3.9.
- NFSv4.1 progress: implementation of basic backchannel security
negotiation and the mandatory BACKCHANNEL_CTL operation. See
http://wiki.linux-nfs.org/wiki/index.php/Server_4.0_and_4.1_issues
for remaining TODO's
- Fixes for some bugs that could be triggered by unusual compounds.
Our xdr code wasn't designed with v4 compounds in mind, and it
shows. A more thorough rewrite is still a todo.
- If you've ever seen "RPC: multiple fragments per record not
supported" logged while using some sort of odd userland NFS client,
that should now be fixed.
- Further work from Jeff Layton on our mechanism for storing
information about NFSv4 clients across reboots.
- Further work from Bryan Schumaker on his fault-injection mechanism
(which allows us to discard selective NFSv4 state, to excercise
rarely-taken recovery code paths in the client.)
- The usual mix of miscellaneous bugs and cleanup.
Thanks to everyone who tested or contributed this cycle."
* 'for-3.8' of git://linux-nfs.org/~bfields/linux: (111 commits)
nfsd4: don't leave freed stateid hashed
nfsd4: free_stateid can use the current stateid
nfsd4: cleanup: replace rq_resused count by rq_next_page pointer
nfsd: warn on odd reply state in nfsd_vfs_read
nfsd4: fix oops on unusual readlike compound
nfsd4: disable zero-copy on non-final read ops
svcrpc: fix some printks
NFSD: Correct the size calculation in fault_inject_write
NFSD: Pass correct buffer size to rpc_ntop
nfsd: pass proper net to nfsd_destroy() from NFSd kthreads
nfsd: simplify service shutdown
nfsd: replace boolean nfsd_up flag by users counter
nfsd: simplify NFSv4 state init and shutdown
nfsd: introduce helpers for generic resources init and shutdown
nfsd: make NFSd service structure allocated per net
nfsd: make NFSd service boot time per-net
nfsd: per-net NFSd up flag introduced
nfsd: move per-net startup code to separated function
nfsd: pass net to __write_ports() and down
nfsd: pass net to nfsd_set_nrthreads()
...
Diffstat (limited to 'include/linux/sunrpc')
-rw-r--r-- | include/linux/sunrpc/cache.h | 6 | ||||
-rw-r--r-- | include/linux/sunrpc/svc.h | 6 | ||||
-rw-r--r-- | include/linux/sunrpc/svcsock.h | 21 |
3 files changed, 27 insertions, 6 deletions
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index f792794f6634..5dc9ee4d616e 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h | |||
@@ -217,6 +217,8 @@ extern int qword_get(char **bpp, char *dest, int bufsize); | |||
217 | static inline int get_int(char **bpp, int *anint) | 217 | static inline int get_int(char **bpp, int *anint) |
218 | { | 218 | { |
219 | char buf[50]; | 219 | char buf[50]; |
220 | char *ep; | ||
221 | int rv; | ||
220 | int len = qword_get(bpp, buf, sizeof(buf)); | 222 | int len = qword_get(bpp, buf, sizeof(buf)); |
221 | 223 | ||
222 | if (len < 0) | 224 | if (len < 0) |
@@ -224,9 +226,11 @@ static inline int get_int(char **bpp, int *anint) | |||
224 | if (len == 0) | 226 | if (len == 0) |
225 | return -ENOENT; | 227 | return -ENOENT; |
226 | 228 | ||
227 | if (kstrtoint(buf, 0, anint)) | 229 | rv = simple_strtol(buf, &ep, 0); |
230 | if (*ep) | ||
228 | return -EINVAL; | 231 | return -EINVAL; |
229 | 232 | ||
233 | *anint = rv; | ||
230 | return 0; | 234 | return 0; |
231 | } | 235 | } |
232 | 236 | ||
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index d83db800fe02..676ddf53b3ee 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h | |||
@@ -243,6 +243,7 @@ struct svc_rqst { | |||
243 | struct page * rq_pages[RPCSVC_MAXPAGES]; | 243 | struct page * rq_pages[RPCSVC_MAXPAGES]; |
244 | struct page * *rq_respages; /* points into rq_pages */ | 244 | struct page * *rq_respages; /* points into rq_pages */ |
245 | int rq_resused; /* number of pages used for result */ | 245 | int rq_resused; /* number of pages used for result */ |
246 | struct page * *rq_next_page; /* next reply page to use */ | ||
246 | 247 | ||
247 | struct kvec rq_vec[RPCSVC_MAXPAGES]; /* generally useful.. */ | 248 | struct kvec rq_vec[RPCSVC_MAXPAGES]; /* generally useful.. */ |
248 | 249 | ||
@@ -338,9 +339,8 @@ xdr_ressize_check(struct svc_rqst *rqstp, __be32 *p) | |||
338 | 339 | ||
339 | static inline void svc_free_res_pages(struct svc_rqst *rqstp) | 340 | static inline void svc_free_res_pages(struct svc_rqst *rqstp) |
340 | { | 341 | { |
341 | while (rqstp->rq_resused) { | 342 | while (rqstp->rq_next_page != rqstp->rq_respages) { |
342 | struct page **pp = (rqstp->rq_respages + | 343 | struct page **pp = --rqstp->rq_next_page; |
343 | --rqstp->rq_resused); | ||
344 | if (*pp) { | 344 | if (*pp) { |
345 | put_page(*pp); | 345 | put_page(*pp); |
346 | *pp = NULL; | 346 | *pp = NULL; |
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h index 92ad02f0dcc0..62fd1b756e99 100644 --- a/include/linux/sunrpc/svcsock.h +++ b/include/linux/sunrpc/svcsock.h | |||
@@ -26,11 +26,28 @@ struct svc_sock { | |||
26 | void (*sk_owspace)(struct sock *); | 26 | void (*sk_owspace)(struct sock *); |
27 | 27 | ||
28 | /* private TCP part */ | 28 | /* private TCP part */ |
29 | u32 sk_reclen; /* length of record */ | 29 | /* On-the-wire fragment header: */ |
30 | u32 sk_tcplen; /* current read length */ | 30 | __be32 sk_reclen; |
31 | /* As we receive a record, this includes the length received so | ||
32 | * far (including the fragment header): */ | ||
33 | u32 sk_tcplen; | ||
34 | /* Total length of the data (not including fragment headers) | ||
35 | * received so far in the fragments making up this rpc: */ | ||
36 | u32 sk_datalen; | ||
37 | |||
31 | struct page * sk_pages[RPCSVC_MAXPAGES]; /* received data */ | 38 | struct page * sk_pages[RPCSVC_MAXPAGES]; /* received data */ |
32 | }; | 39 | }; |
33 | 40 | ||
41 | static inline u32 svc_sock_reclen(struct svc_sock *svsk) | ||
42 | { | ||
43 | return ntohl(svsk->sk_reclen) & RPC_FRAGMENT_SIZE_MASK; | ||
44 | } | ||
45 | |||
46 | static inline u32 svc_sock_final_rec(struct svc_sock *svsk) | ||
47 | { | ||
48 | return ntohl(svsk->sk_reclen) & RPC_LAST_STREAM_FRAGMENT; | ||
49 | } | ||
50 | |||
34 | /* | 51 | /* |
35 | * Function prototypes. | 52 | * Function prototypes. |
36 | */ | 53 | */ |