nfs3xdr.c (dae9a6cab8009e526570e7477ce858dcdfeb256e) nfs3xdr.c (16c663642c7ec03cd4cee5fec520bb69e97babe4)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * XDR support for nfsd/protocol version 3.
4 *
5 * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
6 *
7 * 2003-08-09 Jamie Lokier: Use htonl() for nanoseconds, not htons()!
8 */

--- 543 unchanged lines hidden (view full) ---

552 nfsd4_change_attribute(&fhp->fh_post_attr, inode);
553}
554
555/*
556 * XDR decode functions
557 */
558
559int
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * XDR support for nfsd/protocol version 3.
4 *
5 * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
6 *
7 * 2003-08-09 Jamie Lokier: Use htonl() for nanoseconds, not htons()!
8 */

--- 543 unchanged lines hidden (view full) ---

552 nfsd4_change_attribute(&fhp->fh_post_attr, inode);
553}
554
555/*
556 * XDR decode functions
557 */
558
559int
560nfs3svc_decode_fhandleargs(struct svc_rqst *rqstp, __be32 *p)
560nfs3svc_decode_fhandleargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
561{
561{
562 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
563 struct nfsd_fhandle *args = rqstp->rq_argp;
564
565 return svcxdr_decode_nfs_fh3(xdr, &args->fh);
566}
567
568int
562 struct nfsd_fhandle *args = rqstp->rq_argp;
563
564 return svcxdr_decode_nfs_fh3(xdr, &args->fh);
565}
566
567int
569nfs3svc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p)
568nfs3svc_decode_sattrargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
570{
569{
571 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
572 struct nfsd3_sattrargs *args = rqstp->rq_argp;
573
574 return svcxdr_decode_nfs_fh3(xdr, &args->fh) &&
575 svcxdr_decode_sattr3(rqstp, xdr, &args->attrs) &&
576 svcxdr_decode_sattrguard3(xdr, args);
577}
578
579int
570 struct nfsd3_sattrargs *args = rqstp->rq_argp;
571
572 return svcxdr_decode_nfs_fh3(xdr, &args->fh) &&
573 svcxdr_decode_sattr3(rqstp, xdr, &args->attrs) &&
574 svcxdr_decode_sattrguard3(xdr, args);
575}
576
577int
580nfs3svc_decode_diropargs(struct svc_rqst *rqstp, __be32 *p)
578nfs3svc_decode_diropargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
581{
579{
582 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
583 struct nfsd3_diropargs *args = rqstp->rq_argp;
584
585 return svcxdr_decode_diropargs3(xdr, &args->fh, &args->name, &args->len);
586}
587
588int
580 struct nfsd3_diropargs *args = rqstp->rq_argp;
581
582 return svcxdr_decode_diropargs3(xdr, &args->fh, &args->name, &args->len);
583}
584
585int
589nfs3svc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
586nfs3svc_decode_accessargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
590{
587{
591 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
592 struct nfsd3_accessargs *args = rqstp->rq_argp;
593
594 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
595 return 0;
596 if (xdr_stream_decode_u32(xdr, &args->access) < 0)
597 return 0;
598
599 return 1;
600}
601
602int
588 struct nfsd3_accessargs *args = rqstp->rq_argp;
589
590 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
591 return 0;
592 if (xdr_stream_decode_u32(xdr, &args->access) < 0)
593 return 0;
594
595 return 1;
596}
597
598int
603nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p)
599nfs3svc_decode_readargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
604{
600{
605 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
606 struct nfsd3_readargs *args = rqstp->rq_argp;
607
608 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
609 return 0;
610 if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
611 return 0;
612 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
613 return 0;
614
615 return 1;
616}
617
618int
601 struct nfsd3_readargs *args = rqstp->rq_argp;
602
603 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
604 return 0;
605 if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
606 return 0;
607 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
608 return 0;
609
610 return 1;
611}
612
613int
619nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
614nfs3svc_decode_writeargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
620{
615{
621 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
622 struct nfsd3_writeargs *args = rqstp->rq_argp;
623 u32 max_blocksize = svc_max_payload(rqstp);
624
625 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
626 return 0;
627 if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
628 return 0;
629 if (xdr_stream_decode_u32(xdr, &args->count) < 0)

--- 14 unchanged lines hidden (view full) ---

644 }
645 if (!xdr_stream_subsegment(xdr, &args->payload, args->count))
646 return 0;
647
648 return 1;
649}
650
651int
616 struct nfsd3_writeargs *args = rqstp->rq_argp;
617 u32 max_blocksize = svc_max_payload(rqstp);
618
619 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
620 return 0;
621 if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
622 return 0;
623 if (xdr_stream_decode_u32(xdr, &args->count) < 0)

