diff options
author | Kinglong Mee <kinglongmee@gmail.com> | 2013-12-31 00:17:20 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2014-01-03 18:18:49 -0500 |
commit | 7e55b59b2f32afc83452ae250dfd6173c9a7b515 (patch) | |
tree | f8bbb3a9c80f4e29520f077b6962a287a1a46824 /net/sunrpc/svc.c | |
parent | 8a891633b832874e2a1545abbddfd33ba22eb016 (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.c | 25 |
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 | ||