aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfsd/nfs4proc.c19
-rw-r--r--fs/nfsd/nfs4state.c8
-rw-r--r--fs/nfsd/nfs4xdr.c28
-rw-r--r--fs/nfsd/xdr4.h4
4 files changed, 31 insertions, 28 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 3f7dbc410e3..2a9036670b8 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -489,14 +489,20 @@ nfsd4_access(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
489 &access->ac_supported); 489 &access->ac_supported);
490} 490}
491 491
492static void gen_boot_verifier(nfs4_verifier *verifier)
493{
494 __be32 verf[2];
495
496 verf[0] = (__be32)nfssvc_boot.tv_sec;
497 verf[1] = (__be32)nfssvc_boot.tv_usec;
498 memcpy(verifier->data, verf, sizeof(verifier->data));
499}
500
492static __be32 501static __be32
493nfsd4_commit(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 502nfsd4_commit(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
494 struct nfsd4_commit *commit) 503 struct nfsd4_commit *commit)
495{ 504{
496 u32 *p = (u32 *)commit->co_verf.data; 505 gen_boot_verifier(&commit->co_verf);
497 *p++ = nfssvc_boot.tv_sec;
498 *p++ = nfssvc_boot.tv_usec;
499
500 return nfsd_commit(rqstp, &cstate->current_fh, commit->co_offset, 506 return nfsd_commit(rqstp, &cstate->current_fh, commit->co_offset,
501 commit->co_count); 507 commit->co_count);
502} 508}
@@ -873,7 +879,6 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
873{ 879{
874 stateid_t *stateid = &write->wr_stateid; 880 stateid_t *stateid = &write->wr_stateid;
875 struct file *filp = NULL; 881 struct file *filp = NULL;
876 u32 *p;
877 __be32 status = nfs_ok; 882 __be32 status = nfs_ok;
878 unsigned long cnt; 883 unsigned long cnt;
879 884
@@ -895,9 +900,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
895 900
896 cnt = write->wr_buflen; 901 cnt = write->wr_buflen;
897 write->wr_how_written = write->wr_stable_how; 902 write->wr_how_written = write->wr_stable_how;
898 p = (u32 *)write->wr_verifier.data; 903 gen_boot_verifier(&write->wr_verifier);
899 *p++ = nfssvc_boot.tv_sec;
900 *p++ = nfssvc_boot.tv_usec;
901 904
902 status = nfsd_write(rqstp, &cstate->current_fh, filp, 905 status = nfsd_write(rqstp, &cstate->current_fh, filp,
903 write->wr_offset, rqstp->rq_vec, write->wr_vlen, 906 write->wr_offset, rqstp->rq_vec, write->wr_vlen,
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index cdc406a28ef..e318964d8ac 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1174,12 +1174,12 @@ static void gen_clid(struct nfs4_client *clp)
1174 1174
1175static void gen_confirm(struct nfs4_client *clp) 1175static void gen_confirm(struct nfs4_client *clp)
1176{ 1176{
1177 __be32 verf[2];
1177 static u32 i; 1178 static u32 i;
1178 u32 *p;
1179 1179
1180 p = (u32 *)clp->cl_confirm.data; 1180 verf[0] = (__be32)get_seconds();
1181 *p++ = get_seconds(); 1181 verf[1] = (__be32)i++;
1182 *p++ = i++; 1182 memcpy(clp->cl_confirm.data, verf, sizeof(clp->cl_confirm.data));
1183} 1183}
1184 1184
1185static struct nfs4_stid *find_stateid(struct nfs4_client *cl, stateid_t *t) 1185static struct nfs4_stid *find_stateid(struct nfs4_client *cl, stateid_t *t)
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index f8fcddca041..bcd8904ab1e 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -749,14 +749,14 @@ nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
749 goto out; 749 goto out;
750 break; 750 break;
751 case NFS4_CREATE_EXCLUSIVE: 751 case NFS4_CREATE_EXCLUSIVE:
752 READ_BUF(8); 752 READ_BUF(NFS4_VERIFIER_SIZE);
753 COPYMEM(open->op_verf.data, 8); 753 COPYMEM(open->op_verf.data, NFS4_VERIFIER_SIZE);
754 break; 754 break;
755 case NFS4_CREATE_EXCLUSIVE4_1: 755 case NFS4_CREATE_EXCLUSIVE4_1:
756 if (argp->minorversion < 1) 756 if (argp->minorversion < 1)
757 goto xdr_error; 757 goto xdr_error;
758 READ_BUF(8); 758 READ_BUF(NFS4_VERIFIER_SIZE);
759 COPYMEM(open->op_verf.data, 8); 759 COPYMEM(open->op_verf.data, NFS4_VERIFIER_SIZE);
760 status = nfsd4_decode_fattr(argp, open->op_bmval, 760 status = nfsd4_decode_fattr(argp, open->op_bmval,
761 &open->op_iattr, &open->op_acl); 761 &open->op_iattr, &open->op_acl);
762 if (status) 762 if (status)
@@ -989,8 +989,8 @@ nfsd4_decode_setclientid(struct nfsd4_compoundargs *argp, struct nfsd4_setclient
989{ 989{
990 DECODE_HEAD; 990 DECODE_HEAD;
991 991
992 READ_BUF(8); 992 READ_BUF(NFS4_VERIFIER_SIZE);
993 COPYMEM(setclientid->se_verf.data, 8); 993 COPYMEM(setclientid->se_verf.data, NFS4_VERIFIER_SIZE);
994 994
995 status = nfsd4_decode_opaque(argp, &setclientid->se_name); 995 status = nfsd4_decode_opaque(argp, &setclientid->se_name);
996 if (status) 996 if (status)
@@ -1015,9 +1015,9 @@ nfsd4_decode_setclientid_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_s
1015{ 1015{
1016 DECODE_HEAD; 1016 DECODE_HEAD;
1017 1017
1018 READ_BUF(8 + sizeof(nfs4_verifier)); 1018 READ_BUF(8 + NFS4_VERIFIER_SIZE);
1019 COPYMEM(&scd_c->sc_clientid, 8); 1019 COPYMEM(&scd_c->sc_clientid, 8);
1020 COPYMEM(&scd_c->sc_confirm, sizeof(nfs4_verifier)); 1020 COPYMEM(&scd_c->sc_confirm, NFS4_VERIFIER_SIZE);
1021 1021
1022 DECODE_TAIL; 1022 DECODE_TAIL;
1023} 1023}
@@ -2659,8 +2659,8 @@ nfsd4_encode_commit(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_
2659 __be32 *p; 2659 __be32 *p;
2660 2660
2661 if (!nfserr) { 2661 if (!nfserr) {
2662 RESERVE_SPACE(8); 2662 RESERVE_SPACE(NFS4_VERIFIER_SIZE);
2663 WRITEMEM(commit->co_verf.data, 8); 2663 WRITEMEM(commit->co_verf.data, NFS4_VERIFIER_SIZE);
2664 ADJUST_ARGS(); 2664 ADJUST_ARGS();
2665 } 2665 }
2666 return nfserr; 2666 return nfserr;
@@ -3020,7 +3020,7 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4
3020 if (resp->xbuf->page_len) 3020 if (resp->xbuf->page_len)
3021 return nfserr_resource; 3021 return nfserr_resource;
3022 3022
3023 RESERVE_SPACE(8); /* verifier */ 3023 RESERVE_SPACE(NFS4_VERIFIER_SIZE);
3024 savep = p; 3024 savep = p;
3025 3025
3026 /* XXX: Following NFSv3, we ignore the READDIR verifier for now. */ 3026 /* XXX: Following NFSv3, we ignore the READDIR verifier for now. */
@@ -3221,9 +3221,9 @@ nfsd4_encode_setclientid(struct nfsd4_compoundres *resp, __be32 nfserr, struct n
3221 __be32 *p; 3221 __be32 *p;
3222 3222
3223 if (!nfserr) { 3223 if (!nfserr) {
3224 RESERVE_SPACE(8 + sizeof(nfs4_verifier)); 3224 RESERVE_SPACE(8 + NFS4_VERIFIER_SIZE);
3225 WRITEMEM(&scd->se_clientid, 8); 3225 WRITEMEM(&scd->se_clientid, 8);
3226 WRITEMEM(&scd->se_confirm, sizeof(nfs4_verifier)); 3226 WRITEMEM(&scd->se_confirm, NFS4_VERIFIER_SIZE);
3227 ADJUST_ARGS(); 3227 ADJUST_ARGS();
3228 } 3228 }
3229 else if (nfserr == nfserr_clid_inuse) { 3229 else if (nfserr == nfserr_clid_inuse) {
@@ -3244,7 +3244,7 @@ nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_w
3244 RESERVE_SPACE(16); 3244 RESERVE_SPACE(16);
3245 WRITE32(write->wr_bytes_written); 3245 WRITE32(write->wr_bytes_written);
3246 WRITE32(write->wr_how_written); 3246 WRITE32(write->wr_how_written);
3247 WRITEMEM(write->wr_verifier.data, 8); 3247 WRITEMEM(write->wr_verifier.data, NFS4_VERIFIER_SIZE);
3248 ADJUST_ARGS(); 3248 ADJUST_ARGS();
3249 } 3249 }
3250 return nfserr; 3250 return nfserr;
diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h
index b89781f1477..1b3501598ab 100644
--- a/fs/nfsd/xdr4.h
+++ b/fs/nfsd/xdr4.h
@@ -228,7 +228,8 @@ struct nfsd4_open {
228 u32 op_createmode; /* request */ 228 u32 op_createmode; /* request */
229 u32 op_bmval[3]; /* request */ 229 u32 op_bmval[3]; /* request */
230 struct iattr iattr; /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */ 230 struct iattr iattr; /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */
231 nfs4_verifier verf; /* EXCLUSIVE4 */ 231 nfs4_verifier op_verf __attribute__((aligned(32)));
232 /* EXCLUSIVE4 */
232 clientid_t op_clientid; /* request */ 233 clientid_t op_clientid; /* request */
233 struct xdr_netobj op_owner; /* request */ 234 struct xdr_netobj op_owner; /* request */
234 u32 op_seqid; /* request */ 235 u32 op_seqid; /* request */
@@ -247,7 +248,6 @@ struct nfsd4_open {
247 struct nfs4_acl *op_acl; 248 struct nfs4_acl *op_acl;
248}; 249};
249#define op_iattr iattr 250#define op_iattr iattr
250#define op_verf verf
251 251
252struct nfsd4_open_confirm { 252struct nfsd4_open_confirm {
253 stateid_t oc_req_stateid /* request */; 253 stateid_t oc_req_stateid /* request */;