aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svc.c
diff options
context:
space:
mode:
authorKinglong Mee <kinglongmee@gmail.com>2013-12-31 00:17:20 -0500
committerJ. Bruce Fields <bfields@redhat.com>2014-01-03 18:18:49 -0500
commit7e55b59b2f32afc83452ae250dfd6173c9a7b515 (patch)
treef8bbb3a9c80f4e29520f077b6962a287a1a46824 /net/sunrpc/svc.c
parent8a891633b832874e2a1545abbddfd33ba22eb016 (diff)
SUNRPC/NFSD: Support a new option for ignoring the result of svc_register
NFSv4 clients can contact port 2049 directly instead of needing the portmapper. Therefore a failure to register to the portmapper when starting an NFSv4-only server isn't really a problem. But Gareth Williams reports that an attempt to start an NFSv4-only server without starting portmap fails: #rpc.nfsd -N 2 -N 3 rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused) rpc.nfsd: unable to set any sockets for nfsd Add a flag to svc_version to tell the rpc layer it can safely ignore an rpcbind failure in the NFSv4-only case. Reported-by: Gareth Williams <gareth@garethwilliams.me.uk> Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net/sunrpc/svc.c')
-rw-r--r--net/sunrpc/svc.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index e7fbe368b4a3..5de6801cd924 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -916,9 +916,6 @@ static int __svc_register(struct net *net, const char *progname,
916#endif 916#endif
917 } 917 }
918 918
919 if (error < 0)
920 printk(KERN_WARNING "svc: failed to register %sv%u RPC "
921 "service (errno %d).\n", progname, version, -error);
922 return error; 919 return error;
923} 920}
924 921
@@ -937,6 +934,7 @@ int svc_register(const struct svc_serv *serv, struct net *net,
937 const unsigned short port) 934 const unsigned short port)
938{ 935{
939 struct svc_program *progp; 936 struct svc_program *progp;
937 struct svc_version *vers;
940 unsigned int i; 938 unsigned int i;
941 int error = 0; 939 int error = 0;
942 940
@@ -946,7 +944,8 @@ int svc_register(const struct svc_serv *serv, struct net *net,
946 944
947 for (progp = serv->sv_program; progp; progp = progp->pg_next) { 945 for (progp = serv->sv_program; progp; progp = progp->pg_next) {
948 for (i = 0; i < progp->pg_nvers; i++) { 946 for (i = 0; i < progp->pg_nvers; i++) {
949 if (progp->pg_vers[i] == NULL) 947 vers = progp->pg_vers[i];
948 if (vers == NULL)
950 continue; 949 continue;
951 950
952 dprintk("svc: svc_register(%sv%d, %s, %u, %u)%s\n", 951 dprintk("svc: svc_register(%sv%d, %s, %u, %u)%s\n",
@@ -955,16 +954,26 @@ int svc_register(const struct svc_serv *serv, struct net *net,
955 proto == IPPROTO_UDP? "udp" : "tcp", 954 proto == IPPROTO_UDP? "udp" : "tcp",
956 port, 955 port,
957 family, 956 family,
958 progp->pg_vers[i]->vs_hidden? 957 vers->vs_hidden ?
959 " (but not telling portmap)" : ""); 958 " (but not telling portmap)" : "");
960 959
961 if (progp->pg_vers[i]->vs_hidden) 960 if (vers->vs_hidden)
962 continue; 961 continue;
963 962
964 error = __svc_register(net, progp->pg_name, progp->pg_prog, 963 error = __svc_register(net, progp->pg_name, progp->pg_prog,
965 i, family, proto, port); 964 i, family, proto, port);
966 if (error < 0) 965
966 if (vers->vs_rpcb_optnl) {
967 error = 0;
968 continue;
969 }
970
971 if (error < 0) {
972 printk(KERN_WARNING "svc: failed to register "
973 "%sv%u RPC service (errno %d).\n",
974 progp->pg_name, i, -error);
967 break; 975 break;
976 }
968 } 977 }
969 } 978 }
970 979