Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Aug 2008 17:39:02 GMT
From:      Ed Schouten <ed@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 147317 for review
Message-ID:  <200808131739.m7DHd2Wu079963@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=147317

Change 147317 by ed@ed_dull on 2008/08/13 17:38:39

	IFC.

Affected files ...

.. //depot/projects/mpsafetty/lib/libpcap/config.h#2 integrate
.. //depot/projects/mpsafetty/sys/dev/cpufreq/ichss.c#2 integrate
.. //depot/projects/mpsafetty/sys/dev/usb/umass.c#2 integrate
.. //depot/projects/mpsafetty/sys/i386/cpufreq/est.c#2 integrate
.. //depot/projects/mpsafetty/sys/i386/cpufreq/p4tcc.c#2 integrate
.. //depot/projects/mpsafetty/sys/i386/cpufreq/powernow.c#2 integrate
.. //depot/projects/mpsafetty/sys/i386/cpufreq/smist.c#2 integrate
.. //depot/projects/mpsafetty/sys/net/bpf.c#4 integrate
.. //depot/projects/mpsafetty/sys/nlm/nlm_prot_impl.c#2 integrate
.. //depot/projects/mpsafetty/sys/rpc/clnt_rc.c#2 integrate

Differences ...

==== //depot/projects/mpsafetty/lib/libpcap/config.h#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/lib/libpcap/config.h,v 1.6 2007/10/16 02:10:44 mlaier Exp $ */
+/* $FreeBSD: src/lib/libpcap/config.h,v 1.7 2008/08/13 15:41:21 ed Exp $ */
 /* This is an edited copy of the config.h generated by configure. */
 
 /* config.h.  Generated by configure.  */
@@ -15,7 +15,7 @@
 /* #undef BDEBUG */
 
 /* define if you have a cloning BPF device */
-/* #undef HAVE_CLONING_BPF */
+#define HAVE_CLONING_BPF 1
 
 /* define if you have the DAG API */
 /* #undef HAVE_DAG_API */

==== //depot/projects/mpsafetty/sys/dev/cpufreq/ichss.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cpufreq/ichss.c,v 1.11 2008/03/10 22:18:07 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cpufreq/ichss.c,v 1.12 2008/08/13 16:09:40 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -181,7 +181,7 @@
 	}
 	DPRINT("ichss: PMBASE is %#x\n", pmbase);
 
-	child = BUS_ADD_CHILD(parent, 0, "ichss", 0);
+	child = BUS_ADD_CHILD(parent, 20, "ichss", 0);
 	if (child == NULL) {
 		device_printf(parent, "add SpeedStep child failed\n");
 		return;

==== //depot/projects/mpsafetty/sys/dev/usb/umass.c#2 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/usb/umass.c,v 1.163 2008/05/16 19:47:15 remko Exp $
+ *	$FreeBSD: src/sys/dev/usb/umass.c,v 1.164 2008/08/13 12:40:20 maxim Exp $
  *	$NetBSD: umass.c,v 1.28 2000/04/02 23:46:53 augustss Exp $
  */
 
@@ -758,6 +758,10 @@
 	  UMASS_PROTO_RBC | UMASS_PROTO_CBI,
 	  NO_QUIRKS
 	},
+	{ USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, 0x0500,
+	  UMASS_PROTO_RBC | UMASS_PROTO_CBI,
+	  RBC_PAD_TO_12
+	},
 	{ USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, RID_WILDCARD,
 	  UMASS_PROTO_RBC | UMASS_PROTO_CBI,
 	  NO_QUIRKS

==== //depot/projects/mpsafetty/sys/i386/cpufreq/est.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/cpufreq/est.c,v 1.17 2008/05/30 22:01:09 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/cpufreq/est.c,v 1.18 2008/08/13 16:09:40 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -967,7 +967,7 @@
 	 * We add a child for each CPU since settings must be performed
 	 * on each CPU in the SMP case.
 	 */
-	child = BUS_ADD_CHILD(parent, 0, "est", -1);
+	child = BUS_ADD_CHILD(parent, 10, "est", -1);
 	if (child == NULL)
 		device_printf(parent, "add est child failed\n");
 }

