Commit b9c0ef8571c6ae33465dcf41d496ce2ad783c49d

Authored by Stanislav Kinsbursky
Committed by J. Bruce Fields
1 parent 2c2fe2909e

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

... ... @@ -94,6 +94,11 @@
94 94 time_t nfsd4_grace;
95 95  
96 96 bool nfsd_net_up;
  97 +
  98 + /*
  99 + * Time of server startup
  100 + */
  101 + struct timeval nfssvc_boot;
97 102 };
98 103  
99 104 /* Simple check to find out if a given net was properly initialized */
... ... @@ -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 }
... ... @@ -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));
... ... @@ -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
... ... @@ -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