diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/svc.c | 79 |
1 files changed, 34 insertions, 45 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index bd0ee312dac9..142f64745fba 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
@@ -718,8 +718,6 @@ svc_exit_thread(struct svc_rqst *rqstp) | |||
718 | } | 718 | } |
719 | EXPORT_SYMBOL_GPL(svc_exit_thread); | 719 | EXPORT_SYMBOL_GPL(svc_exit_thread); |
720 | 720 | ||
721 | #ifdef CONFIG_SUNRPC_REGISTER_V4 | ||
722 | |||
723 | /* | 721 | /* |
724 | * Register an "inet" protocol family netid with the local | 722 | * Register an "inet" protocol family netid with the local |
725 | * rpcbind daemon via an rpcbind v4 SET request. | 723 | * rpcbind daemon via an rpcbind v4 SET request. |
@@ -734,12 +732,13 @@ static int __svc_rpcb_register4(const u32 program, const u32 version, | |||
734 | const unsigned short protocol, | 732 | const unsigned short protocol, |
735 | const unsigned short port) | 733 | const unsigned short port) |
736 | { | 734 | { |
737 | struct sockaddr_in sin = { | 735 | const struct sockaddr_in sin = { |
738 | .sin_family = AF_INET, | 736 | .sin_family = AF_INET, |
739 | .sin_addr.s_addr = htonl(INADDR_ANY), | 737 | .sin_addr.s_addr = htonl(INADDR_ANY), |
740 | .sin_port = htons(port), | 738 | .sin_port = htons(port), |
741 | }; | 739 | }; |
742 | char *netid; | 740 | const char *netid; |
741 | int error; | ||
743 | 742 | ||
744 | switch (protocol) { | 743 | switch (protocol) { |
745 | case IPPROTO_UDP: | 744 | case IPPROTO_UDP: |
@@ -752,10 +751,20 @@ static int __svc_rpcb_register4(const u32 program, const u32 version, | |||
752 | return -ENOPROTOOPT; | 751 | return -ENOPROTOOPT; |
753 | } | 752 | } |
754 | 753 | ||
755 | return rpcb_v4_register(program, version, | 754 | error = rpcb_v4_register(program, version, |
756 | (struct sockaddr *)&sin, netid); | 755 | (const struct sockaddr *)&sin, netid); |
756 | |||
757 | /* | ||
758 | * User space didn't support rpcbind v4, so retry this | ||
759 | * registration request with the legacy rpcbind v2 protocol. | ||
760 | */ | ||
761 | if (error == -EPROTONOSUPPORT) | ||
762 | error = rpcb_register(program, version, protocol, port); | ||
763 | |||
764 | return error; | ||
757 | } | 765 | } |
758 | 766 | ||
767 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
759 | /* | 768 | /* |
760 | * Register an "inet6" protocol family netid with the local | 769 | * Register an "inet6" protocol family netid with the local |
761 | * rpcbind daemon via an rpcbind v4 SET request. | 770 | * rpcbind daemon via an rpcbind v4 SET request. |
@@ -770,12 +779,13 @@ static int __svc_rpcb_register6(const u32 program, const u32 version, | |||
770 | const unsigned short protocol, | 779 | const unsigned short protocol, |
771 | const unsigned short port) | 780 | const unsigned short port) |
772 | { | 781 | { |
773 | struct sockaddr_in6 sin6 = { | 782 | const struct sockaddr_in6 sin6 = { |
774 | .sin6_family = AF_INET6, | 783 | .sin6_family = AF_INET6, |
775 | .sin6_addr = IN6ADDR_ANY_INIT, | 784 | .sin6_addr = IN6ADDR_ANY_INIT, |
776 | .sin6_port = htons(port), | 785 | .sin6_port = htons(port), |
777 | }; | 786 | }; |
778 | char *netid; | 787 | const char *netid; |
788 | int error; | ||
779 | 789 | ||
780 | switch (protocol) { | 790 | switch (protocol) { |
781 | case IPPROTO_UDP: | 791 | case IPPROTO_UDP: |
@@ -788,9 +798,19 @@ static int __svc_rpcb_register6(const u32 program, const u32 version, | |||
788 | return -ENOPROTOOPT; | 798 | return -ENOPROTOOPT; |
789 | } | 799 | } |
790 | 800 | ||
791 | return rpcb_v4_register(program, version, | 801 | error = rpcb_v4_register(program, version, |
792 | (struct sockaddr *)&sin6, netid); | 802 | (const struct sockaddr *)&sin6, netid); |
803 | |||
804 | /* | ||
805 | * User space didn't support rpcbind version 4, so we won't | ||
806 | * use a PF_INET6 listener. | ||
807 | */ | ||
808 | if (error == -EPROTONOSUPPORT) | ||
809 | error = -EAFNOSUPPORT; | ||
810 | |||
811 | return error; | ||
793 | } | 812 | } |
813 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | ||
794 | 814 | ||
795 | /* | 815 | /* |
796 | * Register a kernel RPC service via rpcbind version 4. | 816 | * Register a kernel RPC service via rpcbind version 4. |
@@ -809,48 +829,17 @@ static int __svc_register(const u32 program, const u32 version, | |||
809 | case PF_INET: | 829 | case PF_INET: |
810 | return __svc_rpcb_register4(program, version, | 830 | return __svc_rpcb_register4(program, version, |
811 | protocol, port); | 831 | protocol, port); |
832 | break; | ||
833 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
812 | case PF_INET6: | 834 | case PF_INET6: |
813 | error = __svc_rpcb_register6(program, version, | 835 | return__svc_rpcb_register6(program, version, |
814 | protocol, port); | 836 | protocol, port); |
815 | if (error < 0) | 837 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ |
816 | return error; | ||
817 | |||
818 | /* | ||
819 | * Work around bug in some versions of Linux rpcbind | ||
820 | * which don't allow registration of both inet and | ||
821 | * inet6 netids. | ||
822 | * | ||
823 | * Error return ignored for now. | ||
824 | */ | ||
825 | __svc_rpcb_register4(program, version, | ||
826 | protocol, port); | ||
827 | return 0; | ||
828 | } | 838 | } |
829 | 839 | ||
830 | return -EAFNOSUPPORT; | 840 | return -EAFNOSUPPORT; |
831 | } | 841 | } |
832 | 842 | ||
833 | #else /* CONFIG_SUNRPC_REGISTER_V4 */ | ||
834 | |||
835 | /* | ||
836 | * Register a kernel RPC service via rpcbind version 2. | ||
837 | * | ||
838 | * Returns zero on success; a negative errno value is returned | ||
839 | * if any error occurs. | ||
840 | */ | ||
841 | static int __svc_register(const u32 program, const u32 version, | ||
842 | const int family, | ||
843 | const unsigned short protocol, | ||
844 | const unsigned short port) | ||
845 | { | ||
846 | if (family != PF_INET) | ||
847 | return -EAFNOSUPPORT; | ||
848 | |||
849 | return rpcb_register(program, version, protocol, port); | ||
850 | } | ||
851 | |||
852 | #endif /* CONFIG_SUNRPC_REGISTER_V4 */ | ||
853 | |||
854 | /** | 843 | /** |
855 | * svc_register - register an RPC service with the local portmapper | 844 | * svc_register - register an RPC service with the local portmapper |
856 | * @serv: svc_serv struct for the service to register | 845 | * @serv: svc_serv struct for the service to register |