diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r-- | fs/nfs/nfs4xdr.c | 187 |
1 files changed, 104 insertions, 83 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index fbbace8a30c4..4bbf5ef57785 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -392,9 +392,11 @@ static int nfs_stat_to_errno(int); | |||
392 | decode_getattr_maxsz) | 392 | decode_getattr_maxsz) |
393 | #define NFS4_enc_delegreturn_sz (compound_encode_hdr_maxsz + \ | 393 | #define NFS4_enc_delegreturn_sz (compound_encode_hdr_maxsz + \ |
394 | encode_putfh_maxsz + \ | 394 | encode_putfh_maxsz + \ |
395 | encode_delegreturn_maxsz) | 395 | encode_delegreturn_maxsz + \ |
396 | encode_getattr_maxsz) | ||
396 | #define NFS4_dec_delegreturn_sz (compound_decode_hdr_maxsz + \ | 397 | #define NFS4_dec_delegreturn_sz (compound_decode_hdr_maxsz + \ |
397 | decode_delegreturn_maxsz) | 398 | decode_delegreturn_maxsz + \ |
399 | decode_getattr_maxsz) | ||
398 | #define NFS4_enc_getacl_sz (compound_encode_hdr_maxsz + \ | 400 | #define NFS4_enc_getacl_sz (compound_encode_hdr_maxsz + \ |
399 | encode_putfh_maxsz + \ | 401 | encode_putfh_maxsz + \ |
400 | encode_getattr_maxsz) | 402 | encode_getattr_maxsz) |
@@ -564,7 +566,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s | |||
564 | } | 566 | } |
565 | if (iap->ia_valid & ATTR_MODE) { | 567 | if (iap->ia_valid & ATTR_MODE) { |
566 | bmval1 |= FATTR4_WORD1_MODE; | 568 | bmval1 |= FATTR4_WORD1_MODE; |
567 | WRITE32(iap->ia_mode); | 569 | WRITE32(iap->ia_mode & S_IALLUGO); |
568 | } | 570 | } |
569 | if (iap->ia_valid & ATTR_UID) { | 571 | if (iap->ia_valid & ATTR_UID) { |
570 | bmval1 |= FATTR4_WORD1_OWNER; | 572 | bmval1 |= FATTR4_WORD1_OWNER; |
@@ -742,69 +744,80 @@ static int encode_link(struct xdr_stream *xdr, const struct qstr *name) | |||
742 | return 0; | 744 | return 0; |
743 | } | 745 | } |
744 | 746 | ||
747 | static inline int nfs4_lock_type(struct file_lock *fl, int block) | ||
748 | { | ||
749 | if ((fl->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) == F_RDLCK) | ||
750 | return block ? NFS4_READW_LT : NFS4_READ_LT; | ||
751 | return block ? NFS4_WRITEW_LT : NFS4_WRITE_LT; | ||
752 | } | ||
753 | |||
754 | static inline uint64_t nfs4_lock_length(struct file_lock *fl) | ||
755 | { | ||
756 | if (fl->fl_end == OFFSET_MAX) | ||
757 | return ~(uint64_t)0; | ||
758 | return fl->fl_end - fl->fl_start + 1; | ||
759 | } | ||
760 | |||
745 | /* | 761 | /* |
746 | * opcode,type,reclaim,offset,length,new_lock_owner = 32 | 762 | * opcode,type,reclaim,offset,length,new_lock_owner = 32 |
747 | * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40 | 763 | * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40 |
748 | */ | 764 | */ |
749 | static int encode_lock(struct xdr_stream *xdr, const struct nfs_lockargs *arg) | 765 | static int encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args) |
750 | { | 766 | { |
751 | uint32_t *p; | 767 | uint32_t *p; |
752 | struct nfs_lock_opargs *opargs = arg->u.lock; | ||
753 | 768 | ||
754 | RESERVE_SPACE(32); | 769 | RESERVE_SPACE(32); |
755 | WRITE32(OP_LOCK); | 770 | WRITE32(OP_LOCK); |
756 | WRITE32(arg->type); | 771 | WRITE32(nfs4_lock_type(args->fl, args->block)); |
757 | WRITE32(opargs->reclaim); | 772 | WRITE32(args->reclaim); |
758 | WRITE64(arg->offset); | 773 | WRITE64(args->fl->fl_start); |
759 | WRITE64(arg->length); | 774 | WRITE64(nfs4_lock_length(args->fl)); |
760 | WRITE32(opargs->new_lock_owner); | 775 | WRITE32(args->new_lock_owner); |
761 | if (opargs->new_lock_owner){ | 776 | if (args->new_lock_owner){ |
762 | RESERVE_SPACE(40); | 777 | RESERVE_SPACE(40); |
763 | WRITE32(opargs->open_seqid->sequence->counter); | 778 | WRITE32(args->open_seqid->sequence->counter); |
764 | WRITEMEM(opargs->open_stateid->data, sizeof(opargs->open_stateid->data)); | 779 | WRITEMEM(args->open_stateid->data, sizeof(args->open_stateid->data)); |
765 | WRITE32(opargs->lock_seqid->sequence->counter); | 780 | WRITE32(args->lock_seqid->sequence->counter); |
766 | WRITE64(opargs->lock_owner.clientid); | 781 | WRITE64(args->lock_owner.clientid); |
767 | WRITE32(4); | 782 | WRITE32(4); |
768 | WRITE32(opargs->lock_owner.id); | 783 | WRITE32(args->lock_owner.id); |
769 | } | 784 | } |
770 | else { | 785 | else { |
771 | RESERVE_SPACE(20); | 786 | RESERVE_SPACE(20); |
772 | WRITEMEM(opargs->lock_stateid->data, sizeof(opargs->lock_stateid->data)); | 787 | WRITEMEM(args->lock_stateid->data, sizeof(args->lock_stateid->data)); |
773 | WRITE32(opargs->lock_seqid->sequence->counter); | 788 | WRITE32(args->lock_seqid->sequence->counter); |
774 | } | 789 | } |
775 | 790 | ||
776 | return 0; | 791 | return 0; |
777 | } | 792 | } |
778 | 793 | ||
779 | static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockargs *arg) | 794 | static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *args) |
780 | { | 795 | { |
781 | uint32_t *p; | 796 | uint32_t *p; |
782 | struct nfs_lowner *opargs = arg->u.lockt; | ||
783 | 797 | ||
784 | RESERVE_SPACE(40); | 798 | RESERVE_SPACE(40); |
785 | WRITE32(OP_LOCKT); | 799 | WRITE32(OP_LOCKT); |
786 | WRITE32(arg->type); | 800 | WRITE32(nfs4_lock_type(args->fl, 0)); |
787 | WRITE64(arg->offset); | 801 | WRITE64(args->fl->fl_start); |
788 | WRITE64(arg->length); | 802 | WRITE64(nfs4_lock_length(args->fl)); |
789 | WRITE64(opargs->clientid); | 803 | WRITE64(args->lock_owner.clientid); |
790 | WRITE32(4); | 804 | WRITE32(4); |
791 | WRITE32(opargs->id); | 805 | WRITE32(args->lock_owner.id); |
792 | 806 | ||
793 | return 0; | 807 | return 0; |
794 | } | 808 | } |
795 | 809 | ||
796 | static int encode_locku(struct xdr_stream *xdr, const struct nfs_lockargs *arg) | 810 | static int encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *args) |
797 | { | 811 | { |
798 | uint32_t *p; | 812 | uint32_t *p; |
799 | struct nfs_locku_opargs *opargs = arg->u.locku; | ||
800 | 813 | ||
801 | RESERVE_SPACE(44); | 814 | RESERVE_SPACE(44); |
802 | WRITE32(OP_LOCKU); | 815 | WRITE32(OP_LOCKU); |
803 | WRITE32(arg->type); | 816 | WRITE32(nfs4_lock_type(args->fl, 0)); |
804 | WRITE32(opargs->seqid->sequence->counter); | 817 | WRITE32(args->seqid->sequence->counter); |
805 | WRITEMEM(opargs->stateid->data, sizeof(opargs->stateid->data)); | 818 | WRITEMEM(args->stateid->data, sizeof(args->stateid->data)); |
806 | WRITE64(arg->offset); | 819 | WRITE64(args->fl->fl_start); |
807 | WRITE64(arg->length); | 820 | WRITE64(nfs4_lock_length(args->fl)); |
808 | 821 | ||
809 | return 0; | 822 | return 0; |
810 | } | 823 | } |
@@ -964,9 +977,9 @@ static int encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_con | |||
964 | { | 977 | { |
965 | uint32_t *p; | 978 | uint32_t *p; |
966 | 979 | ||
967 | RESERVE_SPACE(8+sizeof(arg->stateid.data)); | 980 | RESERVE_SPACE(8+sizeof(arg->stateid->data)); |
968 | WRITE32(OP_OPEN_CONFIRM); | 981 | WRITE32(OP_OPEN_CONFIRM); |
969 | WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); | 982 | WRITEMEM(arg->stateid->data, sizeof(arg->stateid->data)); |
970 | WRITE32(arg->seqid->sequence->counter); | 983 | WRITE32(arg->seqid->sequence->counter); |
971 | 984 | ||
972 | return 0; | 985 | return 0; |
@@ -1499,9 +1512,6 @@ static int nfs4_xdr_enc_open(struct rpc_rqst *req, uint32_t *p, struct nfs_opena | |||
1499 | }; | 1512 | }; |
1500 | int status; | 1513 | int status; |
1501 | 1514 | ||
1502 | status = nfs_wait_on_sequence(args->seqid, req->rq_task); | ||
1503 | if (status != 0) | ||
1504 | goto out; | ||
1505 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1515 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
1506 | encode_compound_hdr(&xdr, &hdr); | 1516 | encode_compound_hdr(&xdr, &hdr); |
1507 | status = encode_putfh(&xdr, args->fh); | 1517 | status = encode_putfh(&xdr, args->fh); |
@@ -1538,9 +1548,6 @@ static int nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, uint32_t *p, struct n | |||
1538 | }; | 1548 | }; |
1539 | int status; | 1549 | int status; |
1540 | 1550 | ||
1541 | status = nfs_wait_on_sequence(args->seqid, req->rq_task); | ||
1542 | if (status != 0) | ||
1543 | goto out; | ||
1544 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1551 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
1545 | encode_compound_hdr(&xdr, &hdr); | 1552 | encode_compound_hdr(&xdr, &hdr); |
1546 | status = encode_putfh(&xdr, args->fh); | 1553 | status = encode_putfh(&xdr, args->fh); |
@@ -1558,19 +1565,19 @@ static int nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, uint32_t *p, struct nf | |||
1558 | { | 1565 | { |
1559 | struct xdr_stream xdr; | 1566 | struct xdr_stream xdr; |
1560 | struct compound_hdr hdr = { | 1567 | struct compound_hdr hdr = { |
1561 | .nops = 2, | 1568 | .nops = 3, |
1562 | }; | 1569 | }; |
1563 | int status; | 1570 | int status; |
1564 | 1571 | ||
1565 | status = nfs_wait_on_sequence(args->seqid, req->rq_task); | ||
1566 | if (status != 0) | ||
1567 | goto out; | ||
1568 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1572 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
1569 | encode_compound_hdr(&xdr, &hdr); | 1573 | encode_compound_hdr(&xdr, &hdr); |
1570 | status = encode_putfh(&xdr, args->fh); | 1574 | status = encode_putfh(&xdr, args->fh); |
1571 | if (status) | 1575 | if (status) |
1572 | goto out; | 1576 | goto out; |
1573 | status = encode_open(&xdr, args); | 1577 | status = encode_open(&xdr, args); |
1578 | if (status) | ||
1579 | goto out; | ||
1580 | status = encode_getfattr(&xdr, args->bitmask); | ||
1574 | out: | 1581 | out: |
1575 | return status; | 1582 | return status; |
1576 | } | 1583 | } |
@@ -1602,21 +1609,14 @@ out: | |||
1602 | /* | 1609 | /* |
1603 | * Encode a LOCK request | 1610 | * Encode a LOCK request |
1604 | */ | 1611 | */ |
1605 | static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args) | 1612 | static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lock_args *args) |
1606 | { | 1613 | { |
1607 | struct xdr_stream xdr; | 1614 | struct xdr_stream xdr; |
1608 | struct compound_hdr hdr = { | 1615 | struct compound_hdr hdr = { |
1609 | .nops = 2, | 1616 | .nops = 2, |
1610 | }; | 1617 | }; |
1611 | struct nfs_lock_opargs *opargs = args->u.lock; | ||
1612 | int status; | 1618 | int status; |
1613 | 1619 | ||
1614 | status = nfs_wait_on_sequence(opargs->lock_seqid, req->rq_task); | ||
1615 | if (status != 0) | ||
1616 | goto out; | ||
1617 | /* Do we need to do an open_to_lock_owner? */ | ||
1618 | if (opargs->lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED) | ||
1619 | opargs->new_lock_owner = 0; | ||
1620 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1620 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
1621 | encode_compound_hdr(&xdr, &hdr); | 1621 | encode_compound_hdr(&xdr, &hdr); |
1622 | status = encode_putfh(&xdr, args->fh); | 1622 | status = encode_putfh(&xdr, args->fh); |
@@ -1630,7 +1630,7 @@ out: | |||
1630 | /* | 1630 | /* |
1631 | * Encode a LOCKT request | 1631 | * Encode a LOCKT request |
1632 | */ | 1632 | */ |
1633 | static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args) | 1633 | static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockt_args *args) |
1634 | { | 1634 | { |
1635 | struct xdr_stream xdr; | 1635 | struct xdr_stream xdr; |
1636 | struct compound_hdr hdr = { | 1636 | struct compound_hdr hdr = { |
@@ -1651,7 +1651,7 @@ out: | |||
1651 | /* | 1651 | /* |
1652 | * Encode a LOCKU request | 1652 | * Encode a LOCKU request |
1653 | */ | 1653 | */ |
1654 | static int nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args) | 1654 | static int nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_locku_args *args) |
1655 | { | 1655 | { |
1656 | struct xdr_stream xdr; | 1656 | struct xdr_stream xdr; |
1657 | struct compound_hdr hdr = { | 1657 | struct compound_hdr hdr = { |
@@ -1985,14 +1985,20 @@ static int nfs4_xdr_enc_delegreturn(struct rpc_rqst *req, uint32_t *p, const str | |||
1985 | { | 1985 | { |
1986 | struct xdr_stream xdr; | 1986 | struct xdr_stream xdr; |
1987 | struct compound_hdr hdr = { | 1987 | struct compound_hdr hdr = { |
1988 | .nops = 2, | 1988 | .nops = 3, |
1989 | }; | 1989 | }; |
1990 | int status; | 1990 | int status; |
1991 | 1991 | ||
1992 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1992 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
1993 | encode_compound_hdr(&xdr, &hdr); | 1993 | encode_compound_hdr(&xdr, &hdr); |
1994 | if ((status = encode_putfh(&xdr, args->fhandle)) == 0) | 1994 | status = encode_putfh(&xdr, args->fhandle); |
1995 | status = encode_delegreturn(&xdr, args->stateid); | 1995 | if (status != 0) |
1996 | goto out; | ||
1997 | status = encode_delegreturn(&xdr, args->stateid); | ||
1998 | if (status != 0) | ||
1999 | goto out; | ||
2000 | status = encode_getfattr(&xdr, args->bitmask); | ||
2001 | out: | ||
1996 | return status; | 2002 | return status; |
1997 | } | 2003 | } |
1998 | 2004 | ||
@@ -2955,55 +2961,64 @@ static int decode_link(struct xdr_stream *xdr, struct nfs4_change_info *cinfo) | |||
2955 | /* | 2961 | /* |
2956 | * We create the owner, so we know a proper owner.id length is 4. | 2962 | * We create the owner, so we know a proper owner.id length is 4. |
2957 | */ | 2963 | */ |
2958 | static int decode_lock_denied (struct xdr_stream *xdr, struct nfs_lock_denied *denied) | 2964 | static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl) |
2959 | { | 2965 | { |
2966 | uint64_t offset, length, clientid; | ||
2960 | uint32_t *p; | 2967 | uint32_t *p; |
2961 | uint32_t namelen; | 2968 | uint32_t namelen, type; |
2962 | 2969 | ||
2963 | READ_BUF(32); | 2970 | READ_BUF(32); |
2964 | READ64(denied->offset); | 2971 | READ64(offset); |
2965 | READ64(denied->length); | 2972 | READ64(length); |
2966 | READ32(denied->type); | 2973 | READ32(type); |
2967 | READ64(denied->owner.clientid); | 2974 | if (fl != NULL) { |
2975 | fl->fl_start = (loff_t)offset; | ||
2976 | fl->fl_end = fl->fl_start + (loff_t)length - 1; | ||
2977 | if (length == ~(uint64_t)0) | ||
2978 | fl->fl_end = OFFSET_MAX; | ||
2979 | fl->fl_type = F_WRLCK; | ||
2980 | if (type & 1) | ||
2981 | fl->fl_type = F_RDLCK; | ||
2982 | fl->fl_pid = 0; | ||
2983 | } | ||
2984 | READ64(clientid); | ||
2968 | READ32(namelen); | 2985 | READ32(namelen); |
2969 | READ_BUF(namelen); | 2986 | READ_BUF(namelen); |
2970 | if (namelen == 4) | ||
2971 | READ32(denied->owner.id); | ||
2972 | return -NFS4ERR_DENIED; | 2987 | return -NFS4ERR_DENIED; |
2973 | } | 2988 | } |
2974 | 2989 | ||
2975 | static int decode_lock(struct xdr_stream *xdr, struct nfs_lockres *res) | 2990 | static int decode_lock(struct xdr_stream *xdr, struct nfs_lock_res *res) |
2976 | { | 2991 | { |
2977 | uint32_t *p; | 2992 | uint32_t *p; |
2978 | int status; | 2993 | int status; |
2979 | 2994 | ||
2980 | status = decode_op_hdr(xdr, OP_LOCK); | 2995 | status = decode_op_hdr(xdr, OP_LOCK); |
2981 | if (status == 0) { | 2996 | if (status == 0) { |
2982 | READ_BUF(sizeof(res->u.stateid.data)); | 2997 | READ_BUF(sizeof(res->stateid.data)); |
2983 | COPYMEM(res->u.stateid.data, sizeof(res->u.stateid.data)); | 2998 | COPYMEM(res->stateid.data, sizeof(res->stateid.data)); |
2984 | } else if (status == -NFS4ERR_DENIED) | 2999 | } else if (status == -NFS4ERR_DENIED) |
2985 | return decode_lock_denied(xdr, &res->u.denied); | 3000 | return decode_lock_denied(xdr, NULL); |
2986 | return status; | 3001 | return status; |
2987 | } | 3002 | } |
2988 | 3003 | ||
2989 | static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockres *res) | 3004 | static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockt_res *res) |
2990 | { | 3005 | { |
2991 | int status; | 3006 | int status; |
2992 | status = decode_op_hdr(xdr, OP_LOCKT); | 3007 | status = decode_op_hdr(xdr, OP_LOCKT); |
2993 | if (status == -NFS4ERR_DENIED) | 3008 | if (status == -NFS4ERR_DENIED) |
2994 | return decode_lock_denied(xdr, &res->u.denied); | 3009 | return decode_lock_denied(xdr, res->denied); |
2995 | return status; | 3010 | return status; |
2996 | } | 3011 | } |
2997 | 3012 | ||
2998 | static int decode_locku(struct xdr_stream *xdr, struct nfs_lockres *res) | 3013 | static int decode_locku(struct xdr_stream *xdr, struct nfs_locku_res *res) |
2999 | { | 3014 | { |
3000 | uint32_t *p; | 3015 | uint32_t *p; |
3001 | int status; | 3016 | int status; |
3002 | 3017 | ||
3003 | status = decode_op_hdr(xdr, OP_LOCKU); | 3018 | status = decode_op_hdr(xdr, OP_LOCKU); |
3004 | if (status == 0) { | 3019 | if (status == 0) { |
3005 | READ_BUF(sizeof(res->u.stateid.data)); | 3020 | READ_BUF(sizeof(res->stateid.data)); |
3006 | COPYMEM(res->u.stateid.data, sizeof(res->u.stateid.data)); | 3021 | COPYMEM(res->stateid.data, sizeof(res->stateid.data)); |
3007 | } | 3022 | } |
3008 | return status; | 3023 | return status; |
3009 | } | 3024 | } |
@@ -3831,6 +3846,9 @@ static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, uint32_t *p, struct | |||
3831 | if (status) | 3846 | if (status) |
3832 | goto out; | 3847 | goto out; |
3833 | status = decode_open(&xdr, res); | 3848 | status = decode_open(&xdr, res); |
3849 | if (status) | ||
3850 | goto out; | ||
3851 | decode_getfattr(&xdr, res->f_attr, res->server); | ||
3834 | out: | 3852 | out: |
3835 | return status; | 3853 | return status; |
3836 | } | 3854 | } |
@@ -3864,7 +3882,7 @@ out: | |||
3864 | /* | 3882 | /* |
3865 | * Decode LOCK response | 3883 | * Decode LOCK response |
3866 | */ | 3884 | */ |
3867 | static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res) | 3885 | static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lock_res *res) |
3868 | { | 3886 | { |
3869 | struct xdr_stream xdr; | 3887 | struct xdr_stream xdr; |
3870 | struct compound_hdr hdr; | 3888 | struct compound_hdr hdr; |
@@ -3885,7 +3903,7 @@ out: | |||
3885 | /* | 3903 | /* |
3886 | * Decode LOCKT response | 3904 | * Decode LOCKT response |
3887 | */ | 3905 | */ |
3888 | static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res) | 3906 | static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockt_res *res) |
3889 | { | 3907 | { |
3890 | struct xdr_stream xdr; | 3908 | struct xdr_stream xdr; |
3891 | struct compound_hdr hdr; | 3909 | struct compound_hdr hdr; |
@@ -3906,7 +3924,7 @@ out: | |||
3906 | /* | 3924 | /* |
3907 | * Decode LOCKU response | 3925 | * Decode LOCKU response |
3908 | */ | 3926 | */ |
3909 | static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res) | 3927 | static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_locku_res *res) |
3910 | { | 3928 | { |
3911 | struct xdr_stream xdr; | 3929 | struct xdr_stream xdr; |
3912 | struct compound_hdr hdr; | 3930 | struct compound_hdr hdr; |
@@ -4174,7 +4192,7 @@ static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, s | |||
4174 | /* | 4192 | /* |
4175 | * DELEGRETURN request | 4193 | * DELEGRETURN request |
4176 | */ | 4194 | */ |
4177 | static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, uint32_t *p, void *dummy) | 4195 | static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_delegreturnres *res) |
4178 | { | 4196 | { |
4179 | struct xdr_stream xdr; | 4197 | struct xdr_stream xdr; |
4180 | struct compound_hdr hdr; | 4198 | struct compound_hdr hdr; |
@@ -4182,11 +4200,14 @@ static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, uint32_t *p, void *d | |||
4182 | 4200 | ||
4183 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 4201 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
4184 | status = decode_compound_hdr(&xdr, &hdr); | 4202 | status = decode_compound_hdr(&xdr, &hdr); |
4185 | if (status == 0) { | 4203 | if (status != 0) |
4186 | status = decode_putfh(&xdr); | 4204 | goto out; |
4187 | if (status == 0) | 4205 | status = decode_putfh(&xdr); |
4188 | status = decode_delegreturn(&xdr); | 4206 | if (status != 0) |
4189 | } | 4207 | goto out; |
4208 | status = decode_delegreturn(&xdr); | ||
4209 | decode_getfattr(&xdr, res->fattr, res->server); | ||
4210 | out: | ||
4190 | return status; | 4211 | return status; |
4191 | } | 4212 | } |
4192 | 4213 | ||