--- 14 unchanged lines hidden (view full) ---

638 }
639 if (!xdr_stream_subsegment(xdr, &args->payload, args->count))
640 return 0;
641
642 return 1;
643}
644
645int
652nfs3svc_decode_createargs(struct svc_rqst *rqstp, __be32 *p)
646nfs3svc_decode_createargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
653{
647{
654 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
655 struct nfsd3_createargs *args = rqstp->rq_argp;
656
657 if (!svcxdr_decode_diropargs3(xdr, &args->fh, &args->name, &args->len))
658 return 0;
659 if (xdr_stream_decode_u32(xdr, &args->createmode) < 0)
660 return 0;
661 switch (args->createmode) {
662 case NFS3_CREATE_UNCHECKED:

--- 6 unchanged lines hidden (view full) ---

669 break;
670 default:
671 return 0;
672 }
673 return 1;
674}
675
676int
648 struct nfsd3_createargs *args = rqstp->rq_argp;
649
650 if (!svcxdr_decode_diropargs3(xdr, &args->fh, &args->name, &args->len))
651 return 0;
652 if (xdr_stream_decode_u32(xdr, &args->createmode) < 0)
653 return 0;
654 switch (args->createmode) {
655 case NFS3_CREATE_UNCHECKED:

--- 6 unchanged lines hidden (view full) ---

662 break;
663 default:
664 return 0;
665 }
666 return 1;
667}
668
669int
677nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, __be32 *p)
670nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
678{
671{
679 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
680 struct nfsd3_createargs *args = rqstp->rq_argp;
681
682 return svcxdr_decode_diropargs3(xdr, &args->fh,
683 &args->name, &args->len) &&
684 svcxdr_decode_sattr3(rqstp, xdr, &args->attrs);
685}
686
687int
672 struct nfsd3_createargs *args = rqstp->rq_argp;
673
674 return svcxdr_decode_diropargs3(xdr, &args->fh,
675 &args->name, &args->len) &&
676 svcxdr_decode_sattr3(rqstp, xdr, &args->attrs);
677}
678
679int
688nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p)
680nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
689{
681{
690 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
691 struct nfsd3_symlinkargs *args = rqstp->rq_argp;
692 struct kvec *head = rqstp->rq_arg.head;
693 struct kvec *tail = rqstp->rq_arg.tail;
694 size_t remaining;
695
696 if (!svcxdr_decode_diropargs3(xdr, &args->ffh, &args->fname, &args->flen))
697 return 0;
698 if (!svcxdr_decode_sattr3(rqstp, xdr, &args->attrs))

--- 9 unchanged lines hidden (view full) ---

708
709 args->first.iov_base = xdr->p;
710 args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);
711
712 return 1;
713}
714
715int
682 struct nfsd3_symlinkargs *args = rqstp->rq_argp;
683 struct kvec *head = rqstp->rq_arg.head;
684 struct kvec *tail = rqstp->rq_arg.tail;
685 size_t remaining;
686
687 if (!svcxdr_decode_diropargs3(xdr, &args->ffh, &args->fname, &args->flen))
688 return 0;
689 if (!svcxdr_decode_sattr3(rqstp, xdr, &args->attrs))

--- 9 unchanged lines hidden (view full) ---

