| Ignore RPC register failures if NFSv4 is enabled. |
| Add option '-p' to skip RPC registering in nfsd(8). |
| |
| diff -ru --exclude-from freebsd-src-diff-exclude-names /var/archive3/public/freebsd-releng-10.4-src/usr.sbin/nfsd/nfsd.c freebsd-10.4/usr.sbin/nfsd/nfsd.c |
| --- /var/archive3/public/freebsd-releng-10.4-src/usr.sbin/nfsd/nfsd.c 2017-09-29 08:20:24.000000000 +0800 |
| +++ freebsd-10.4/usr.sbin/nfsd/nfsd.c 2019-08-18 09:57:34.595101984 +0800 |
| @@ -157,7 +157,7 @@ |
| int on = 1, unregister, reregister, sock; |
| int tcp6sock, ip6flag, tcpflag, tcpsock; |
| int udpflag, ecode, error, s, srvcnt; |
| - int bindhostc, bindanyflag, rpcbreg, rpcbregcnt; |
| + int bindhostc, bindanyflag, rpcbreg, rpcbregcnt, no_rpc_reg = 0; |
| int nfssvc_addsock; |
| int longindex = 0; |
| const char *lopt; |
| @@ -170,7 +170,7 @@ |
| getopt_shortopts = "ah:n:rdtueo"; |
| getopt_usage = |
| "usage:\n" |
| - " nfsd [-ardtueo] [-h bindip]\n" |
| + " nfsd [-ardtueop] [-h bindip]\n" |
| " [-n numservers] [--minthreads #] [--maxthreads #]\n"; |
| while ((ch = getopt_long(argc, argv, getopt_shortopts, longopts, |
| &longindex)) != -1) |
| @@ -192,6 +192,7 @@ |
| break; |
| case 'r': |
| reregister = 1; |
| + no_rpc_reg = 0; |
| break; |
| case 'd': |
| unregister = 1; |
| @@ -208,6 +209,10 @@ |
| case 'o': |
| run_v4server = 0; |
| break; |
| + case 'p': |
| + no_rpc_reg = 1; |
| + reregister = 0; |
| + break; |
| case 0: |
| lopt = longopts[longindex].name; |
| if (!strcmp(lopt, "minthreads")) { |
| @@ -503,7 +508,7 @@ |
| (void)close(sock); |
| } |
| } |
| - if (rpcbreg == 1) { |
| + if (!no_rpc_reg && rpcbreg == 1) { |
| memset(&hints, 0, sizeof hints); |
| hints.ai_flags = AI_PASSIVE; |
| hints.ai_family = AF_INET; |
| @@ -572,7 +577,7 @@ |
| (void)close(sock); |
| } |
| } |
| - if (rpcbreg == 1) { |
| + if (!no_rpc_reg && rpcbreg == 1) { |
| memset(&hints, 0, sizeof hints); |
| hints.ai_flags = AI_PASSIVE; |
| hints.ai_family = AF_INET6; |
| @@ -637,7 +642,7 @@ |
| connect_type_cnt++; |
| } |
| } |
| - if (rpcbreg == 1) { |
| + if (!no_rpc_reg && rpcbreg == 1) { |
| memset(&hints, 0, sizeof hints); |
| hints.ai_flags = AI_PASSIVE; |
| hints.ai_family = AF_INET; |
| @@ -657,8 +662,11 @@ |
| nb_tcp.len = nb_tcp.maxlen = ai_tcp->ai_addrlen; |
| if ((!rpcb_set(NFS_PROGRAM, 2, nconf_tcp, |
| &nb_tcp)) || (!rpcb_set(NFS_PROGRAM, 3, |
| - nconf_tcp, &nb_tcp))) |
| - err(1, "rpcb_set tcp failed"); |
| + nconf_tcp, &nb_tcp))) { |
| + run_v4server ? |
| + warn("rpcb_set tcp failed") : |
| + err(1, "rpcb_set tcp failed"); |
| + } |
| freeaddrinfo(ai_tcp); |
| } |
| } |
| @@ -713,7 +721,7 @@ |
| connect_type_cnt++; |
| } |
| } |
| - if (rpcbreg == 1) { |
| + if (!no_rpc_reg && rpcbreg == 1) { |
| memset(&hints, 0, sizeof hints); |
| hints.ai_flags = AI_PASSIVE; |
| hints.ai_family = AF_INET6; |
| @@ -731,17 +739,15 @@ |
| nb_tcp6.buf = ai_tcp6->ai_addr; |
| nb_tcp6.len = nb_tcp6.maxlen = ai_tcp6->ai_addrlen; |
| if ((!rpcb_set(NFS_PROGRAM, 2, nconf_tcp6, &nb_tcp6)) || |
| - (!rpcb_set(NFS_PROGRAM, 3, nconf_tcp6, &nb_tcp6))) |
| - err(1, "rpcb_set tcp6 failed"); |
| + (!rpcb_set(NFS_PROGRAM, 3, nconf_tcp6, &nb_tcp6))) { |
| + run_v4server ? |
| + warn("rpcb_set tcp failed") : |
| + err(1, "rpcb_set tcp failed"); |
| + } |
| freeaddrinfo(ai_tcp6); |
| } |
| } |
| |
| - if (rpcbregcnt == 0) { |
| - syslog(LOG_ERR, "rpcb_set() failed, nothing to do: %m"); |
| - nfsd_exit(1); |
| - } |
| - |
| if (tcpflag && connect_type_cnt == 0) { |
| syslog(LOG_ERR, "tcp connects == 0, nothing to do: %m"); |
| nfsd_exit(1); |