Commit b9c0ef8571c6ae33465dcf41d496ce2ad783c49d
Committed by
J. Bruce Fields
1 parent
2c2fe2909e
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
nfsd: make NFSd service boot time per-net
This is simple: an NFSd service can be started at different times in different network environments. So, its "boot time" has to be assigned per net. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Showing 5 changed files with 23 additions and 16 deletions Side-by-side Diff
fs/nfsd/netns.h
fs/nfsd/nfs3xdr.c
... | ... | @@ -7,8 +7,10 @@ |
7 | 7 | */ |
8 | 8 | |
9 | 9 | #include <linux/namei.h> |
10 | +#include <linux/sunrpc/svc_xprt.h> | |
10 | 11 | #include "xdr3.h" |
11 | 12 | #include "auth.h" |
13 | +#include "netns.h" | |
12 | 14 | |
13 | 15 | #define NFSDDBG_FACILITY NFSDDBG_XDR |
14 | 16 | |
15 | 17 | |
... | ... | @@ -720,12 +722,14 @@ |
720 | 722 | nfs3svc_encode_writeres(struct svc_rqst *rqstp, __be32 *p, |
721 | 723 | struct nfsd3_writeres *resp) |
722 | 724 | { |
725 | + struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); | |
726 | + | |
723 | 727 | p = encode_wcc_data(rqstp, p, &resp->fh); |
724 | 728 | if (resp->status == 0) { |
725 | 729 | *p++ = htonl(resp->count); |
726 | 730 | *p++ = htonl(resp->committed); |
727 | - *p++ = htonl(nfssvc_boot.tv_sec); | |
728 | - *p++ = htonl(nfssvc_boot.tv_usec); | |
731 | + *p++ = htonl(nn->nfssvc_boot.tv_sec); | |
732 | + *p++ = htonl(nn->nfssvc_boot.tv_usec); | |
729 | 733 | } |
730 | 734 | return xdr_ressize_check(rqstp, p); |
731 | 735 | } |
732 | 736 | |
... | ... | @@ -1082,11 +1086,13 @@ |
1082 | 1086 | nfs3svc_encode_commitres(struct svc_rqst *rqstp, __be32 *p, |
1083 | 1087 | struct nfsd3_commitres *resp) |
1084 | 1088 | { |
1089 | + struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); | |
1090 | + | |
1085 | 1091 | p = encode_wcc_data(rqstp, p, &resp->fh); |
1086 | 1092 | /* Write verifier */ |
1087 | 1093 | if (resp->status == 0) { |
1088 | - *p++ = htonl(nfssvc_boot.tv_sec); | |
1089 | - *p++ = htonl(nfssvc_boot.tv_usec); | |
1094 | + *p++ = htonl(nn->nfssvc_boot.tv_sec); | |
1095 | + *p++ = htonl(nn->nfssvc_boot.tv_usec); | |
1090 | 1096 | } |
1091 | 1097 | return xdr_ressize_check(rqstp, p); |
1092 | 1098 | } |
fs/nfsd/nfs4proc.c
... | ... | @@ -497,12 +497,13 @@ |
497 | 497 | &access->ac_supported); |
498 | 498 | } |
499 | 499 | |
500 | -static void gen_boot_verifier(nfs4_verifier *verifier) | |
500 | +static void gen_boot_verifier(nfs4_verifier *verifier, struct net *net) | |
501 | 501 | { |
502 | 502 | __be32 verf[2]; |
503 | + struct nfsd_net *nn = net_generic(net, nfsd_net_id); | |
503 | 504 | |
504 | - verf[0] = (__be32)nfssvc_boot.tv_sec; | |
505 | - verf[1] = (__be32)nfssvc_boot.tv_usec; | |
505 | + verf[0] = (__be32)nn->nfssvc_boot.tv_sec; | |
506 | + verf[1] = (__be32)nn->nfssvc_boot.tv_usec; | |
506 | 507 | memcpy(verifier->data, verf, sizeof(verifier->data)); |
507 | 508 | } |
508 | 509 | |
... | ... | @@ -510,7 +511,7 @@ |
510 | 511 | nfsd4_commit(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
511 | 512 | struct nfsd4_commit *commit) |
512 | 513 | { |
513 | - gen_boot_verifier(&commit->co_verf); | |
514 | + gen_boot_verifier(&commit->co_verf, SVC_NET(rqstp)); | |
514 | 515 | return nfsd_commit(rqstp, &cstate->current_fh, commit->co_offset, |
515 | 516 | commit->co_count); |
516 | 517 | } |
... | ... | @@ -930,7 +931,7 @@ |
930 | 931 | |
931 | 932 | cnt = write->wr_buflen; |
932 | 933 | write->wr_how_written = write->wr_stable_how; |
933 | - gen_boot_verifier(&write->wr_verifier); | |
934 | + gen_boot_verifier(&write->wr_verifier, SVC_NET(rqstp)); | |
934 | 935 | |
935 | 936 | nvecs = fill_in_write_vector(rqstp->rq_vec, write); |
936 | 937 | WARN_ON_ONCE(nvecs > ARRAY_SIZE(rqstp->rq_vec)); |
fs/nfsd/nfsd.h
... | ... | @@ -269,11 +269,6 @@ |
269 | 269 | /* Check for dir entries '.' and '..' */ |
270 | 270 | #define isdotent(n, l) (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.')) |
271 | 271 | |
272 | -/* | |
273 | - * Time of server startup | |
274 | - */ | |
275 | -extern struct timeval nfssvc_boot; | |
276 | - | |
277 | 272 | #ifdef CONFIG_NFSD_V4 |
278 | 273 | |
279 | 274 | /* before processing a COMPOUND operation, we have to check that there |
fs/nfsd/nfssvc.c
... | ... | @@ -27,7 +27,6 @@ |
27 | 27 | |
28 | 28 | extern struct svc_program nfsd_program; |
29 | 29 | static int nfsd(void *vrqstp); |
30 | -struct timeval nfssvc_boot; | |
31 | 30 | |
32 | 31 | /* |
33 | 32 | * nfsd_mutex protects nfsd_serv -- both the pointer itself and the members |
... | ... | @@ -367,6 +366,7 @@ |
367 | 366 | int nfsd_create_serv(struct net *net) |
368 | 367 | { |
369 | 368 | int error; |
369 | + struct nfsd_net *nn = net_generic(net, nfsd_net_id); | |
370 | 370 | |
371 | 371 | WARN_ON(!mutex_is_locked(&nfsd_mutex)); |
372 | 372 | if (nfsd_serv) { |
... | ... | @@ -388,7 +388,7 @@ |
388 | 388 | } |
389 | 389 | |
390 | 390 | set_max_drc(); |
391 | - do_gettimeofday(&nfssvc_boot); /* record boot time */ | |
391 | + do_gettimeofday(&nn->nfssvc_boot); /* record boot time */ | |
392 | 392 | return 0; |
393 | 393 | } |
394 | 394 |