diff options
Diffstat (limited to 'fs/nfsd/nfs4proc.c')
-rw-r--r-- | fs/nfsd/nfs4proc.c | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 0cdfd022bb7b..db52546143d1 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c | |||
@@ -604,9 +604,7 @@ nfsd4_link(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
604 | return status; | 604 | return status; |
605 | } | 605 | } |
606 | 606 | ||
607 | static __be32 | 607 | static __be32 nfsd4_do_lookupp(struct svc_rqst *rqstp, struct svc_fh *fh) |
608 | nfsd4_lookupp(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
609 | void *arg) | ||
610 | { | 608 | { |
611 | struct svc_fh tmp_fh; | 609 | struct svc_fh tmp_fh; |
612 | __be32 ret; | 610 | __be32 ret; |
@@ -615,13 +613,19 @@ nfsd4_lookupp(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
615 | ret = exp_pseudoroot(rqstp, &tmp_fh); | 613 | ret = exp_pseudoroot(rqstp, &tmp_fh); |
616 | if (ret) | 614 | if (ret) |
617 | return ret; | 615 | return ret; |
618 | if (tmp_fh.fh_dentry == cstate->current_fh.fh_dentry) { | 616 | if (tmp_fh.fh_dentry == fh->fh_dentry) { |
619 | fh_put(&tmp_fh); | 617 | fh_put(&tmp_fh); |
620 | return nfserr_noent; | 618 | return nfserr_noent; |
621 | } | 619 | } |
622 | fh_put(&tmp_fh); | 620 | fh_put(&tmp_fh); |
623 | return nfsd_lookup(rqstp, &cstate->current_fh, | 621 | return nfsd_lookup(rqstp, fh, "..", 2, fh); |
624 | "..", 2, &cstate->current_fh); | 622 | } |
623 | |||
624 | static __be32 | ||
625 | nfsd4_lookupp(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
626 | void *arg) | ||
627 | { | ||
628 | return nfsd4_do_lookupp(rqstp, &cstate->current_fh); | ||
625 | } | 629 | } |
626 | 630 | ||
627 | static __be32 | 631 | static __be32 |
@@ -769,10 +773,36 @@ nfsd4_secinfo(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
769 | } else | 773 | } else |
770 | secinfo->si_exp = exp; | 774 | secinfo->si_exp = exp; |
771 | dput(dentry); | 775 | dput(dentry); |
776 | if (cstate->minorversion) | ||
777 | /* See rfc 5661 section 2.6.3.1.1.8 */ | ||
778 | fh_put(&cstate->current_fh); | ||
772 | return err; | 779 | return err; |
773 | } | 780 | } |
774 | 781 | ||
775 | static __be32 | 782 | static __be32 |
783 | nfsd4_secinfo_no_name(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
784 | struct nfsd4_secinfo_no_name *sin) | ||
785 | { | ||
786 | __be32 err; | ||
787 | |||
788 | switch (sin->sin_style) { | ||
789 | case NFS4_SECINFO_STYLE4_CURRENT_FH: | ||
790 | break; | ||
791 | case NFS4_SECINFO_STYLE4_PARENT: | ||
792 | err = nfsd4_do_lookupp(rqstp, &cstate->current_fh); | ||
793 | if (err) | ||
794 | return err; | ||
795 | break; | ||
796 | default: | ||
797 | return nfserr_inval; | ||
798 | } | ||
799 | exp_get(cstate->current_fh.fh_export); | ||
800 | sin->sin_exp = cstate->current_fh.fh_export; | ||
801 | fh_put(&cstate->current_fh); | ||
802 | return nfs_ok; | ||
803 | } | ||
804 | |||
805 | static __be32 | ||
776 | nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | 806 | nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
777 | struct nfsd4_setattr *setattr) | 807 | struct nfsd4_setattr *setattr) |
778 | { | 808 | { |
@@ -974,8 +1004,8 @@ static const char *nfsd4_op_name(unsigned opnum); | |||
974 | * Also note, enforced elsewhere: | 1004 | * Also note, enforced elsewhere: |
975 | * - SEQUENCE other than as first op results in | 1005 | * - SEQUENCE other than as first op results in |
976 | * NFS4ERR_SEQUENCE_POS. (Enforced in nfsd4_sequence().) | 1006 | * NFS4ERR_SEQUENCE_POS. (Enforced in nfsd4_sequence().) |
977 | * - BIND_CONN_TO_SESSION must be the only op in its compound | 1007 | * - BIND_CONN_TO_SESSION must be the only op in its compound. |
978 | * (Will be enforced in nfsd4_bind_conn_to_session().) | 1008 | * (Enforced in nfsd4_bind_conn_to_session().) |
979 | * - DESTROY_SESSION must be the final operation in a compound, if | 1009 | * - DESTROY_SESSION must be the final operation in a compound, if |
980 | * sessionid's in SEQUENCE and DESTROY_SESSION are the same. | 1010 | * sessionid's in SEQUENCE and DESTROY_SESSION are the same. |
981 | * (Enforced in nfsd4_destroy_session().) | 1011 | * (Enforced in nfsd4_destroy_session().) |
@@ -1126,10 +1156,6 @@ encode_op: | |||
1126 | 1156 | ||
1127 | nfsd4_increment_op_stats(op->opnum); | 1157 | nfsd4_increment_op_stats(op->opnum); |
1128 | } | 1158 | } |
1129 | if (!rqstp->rq_usedeferral && status == nfserr_dropit) { | ||
1130 | dprintk("%s Dropit - send NFS4ERR_DELAY\n", __func__); | ||
1131 | status = nfserr_jukebox; | ||
1132 | } | ||
1133 | 1159 | ||
1134 | resp->cstate.status = status; | 1160 | resp->cstate.status = status; |
1135 | fh_put(&resp->cstate.current_fh); | 1161 | fh_put(&resp->cstate.current_fh); |
@@ -1300,6 +1326,11 @@ static struct nfsd4_operation nfsd4_ops[] = { | |||
1300 | .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP, | 1326 | .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP, |
1301 | .op_name = "OP_EXCHANGE_ID", | 1327 | .op_name = "OP_EXCHANGE_ID", |
1302 | }, | 1328 | }, |
1329 | [OP_BIND_CONN_TO_SESSION] = { | ||
1330 | .op_func = (nfsd4op_func)nfsd4_bind_conn_to_session, | ||
1331 | .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP, | ||
1332 | .op_name = "OP_BIND_CONN_TO_SESSION", | ||
1333 | }, | ||
1303 | [OP_CREATE_SESSION] = { | 1334 | [OP_CREATE_SESSION] = { |
1304 | .op_func = (nfsd4op_func)nfsd4_create_session, | 1335 | .op_func = (nfsd4op_func)nfsd4_create_session, |
1305 | .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP, | 1336 | .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP, |
@@ -1320,6 +1351,10 @@ static struct nfsd4_operation nfsd4_ops[] = { | |||
1320 | .op_flags = ALLOWED_WITHOUT_FH, | 1351 | .op_flags = ALLOWED_WITHOUT_FH, |
1321 | .op_name = "OP_RECLAIM_COMPLETE", | 1352 | .op_name = "OP_RECLAIM_COMPLETE", |
1322 | }, | 1353 | }, |
1354 | [OP_SECINFO_NO_NAME] = { | ||
1355 | .op_func = (nfsd4op_func)nfsd4_secinfo_no_name, | ||
1356 | .op_name = "OP_SECINFO_NO_NAME", | ||
1357 | }, | ||
1323 | }; | 1358 | }; |
1324 | 1359 | ||
1325 | static const char *nfsd4_op_name(unsigned opnum) | 1360 | static const char *nfsd4_op_name(unsigned opnum) |