diff options
author | David Teigland <teigland@redhat.com> | 2006-01-20 03:59:41 -0500 |
---|---|---|
committer | Steven Whitehouse <steve@chygwyn.com> | 2006-01-20 03:59:41 -0500 |
commit | 044399b2cb6ad2d7f63cfca945268853d7443a4d (patch) | |
tree | 5f96eb307b0389ac0b919a4744a40862b615e9da /fs/nfsd/nfs4proc.c | |
parent | 901359256b2666f52a3a7d3f31927677e91b3a2a (diff) | |
parent | 18a4144028f056b77d6576d4eb284246e9c7ea97 (diff) |
Merge branch 'master'
Diffstat (limited to 'fs/nfsd/nfs4proc.c')
-rw-r--r-- | fs/nfsd/nfs4proc.c | 55 |
1 files changed, 27 insertions, 28 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 361b4007d4a0..a00fe8686293 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c | |||
@@ -192,6 +192,14 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open | |||
192 | } | 192 | } |
193 | if (status) | 193 | if (status) |
194 | goto out; | 194 | goto out; |
195 | |||
196 | /* Openowner is now set, so sequence id will get bumped. Now we need | ||
197 | * these checks before we do any creates: */ | ||
198 | if (nfs4_in_grace() && open->op_claim_type != NFS4_OPEN_CLAIM_PREVIOUS) | ||
199 | return nfserr_grace; | ||
200 | if (!nfs4_in_grace() && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS) | ||
201 | return nfserr_no_grace; | ||
202 | |||
195 | switch (open->op_claim_type) { | 203 | switch (open->op_claim_type) { |
196 | case NFS4_OPEN_CLAIM_DELEGATE_CUR: | 204 | case NFS4_OPEN_CLAIM_DELEGATE_CUR: |
197 | status = nfserr_inval; | 205 | status = nfserr_inval; |
@@ -210,6 +218,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open | |||
210 | goto out; | 218 | goto out; |
211 | break; | 219 | break; |
212 | case NFS4_OPEN_CLAIM_PREVIOUS: | 220 | case NFS4_OPEN_CLAIM_PREVIOUS: |
221 | open->op_stateowner->so_confirmed = 1; | ||
213 | /* | 222 | /* |
214 | * The CURRENT_FH is already set to the file being | 223 | * The CURRENT_FH is already set to the file being |
215 | * opened. (1) set open->op_cinfo, (2) set | 224 | * opened. (1) set open->op_cinfo, (2) set |
@@ -221,6 +230,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open | |||
221 | goto out; | 230 | goto out; |
222 | break; | 231 | break; |
223 | case NFS4_OPEN_CLAIM_DELEGATE_PREV: | 232 | case NFS4_OPEN_CLAIM_DELEGATE_PREV: |
233 | open->op_stateowner->so_confirmed = 1; | ||
224 | printk("NFSD: unsupported OPEN claim type %d\n", | 234 | printk("NFSD: unsupported OPEN claim type %d\n", |
225 | open->op_claim_type); | 235 | open->op_claim_type); |
226 | status = nfserr_notsupp; | 236 | status = nfserr_notsupp; |
@@ -584,31 +594,23 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_se | |||
584 | { | 594 | { |
585 | int status = nfs_ok; | 595 | int status = nfs_ok; |
586 | 596 | ||
587 | if (!current_fh->fh_dentry) | ||
588 | return nfserr_nofilehandle; | ||
589 | |||
590 | status = nfs_ok; | ||
591 | if (setattr->sa_iattr.ia_valid & ATTR_SIZE) { | 597 | if (setattr->sa_iattr.ia_valid & ATTR_SIZE) { |
592 | nfs4_lock_state(); | 598 | nfs4_lock_state(); |
593 | if ((status = nfs4_preprocess_stateid_op(current_fh, | 599 | status = nfs4_preprocess_stateid_op(current_fh, |
594 | &setattr->sa_stateid, | 600 | &setattr->sa_stateid, CHECK_FH | WR_STATE, NULL); |
595 | CHECK_FH | WR_STATE, NULL))) { | ||
596 | dprintk("NFSD: nfsd4_setattr: couldn't process stateid!\n"); | ||
597 | goto out_unlock; | ||
598 | } | ||
599 | nfs4_unlock_state(); | 601 | nfs4_unlock_state(); |
602 | if (status) { | ||
603 | dprintk("NFSD: nfsd4_setattr: couldn't process stateid!"); | ||
604 | return status; | ||
605 | } | ||
600 | } | 606 | } |
601 | status = nfs_ok; | 607 | status = nfs_ok; |
602 | if (setattr->sa_acl != NULL) | 608 | if (setattr->sa_acl != NULL) |
603 | status = nfsd4_set_nfs4_acl(rqstp, current_fh, setattr->sa_acl); | 609 | status = nfsd4_set_nfs4_acl(rqstp, current_fh, setattr->sa_acl); |
604 | if (status) | 610 | if (status) |
605 | goto out; | 611 | return status; |
606 | status = nfsd_setattr(rqstp, current_fh, &setattr->sa_iattr, | 612 | status = nfsd_setattr(rqstp, current_fh, &setattr->sa_iattr, |
607 | 0, (time_t)0); | 613 | 0, (time_t)0); |
608 | out: | ||
609 | return status; | ||
610 | out_unlock: | ||
611 | nfs4_unlock_state(); | ||
612 | return status; | 614 | return status; |
613 | } | 615 | } |
614 | 616 | ||
@@ -626,15 +628,17 @@ nfsd4_write(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_writ | |||
626 | return nfserr_inval; | 628 | return nfserr_inval; |
627 | 629 | ||
628 | nfs4_lock_state(); | 630 | nfs4_lock_state(); |
629 | if ((status = nfs4_preprocess_stateid_op(current_fh, stateid, | 631 | status = nfs4_preprocess_stateid_op(current_fh, stateid, |
630 | CHECK_FH | WR_STATE, &filp))) { | 632 | CHECK_FH | WR_STATE, &filp); |
631 | dprintk("NFSD: nfsd4_write: couldn't process stateid!\n"); | ||
632 | goto out; | ||
633 | } | ||
634 | if (filp) | 633 | if (filp) |
635 | get_file(filp); | 634 | get_file(filp); |
636 | nfs4_unlock_state(); | 635 | nfs4_unlock_state(); |
637 | 636 | ||
637 | if (status) { | ||
638 | dprintk("NFSD: nfsd4_write: couldn't process stateid!\n"); | ||
639 | return status; | ||
640 | } | ||
641 | |||
638 | write->wr_bytes_written = write->wr_buflen; | 642 | write->wr_bytes_written = write->wr_buflen; |
639 | write->wr_how_written = write->wr_stable_how; | 643 | write->wr_how_written = write->wr_stable_how; |
640 | p = (u32 *)write->wr_verifier.data; | 644 | p = (u32 *)write->wr_verifier.data; |
@@ -650,9 +654,6 @@ nfsd4_write(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_writ | |||
650 | if (status == nfserr_symlink) | 654 | if (status == nfserr_symlink) |
651 | status = nfserr_inval; | 655 | status = nfserr_inval; |
652 | return status; | 656 | return status; |
653 | out: | ||
654 | nfs4_unlock_state(); | ||
655 | return status; | ||
656 | } | 657 | } |
657 | 658 | ||
658 | /* This routine never returns NFS_OK! If there are no other errors, it | 659 | /* This routine never returns NFS_OK! If there are no other errors, it |
@@ -768,6 +769,8 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, | |||
768 | while (!status && resp->opcnt < args->opcnt) { | 769 | while (!status && resp->opcnt < args->opcnt) { |
769 | op = &args->ops[resp->opcnt++]; | 770 | op = &args->ops[resp->opcnt++]; |
770 | 771 | ||
772 | dprintk("nfsv4 compound op #%d: %d\n", resp->opcnt, op->opnum); | ||
773 | |||
771 | /* | 774 | /* |
772 | * The XDR decode routines may have pre-set op->status; | 775 | * The XDR decode routines may have pre-set op->status; |
773 | * for example, if there is a miscellaneous XDR error | 776 | * for example, if there is a miscellaneous XDR error |
@@ -792,17 +795,13 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, | |||
792 | /* All operations except RENEW, SETCLIENTID, RESTOREFH | 795 | /* All operations except RENEW, SETCLIENTID, RESTOREFH |
793 | * SETCLIENTID_CONFIRM, PUTFH and PUTROOTFH | 796 | * SETCLIENTID_CONFIRM, PUTFH and PUTROOTFH |
794 | * require a valid current filehandle | 797 | * require a valid current filehandle |
795 | * | ||
796 | * SETATTR NOFILEHANDLE error handled in nfsd4_setattr | ||
797 | * due to required returned bitmap argument | ||
798 | */ | 798 | */ |
799 | if ((!current_fh->fh_dentry) && | 799 | if ((!current_fh->fh_dentry) && |
800 | !((op->opnum == OP_PUTFH) || (op->opnum == OP_PUTROOTFH) || | 800 | !((op->opnum == OP_PUTFH) || (op->opnum == OP_PUTROOTFH) || |
801 | (op->opnum == OP_SETCLIENTID) || | 801 | (op->opnum == OP_SETCLIENTID) || |
802 | (op->opnum == OP_SETCLIENTID_CONFIRM) || | 802 | (op->opnum == OP_SETCLIENTID_CONFIRM) || |
803 | (op->opnum == OP_RENEW) || (op->opnum == OP_RESTOREFH) || | 803 | (op->opnum == OP_RENEW) || (op->opnum == OP_RESTOREFH) || |
804 | (op->opnum == OP_RELEASE_LOCKOWNER) || | 804 | (op->opnum == OP_RELEASE_LOCKOWNER))) { |
805 | (op->opnum == OP_SETATTR))) { | ||
806 | op->status = nfserr_nofilehandle; | 805 | op->status = nfserr_nofilehandle; |
807 | goto encode_op; | 806 | goto encode_op; |
808 | } | 807 | } |