==== //depot/projects/mpsafetty/sys/i386/cpufreq/p4tcc.c#2 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/cpufreq/p4tcc.c,v 1.16 2008/03/17 09:05:15 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/cpufreq/p4tcc.c,v 1.17 2008/08/13 16:09:40 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,7 +131,7 @@
 	 * of the IA32 Intel Architecture Software Developer's Manual,
 	 * Volume 3, for more info.
 	 */
-	if (BUS_ADD_CHILD(parent, 0, "p4tcc", -1) == NULL)
+	if (BUS_ADD_CHILD(parent, 10, "p4tcc", -1) == NULL)
 		device_printf(parent, "add p4tcc child failed\n");
 }
 

==== //depot/projects/mpsafetty/sys/i386/cpufreq/powernow.c#2 (text+ko) ====

@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/cpufreq/powernow.c,v 1.4 2007/01/23 19:20:30 bruno Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/cpufreq/powernow.c,v 1.5 2008/08/13 16:09:40 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -894,7 +894,7 @@
 	}
 	if (device_find_child(parent, "powernow", -1) != NULL)
 		return;
-	if ((child = BUS_ADD_CHILD(parent, 0, "powernow", -1)) == NULL)
+	if ((child = BUS_ADD_CHILD(parent, 10, "powernow", -1)) == NULL)
 		device_printf(parent, "powernow: add child failed\n");
 }
 

==== //depot/projects/mpsafetty/sys/i386/cpufreq/smist.c#2 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/cpufreq/smist.c,v 1.2 2007/06/17 07:18:23 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/cpufreq/smist.c,v 1.3 2008/08/13 16:09:40 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -308,7 +308,7 @@
 
 	if (device_find_child(parent, "smist", -1) != NULL)
 		return;
-	if (BUS_ADD_CHILD(parent, 0, "smist", -1) == NULL)
+	if (BUS_ADD_CHILD(parent, 30, "smist", -1) == NULL)
 		device_printf(parent, "smist: add child failed\n");
 }
 

==== //depot/projects/mpsafetty/sys/net/bpf.c#4 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net/bpf.c,v 1.199 2008/08/01 21:38:46 csjp Exp $");
+__FBSDID("$FreeBSD: src/sys/net/bpf.c,v 1.200 2008/08/13 15:41:21 ed Exp $");
 
 #include "opt_bpf.h"
 #include "opt_mac.h"
@@ -117,7 +117,6 @@
 static void	filt_bpfdetach(struct knote *);
 static int	filt_bpfread(struct knote *, long);
 static void	bpf_drvinit(void *);
-static void	bpf_clone(void *, struct ucred *, char *, int, struct cdev **);
 static int	bpf_stats_sysctl(SYSCTL_HANDLER_ARGS);
 
 SYSCTL_NODE(_net, OID_AUTO, bpf, CTLFLAG_RW, 0, "bpf sysctl");
@@ -131,7 +130,6 @@
     bpf_stats_sysctl, "bpf statistics portal");
 
 static	d_open_t	bpfopen;
-static	d_close_t	bpfclose;
 static	d_read_t	bpfread;
 static	d_write_t	bpfwrite;
 static	d_ioctl_t	bpfioctl;