699
700 args->first.iov_base = xdr->p;
701 args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);
702
703 return 1;
704}
705
706int
716nfs3svc_decode_mknodargs(struct svc_rqst *rqstp, __be32 *p)
707nfs3svc_decode_mknodargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
717{
708{
718 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
719 struct nfsd3_mknodargs *args = rqstp->rq_argp;
720
721 if (!svcxdr_decode_diropargs3(xdr, &args->fh, &args->name, &args->len))
722 return 0;
723 if (xdr_stream_decode_u32(xdr, &args->ftype) < 0)
724 return 0;
725 switch (args->ftype) {
726 case NF3CHR:

--- 10 unchanged lines hidden (view full) ---

737 default:
738 return 0;
739 }
740
741 return 1;
742}
743
744int
709 struct nfsd3_mknodargs *args = rqstp->rq_argp;
710
711 if (!svcxdr_decode_diropargs3(xdr, &args->fh, &args->name, &args->len))
712 return 0;
713 if (xdr_stream_decode_u32(xdr, &args->ftype) < 0)
714 return 0;
715 switch (args->ftype) {
716 case NF3CHR:

--- 10 unchanged lines hidden (view full) ---

727 default:
728 return 0;
729 }
730
731 return 1;
732}
733
734int
745nfs3svc_decode_renameargs(struct svc_rqst *rqstp, __be32 *p)
735nfs3svc_decode_renameargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
746{
736{
747 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
748 struct nfsd3_renameargs *args = rqstp->rq_argp;
749
750 return svcxdr_decode_diropargs3(xdr, &args->ffh,
751 &args->fname, &args->flen) &&
752 svcxdr_decode_diropargs3(xdr, &args->tfh,
753 &args->tname, &args->tlen);
754}
755
756int
737 struct nfsd3_renameargs *args = rqstp->rq_argp;
738
739 return svcxdr_decode_diropargs3(xdr, &args->ffh,
740 &args->fname, &args->flen) &&
741 svcxdr_decode_diropargs3(xdr, &args->tfh,
742 &args->tname, &args->tlen);
743}
744
745int
757nfs3svc_decode_linkargs(struct svc_rqst *rqstp, __be32 *p)
746nfs3svc_decode_linkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
758{
747{
759 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
760 struct nfsd3_linkargs *args = rqstp->rq_argp;
761
762 return svcxdr_decode_nfs_fh3(xdr, &args->ffh) &&
763 svcxdr_decode_diropargs3(xdr, &args->tfh,
764 &args->tname, &args->tlen);
765}
766
767int
748 struct nfsd3_linkargs *args = rqstp->rq_argp;
749
750 return svcxdr_decode_nfs_fh3(xdr, &args->ffh) &&
751 svcxdr_decode_diropargs3(xdr, &args->tfh,
752 &args->tname, &args->tlen);
753}
754
755int
768nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
756nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
769{
757{
770 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
771 struct nfsd3_readdirargs *args = rqstp->rq_argp;
772
773 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
774 return 0;
775 if (xdr_stream_decode_u64(xdr, &args->cookie) < 0)
776 return 0;
777 args->verf = xdr_inline_decode(xdr, NFS3_COOKIEVERFSIZE);
778 if (!args->verf)
779 return 0;
780 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
781 return 0;
782
783 return 1;
784}
785
786int
758 struct nfsd3_readdirargs *args = rqstp->rq_argp;
759
760 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
761 return 0;
762 if (xdr_stream_decode_u64(xdr, &args->cookie) < 0)
763 return 0;
764 args->verf = xdr_inline_decode(xdr, NFS3_COOKIEVERFSIZE);
765 if (!args->verf)
766 return 0;
767 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
768 return 0;
769
770 return 1;
771}
772
773int
787nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p)
774nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
788{
775{
789 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
790 struct nfsd3_readdirargs *args = rqstp->rq_argp;
791 u32 dircount;
792
793 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
794 return 0;
795 if (xdr_stream_decode_u64(xdr, &args->cookie) < 0)
796 return 0;
797 args->verf = xdr_inline_decode(xdr, NFS3_COOKIEVERFSIZE);

--- 4 unchanged lines hidden (view full) ---

802 return 0;
803 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
804 return 0;
805
806 return 1;
807}
808
809int
776 struct nfsd3_readdirargs *args = rqstp->rq_argp;
777 u32 dircount;
778
779 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
780 return 0;
781 if (xdr_stream_decode_u64(xdr, &args->cookie) < 0)
782 return 0;
783 args->verf = xdr_inline_decode(xdr, NFS3_COOKIEVERFSIZE);

--- 4 unchanged lines hidden (view full) ---

788 return 0;
789 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
790 return 0;
791
792 return 1;
793}
794
795int
810nfs3svc_decode_commitargs(struct svc_rqst *rqstp, __be32 *p)
796nfs3svc_decode_commitargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
811{
797{
812 struct xdr_stream *xdr = &rqstp->rq_arg_stream;
813 struct nfsd3_commitargs *args = rqstp->rq_argp;
814
815 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
816 return 0;
817 if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
818 return 0;
819 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
820 return 0;

--- 638 unchanged lines hidden ---
798 struct nfsd3_commitargs *args = rqstp->rq_argp;
799
800 if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
801 return 0;
802 if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
803 return 0;
804 if (xdr_stream_decode_u32(xdr, &args->count) < 0)
805 return 0;

--- 638 unchanged lines hidden ---