@@ -140,9 +138,7 @@
 
 static struct cdevsw bpf_cdevsw = {
 	.d_version =	D_VERSION,
-	.d_flags =	D_TRACKCLOSE,
 	.d_open =	bpfopen,
-	.d_close =	bpfclose,
 	.d_read =	bpfread,
 	.d_write =	bpfwrite,
 	.d_ioctl =	bpfioctl,
@@ -585,6 +581,34 @@
 }
 
 /*
+ * Close the descriptor by detaching it from its interface,
+ * deallocating its buffers, and marking it free.
+ */
+static void
+bpf_dtor(void *data)
+{
+	struct bpf_d *d = data;
+
+	BPFD_LOCK(d);
+	if (d->bd_state == BPF_WAITING)
+		callout_stop(&d->bd_callout);
+	d->bd_state = BPF_IDLE;
+	BPFD_UNLOCK(d);
+	funsetown(&d->bd_sigio);
+	mtx_lock(&bpf_mtx);
+	if (d->bd_bif)
+		bpf_detachd(d);
+	mtx_unlock(&bpf_mtx);
+	selwakeuppri(&d->bd_sel, PRINET);
+#ifdef MAC
+	mac_bpfdesc_destroy(d);
+#endif /* MAC */
+	knlist_destroy(&d->bd_sel.si_note);
+	bpf_freed(d);
+	free(d, M_BPF);
+}
+
+/*
  * Open ethernet device.  Returns ENXIO for illegal minor device number,
  * EBUSY if file is open by another process.
  */
@@ -593,25 +617,14 @@
 bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td)
 {
 	struct bpf_d *d;
+	int error;
 
-	mtx_lock(&bpf_mtx);
-	d = dev->si_drv1;
-	/*
-	 * Each minor can be opened by only one process.  If the requested
-	 * minor is in use, return EBUSY.
-	 */
-	if (d != NULL) {
-		mtx_unlock(&bpf_mtx);
-		return (EBUSY);
+	MALLOC(d, struct bpf_d *, sizeof(*d), M_BPF, M_WAITOK | M_ZERO);
+	error = devfs_set_cdevpriv(d, bpf_dtor);
+	if (error != 0) {
+		free(d, M_BPF);
+		return (error);
 	}
-	dev->si_drv1 = (struct bpf_d *)~0;	/* mark device in use */
-	mtx_unlock(&bpf_mtx);
-
-	if ((dev->si_flags & SI_NAMED) == 0)
-		make_dev(&bpf_cdevsw, minor(dev), UID_ROOT, GID_WHEEL, 0600,
-		    "bpf%d", dev2unit(dev));
-	MALLOC(d, struct bpf_d *, sizeof(*d), M_BPF, M_WAITOK | M_ZERO);
-	dev->si_drv1 = d;
 
 	/*
 	 * For historical reasons, perform a one-time initialization call to
@@ -635,47 +648,19 @@
 }
 
 /*
- * Close the descriptor by detaching it from its interface,
- * deallocating its buffers, and marking it free.
- */
-/* ARGSUSED */
-static	int
-bpfclose(struct cdev *dev, int flags, int fmt, struct thread *td)
-{
-	struct bpf_d *d = dev->si_drv1;
-
-	BPFD_LOCK(d);
-	if (d->bd_state == BPF_WAITING)
-		callout_stop(&d->bd_callout);
-	d->bd_state = BPF_IDLE;
-	BPFD_UNLOCK(d);
-	funsetown(&d->bd_sigio);
-	mtx_lock(&bpf_mtx);
-	if (d->bd_bif)
-		bpf_detachd(d);
-	mtx_unlock(&bpf_mtx);
-	selwakeuppri(&d->bd_sel, PRINET);
-#ifdef MAC
-	mac_bpfdesc_destroy(d);
-#endif /* MAC */
-	knlist_destroy(&d->bd_sel.si_note);
-	bpf_freed(d);
-	dev->si_drv1 = NULL;
-	free(d, M_BPF);
-
-	return (0);
-}
-
-/*
  *  bpfread - read next chunk of packets from buffers
  */
 static	int
 bpfread(struct cdev *dev, struct uio *uio, int ioflag)
 {
-	struct bpf_d *d = dev->si_drv1;
+	struct bpf_d *d;
 	int timed_out;
 	int error;
 
+	error = devfs_get_cdevpriv((void **)&d);
+	if (error != 0)
+		return (error);
+
 	/*
 	 * Restrict application to use a buffer the same size as
 	 * as kernel buffers.
@@ -829,12 +814,16 @@
 static int
 bpfwrite(struct cdev *dev, struct uio *uio, int ioflag)
 {
-	struct bpf_d *d = dev->si_drv1;
+	struct bpf_d *d;
 	struct ifnet *ifp;
 	struct mbuf *m, *mc;
 	struct sockaddr dst;
 	int error, hlen;
 
+	error = devfs_get_cdevpriv((void **)&d);
+	if (error != 0)
+		return (error);
+
 	d->bd_pid = curthread->td_proc->p_pid;
 	d->bd_wcount++;
 	if (d->bd_bif == NULL) {
@@ -963,8 +952,12 @@
 bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
     struct thread *td)
 {
-	struct bpf_d *d = dev->si_drv1;
-	int error = 0;
+	struct bpf_d *d;
+	int error;
+
+	error = devfs_get_cdevpriv((void **)&d);
+	if (error != 0)
+		return (error);
 
 	/*
 	 * Refresh PID associated with this descriptor.
@@ -1482,9 +1475,9 @@
 	struct bpf_d *d;
 	int revents;
 
-	d = dev->si_drv1;
-	if (d->bd_bif == NULL)
-		return (ENXIO);
+	if (devfs_get_cdevpriv((void **)&d) != 0 || d->bd_bif == NULL)
+		return (events &
+		    (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM));
 
 	/*
 	 * Refresh PID associated with this descriptor.
@@ -1516,9 +1509,10 @@
 int
 bpfkqfilter(struct cdev *dev, struct knote *kn)
 {
-	struct bpf_d *d = (struct bpf_d *)dev->si_drv1;
+	struct bpf_d *d;
 
-	if (kn->kn_filter != EVFILT_READ)
+	if (devfs_get_cdevpriv((void **)&d) != 0 ||
+	    kn->kn_filter != EVFILT_READ)
 		return (1);
 
 	/*
@@ -2008,29 +2002,17 @@
 }
 
 static void
-bpf_clone(void *arg, struct ucred *cred, char *name, int namelen,
-    struct cdev **dev)
-{
-	int u;
-
-	if (*dev != NULL)
-		return;
-	if (dev_stdclone(name, NULL, "bpf", &u) != 1)
-		return;
-	*dev = make_dev(&bpf_cdevsw, unit2minor(u), UID_ROOT, GID_WHEEL, 0600,
-	    "bpf%d", u);
-	dev_ref(*dev);
-	(*dev)->si_flags |= SI_CHEAPCLONE;
-	return;
-}
-
-static void
 bpf_drvinit(void *unused)
 {
+	struct cdev *dev;
 
 	mtx_init(&bpf_mtx, "bpf global lock", NULL, MTX_DEF);
 	LIST_INIT(&bpf_iflist);
-	EVENTHANDLER_REGISTER(dev_clone, bpf_clone, 0, 1000);
+
+	dev = make_dev(&bpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "bpf");
+	/* For compatibility */
+	make_dev_alias(dev, "bpf0");
+
 }
 
 static void

==== //depot/projects/mpsafetty/sys/nlm/nlm_prot_impl.c#2 (text+ko) ====

@@ -28,7 +28,7 @@
 #include "opt_inet6.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nlm/nlm_prot_impl.c,v 1.12 2008/07/03 14:09:00 dfr Exp $");
+__FBSDID("$FreeBSD: src/sys/nlm/nlm_prot_impl.c,v 1.13 2008/08/13 12:03:31 dfr Exp $");
 
 #include <sys/param.h>
 #include <sys/fcntl.h>
@@ -291,8 +291,11 @@
 	struct timeval timo;
 	RPCB parms;
 	char *uaddr;
-	enum clnt_stat stat;
-	int rpcvers;
+	enum clnt_stat stat = RPC_SUCCESS;
+	int rpcvers = RPCBVERS4;
+	bool_t do_tcp = FALSE;
+	struct pmap mapping;
+	u_short port = 0;
 
 	/*
 	 * First we need to contact the remote RPCBIND service to find
@@ -322,13 +325,17 @@
 	}
 
 	rpcb = clnt_dg_create(so, (struct sockaddr *)&ss,
-	    RPCBPROG, RPCBVERS4, 0, 0);
+	    RPCBPROG, rpcvers, 0, 0);
 	if (!rpcb)
 		return (NULL);
 
+try_tcp:
 	parms.r_prog = prog;
 	parms.r_vers = vers;
-	parms.r_netid = "udp";
+	if (do_tcp)
+		parms.r_netid = "tcp";
+	else
+		parms.r_netid = "udp";
 	parms.r_addr = "";
 	parms.r_owner = "";
 
@@ -338,55 +345,50 @@
 	timo.tv_sec = 25;
 	timo.tv_usec = 0;
 again:
-	uaddr = NULL;
-	stat = CLNT_CALL(rpcb, (rpcprog_t) RPCBPROC_GETADDR,
-	    (xdrproc_t) xdr_rpcb, &parms,
-	    (xdrproc_t) xdr_wrapstring, &uaddr, timo);
-	if (stat == RPC_PROGVERSMISMATCH) {
+	switch (rpcvers) {
+	case RPCBVERS4:
+	case RPCBVERS:
 		/*
-		 * Try RPCBIND version 3 if we haven't already.
-		 *
-		 * XXX fall back to portmap?
+		 * Try RPCBIND 4 then 3.
 		 */
-		CLNT_CONTROL(rpcb, CLGET_VERS, &rpcvers);
-		if (rpcvers == RPCBVERS4) {
-			rpcvers = RPCBVERS;
+		uaddr = NULL;
+		stat = CLNT_CALL(rpcb, (rpcprog_t) RPCBPROC_GETADDR,
+		    (xdrproc_t) xdr_rpcb, &parms,
+		    (xdrproc_t) xdr_wrapstring, &uaddr, timo);
+		if (stat == RPC_PROGVERSMISMATCH) {
+			if (rpcvers == RPCBVERS4)
+				rpcvers = RPCBVERS;
+			else if (rpcvers == RPCBVERS)
+				rpcvers = PMAPVERS;
 			CLNT_CONTROL(rpcb, CLSET_VERS, &rpcvers);
 			goto again;
+		} else if (stat == RPC_SUCCESS) {
+			/*
+			 * We have a reply from the remote RPCBIND - turn it
+			 * into an appropriate address and make a new client
+			 * that can talk to the remote NLM.
+			 *
+			 * XXX fixup IPv6 scope ID.
+			 */
+			struct netbuf *a;
+			a = __rpc_uaddr2taddr_af(ss.ss_family, uaddr);
+			if (!a) {
+				CLNT_DESTROY(rpcb);
+				return (NULL);
+			}
+			memcpy(&ss, a->buf, a->len);
+			free(a->buf, M_RPC);
+			free(a, M_RPC);
+			xdr_free((xdrproc_t) xdr_wrapstring, &uaddr);
 		}
-	}
-
-	if (stat == RPC_SUCCESS) {
+		break;
+	case PMAPVERS:
 		/*
-		 * We have a reply from the remote RPCBIND - turn it into an
-		 * appropriate address and make a new client that can talk to
-		 * the remote NLM.
-		 *
-		 * XXX fixup IPv6 scope ID.
-		 */
-		struct netbuf *a;
-		a = __rpc_uaddr2taddr_af(ss.ss_family, uaddr);
-		if (!a) {
-			CLNT_DESTROY(rpcb);
-			return (NULL);
-		}
-		memcpy(&ss, a->buf, a->len);
-		free(a->buf, M_RPC);
-		free(a, M_RPC);
-		xdr_free((xdrproc_t) xdr_wrapstring, &uaddr);
-	} else if (stat == RPC_PROGVERSMISMATCH) {
-		/*
 		 * Try portmap.
 		 */
-		struct pmap mapping;
-		u_short port;
-
-		rpcvers = PMAPVERS;
-		CLNT_CONTROL(rpcb, CLSET_VERS, &rpcvers);
-
 		mapping.pm_prog = parms.r_prog;
 		mapping.pm_vers = parms.r_vers;
-		mapping.pm_prot = IPPROTO_UDP;
+		mapping.pm_prot = do_tcp ? IPPROTO_TCP : IPPROTO_UDP;
 		mapping.pm_port = 0;
 
 		stat = CLNT_CALL(rpcb, (rpcprog_t) PMAPPROC_GETPORT,
@@ -408,22 +410,81 @@
 #endif
 			}
 		}
+		break;
+	default:
+		panic("invalid rpcvers %d", rpcvers);
+	}
+	/*
+	 * We may have a positive response from the portmapper, but the NLM
+	 * service was not found. Make sure we received a valid port.
+	 */
+	switch (ss.ss_family) {
+	case AF_INET:
+		port = ((struct sockaddr_in *)&ss)->sin_port;
+		break;
+#ifdef INET6
+	case AF_INET6:
+		port = ((struct sockaddr_in6 *)&ss)->sin6_port;
+		break;
+#endif
 	}
-	if (stat != RPC_SUCCESS) {
-		printf("NLM: failed to contact remote rpcbind, stat = %d\n",
-		    (int) stat);
+	if (stat != RPC_SUCCESS || !port) {
+		/*
+		 * If we were able to talk to rpcbind or portmap, but the udp
+		 * variant wasn't available, ask about tcp.
+		 *
+		 * XXX - We could also check for a TCP portmapper, but
+		 * if the host is running a portmapper at all, we should be able
+		 * to hail it over UDP.
+		 */
+		if (stat == RPC_SUCCESS && !do_tcp) {
+			do_tcp = TRUE;
+			goto try_tcp;
+		}
+
+		/* Otherwise, bad news. */
+		printf("NLM: failed to contact remote rpcbind, "
+		    "stat = %d, port = %d\n",
+		    (int) stat, port);
 		CLNT_DESTROY(rpcb);
 		return (NULL);
 	}
 
-	/*
-	 * Re-use the client we used to speak to rpcbind.
-	 */
-	CLNT_CONTROL(rpcb, CLSET_SVC_ADDR, &ss);
-	CLNT_CONTROL(rpcb, CLSET_PROG, &prog);
-	CLNT_CONTROL(rpcb, CLSET_VERS, &vers);
-	CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan);
-	rpcb->cl_auth = nlm_auth;
+	if (do_tcp) {
+		/*
+		 * Destroy the UDP client we used to speak to rpcbind and
+		 * recreate as a TCP client.
+		 */
+		struct netconfig *nconf = NULL;
+
+		CLNT_DESTROY(rpcb);
+
+		switch (ss.ss_family) {
+		case AF_INET:
+			nconf = getnetconfigent("tcp");
+			break;
+#ifdef INET6
+		case AF_INET6:
+			nconf = getnetconfigent("tcp6");
+			break;
+#endif
+		}
+
+		rpcb = clnt_reconnect_create(nconf, (struct sockaddr *)&ss,
+		    prog, vers, 0, 0);
+		CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan);
+		rpcb->cl_auth = nlm_auth;
+		
+	} else {
+		/*
+		 * Re-use the client we used to speak to rpcbind.
+		 */
+		CLNT_CONTROL(rpcb, CLSET_SVC_ADDR, &ss);
+		CLNT_CONTROL(rpcb, CLSET_PROG, &prog);
+		CLNT_CONTROL(rpcb, CLSET_VERS, &vers);
+		CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan);
+		rpcb->cl_auth = nlm_auth;
+	}
 
 	return (rpcb);
 }

==== //depot/projects/mpsafetty/sys/rpc/clnt_rc.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/rpc/clnt_rc.c,v 1.4 2008/06/26 10:21:54 dfr Exp $");
+__FBSDID("$FreeBSD: src/sys/rpc/clnt_rc.c,v 1.5 2008/08/13 12:04:54 dfr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -385,6 +385,7 @@
 
 	if (rc->rc_client)
 		CLNT_DESTROY(rc->rc_client);
+	mtx_destroy(&rc->rc_lock);
 	mem_free(rc, sizeof(*rc));
 	mem_free(cl, sizeof (CLIENT));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808131739.m7DHd2Wu079963>