Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Dec 2003 16:40:12 -0800 (PST)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 44377 for review
Message-ID:  <200312270040.hBR0eCHg097221@repoman.freebsd.org>

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

Change 44377 by sam@sam_ebb on 2003/12/26 16:40:03

	IFC

Affected files ...

.. //depot/projects/netperf/sys/compat/ndis/kern_ndis.c#5 integrate
.. //depot/projects/netperf/sys/compat/ndis/ndis_var.h#5 integrate
.. //depot/projects/netperf/sys/compat/ndis/subr_ndis.c#6 integrate
.. //depot/projects/netperf/sys/compat/ndis/subr_pe.c#3 integrate
.. //depot/projects/netperf/sys/dev/acpica/acpi.c#17 integrate
.. //depot/projects/netperf/sys/dev/gem/if_gem_pci.c#4 integrate
.. //depot/projects/netperf/sys/dev/if_ndis/if_ndis.c#5 integrate
.. //depot/projects/netperf/sys/dev/sio/sio_puc.c#3 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/bootsect.h#2 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/bpb.h#2 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/denode.h#2 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/direntry.h#3 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/fat.h#2 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_conv.c#4 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_denode.c#3 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_fat.c#2 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_iconv.c#2 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_lookup.c#3 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_vfsops.c#9 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_vnops.c#5 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfsmount.h#4 integrate
.. //depot/projects/netperf/sys/kern/kern_event.c#6 integrate
.. //depot/projects/netperf/sys/kern/kern_subr.c#3 integrate
.. //depot/projects/netperf/sys/kern/sched_4bsd.c#10 integrate
.. //depot/projects/netperf/sys/kern/syscalls.master#12 integrate
.. //depot/projects/netperf/sys/kern/uipc_syscalls.c#10 integrate
.. //depot/projects/netperf/sys/net/if.c#12 integrate
.. //depot/projects/netperf/sys/netinet6/ip6_fw.c#7 integrate
.. //depot/projects/netperf/sys/pc98/pc98/sio.c#7 integrate
.. //depot/projects/netperf/sys/pci/if_sis.c#21 integrate
.. //depot/projects/netperf/sys/pci/if_sisreg.h#7 integrate
.. //depot/projects/netperf/sys/sparc64/pci/psycho.c#5 integrate
.. //depot/projects/netperf/sys/sparc64/sbus/sbus.c#4 integrate
.. //depot/projects/netperf/sys/sparc64/sparc64/bus_machdep.c#4 integrate
.. //depot/projects/netperf/sys/sparc64/sparc64/db_trace.c#3 integrate
.. //depot/projects/netperf/sys/sparc64/sparc64/dump_machdep.c#3 integrate
.. //depot/projects/netperf/sys/sparc64/sparc64/ofw_machdep.c#5 integrate
.. //depot/projects/netperf/sys/sys/_null.h#4 integrate
.. //depot/projects/netperf/sys/sys/sysproto.h#12 integrate
.. //depot/projects/netperf/sys/sys/systm.h#5 integrate
.. //depot/projects/netperf/sys/sys/uio.h#3 integrate
.. //depot/projects/netperf/sys/vm/vm_fault.c#9 integrate
.. //depot/projects/netperf/sys/vm/vm_map.c#16 integrate

Differences ...

==== //depot/projects/netperf/sys/compat/ndis/kern_ndis.c#5 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.11 2003/12/25 06:04:39 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.15 2003/12/26 07:01:05 wpaul Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -352,10 +352,9 @@
 	sc = p->np_softc;
 	returnfunc = sc->ndis_chars.nmc_return_packet_func;
 	adapter = sc->ndis_block.nmb_miniportadapterctx;
-	if (returnfunc == NULL)
-		ndis_free_packet(p);
-	else
+	if (returnfunc != NULL)
 		returnfunc(adapter, p);
+
 	return;
 }
 
@@ -654,12 +653,37 @@
 	struct ndis_softc	*sc;
 	ndis_handle		adapter;
 	__stdcall ndis_sendmulti_handler	sendfunc;
+	int			i, idx;
+	struct ifnet		*ifp;
+	struct mbuf		*m;
+	ndis_packet		*p;
 
 	sc = arg;
 	adapter = sc->ndis_block.nmb_miniportadapterctx;
 	sendfunc = sc->ndis_chars.nmc_sendmulti_func;
 	sendfunc(adapter, packets, cnt);
 
+	for (i = 0; i < cnt; i++) {
+		p = packets[i];
+		if (p->np_oob.npo_status == NDIS_STATUS_PENDING)
+			continue;
+		idx = p->np_txidx;
+		m = p->np_m0;
+		ifp = &sc->arpcom.ac_if;
+		if (sc->ndis_sc)
+			bus_dmamap_unload(sc->ndis_ttag, sc->ndis_tmaps[idx]);
+		sc->ndis_txarray[idx] = NULL;
+		sc->ndis_txpending++;
+		m_freem(m);
+		ndis_free_packet(p);
+		if (p->np_oob.npo_status == NDIS_STATUS_SUCCESS)
+			ifp->if_opackets++;
+		else
+			ifp->if_oerrors++;
+		ifp->if_timer = 0;
+		ifp->if_flags &= ~IFF_OACTIVE;
+	}
+
 	return(0);
 }
 
@@ -753,7 +777,6 @@
 	__stdcall ndis_halt_handler	haltfunc;
 	struct ifnet		*ifp;
 	struct ndis_timer_entry	*ne;
-	struct callout_handle	*ch;
 
 	sc = arg;
 	ifp = &sc->arpcom.ac_if;
@@ -781,9 +804,7 @@
 	while (!TAILQ_EMPTY(&sc->ndis_block.nmb_timerlist)) {
 		ne = TAILQ_FIRST(&sc->ndis_block.nmb_timerlist);
 		TAILQ_REMOVE(&sc->ndis_block.nmb_timerlist, ne, link);
-		ch = &ne->nte_ch;
-		if (ch->callout != NULL)
-			untimeout(ch->callout->c_func, ch->callout->c_arg, *ch);
+		callout_stop(&ne->nte_ch);
 		free(ne, M_DEVBUF);
 	}
 

==== //depot/projects/netperf/sys/compat/ndis/ndis_var.h#5 (text+ko) ====

@@ -29,7 +29,7 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.6 2003/12/25 06:04:39 wpaul Exp $
+ * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.9 2003/12/26 03:31:34 wpaul Exp $
  */
 
 #ifndef _NDIS_VAR_H_
@@ -1001,7 +1001,7 @@
 typedef struct ndis_reference ndis_reference;
 
 struct ndis_timer_entry {
-	struct callout_handle	nte_ch;
+	struct callout		nte_ch;
 	ndis_miniport_timer	*nte_timer;
 	TAILQ_ENTRY(ndis_timer_entry)	link;
 };

==== //depot/projects/netperf/sys/compat/ndis/subr_ndis.c#6 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.13 2003/12/25 00:40:02 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.16 2003/12/26 03:31:34 wpaul Exp $");
 
 /*
  * This file implements a translation layer between the BSD networking
@@ -62,6 +62,7 @@
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/timespec.h>
+#include <sys/smp.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -150,6 +151,7 @@
 	uint32_t, uint32_t, void *);
 __stdcall static void ndis_read_netaddr(ndis_status *, void **,
 	uint32_t *, ndis_handle);
+__stdcall static ndis_status ndis_mapreg_cnt(uint32_t, uint32_t *);
 __stdcall static ndis_status ndis_alloc_mapreg(ndis_handle,
 	uint32_t, uint8_t, uint32_t, uint32_t);
 __stdcall static void ndis_free_mapreg(ndis_handle);
@@ -242,6 +244,7 @@
 __stdcall static void ndis_map_file(ndis_status *, void **, ndis_handle);
 __stdcall static void ndis_unmap_file(ndis_handle);
 __stdcall static void ndis_close_file(ndis_handle);
+__stdcall static u_int8_t ndis_cpu_cnt(void);
 __stdcall static void dummy(void);
 
 
@@ -883,7 +886,7 @@
 	block = (ndis_miniport_block *)handle;
 
 	ne = malloc(sizeof(struct ndis_timer_entry), M_DEVBUF, M_NOWAIT);
-	callout_handle_init(&ne->nte_ch);
+	callout_init(&ne->nte_ch, CALLOUT_MPSAFE);
 	TAILQ_INSERT_TAIL(&block->nmb_timerlist, ne, link);
 	ne->nte_timer = timer;
 
@@ -927,7 +930,7 @@
 	ndis_miniport_timer	*timer;
 	uint32_t		msecs;
 {
-	struct callout_handle	*ch;
+	struct callout		*ch;
 	struct timeval		tv;
 
 	tv.tv_sec = 0;
@@ -936,8 +939,7 @@
 	ch = timer->nmt_dpc.nk_deferredctx;
 	timer->nmt_dpc.nk_sysarg2 = ndis_timercall;
 	timer->nmt_ktimer.nk_header.dh_sigstate = TRUE;
-	*ch = timeout((timeout_t *)timer->nmt_dpc.nk_sysarg2, (void *)timer,
-	    tvtohz(&tv));
+	callout_reset(ch, tvtohz(&tv), timer->nmt_dpc.nk_sysarg2, timer);
 
 	return;
 }
@@ -947,7 +949,7 @@
 	void			*arg;
 {
 	ndis_miniport_timer	*timer;
-	struct callout_handle	*ch;
+	struct callout		*ch;
 	__stdcall ndis_timer_function	timerfunc;
 	struct timeval		tv;
 
@@ -964,8 +966,7 @@
 	ch = timer->nmt_dpc.nk_deferredctx;
 	timer->nmt_ktimer.nk_header.dh_sigstate = TRUE;
 	timer->nmt_dpc.nk_sysarg2 = ndis_tick;
-	*ch = timeout((timeout_t *)timer->nmt_dpc.nk_sysarg2, timer,
-	    tvtohz(&tv));
+	callout_reset(ch, tvtohz(&tv), timer->nmt_dpc.nk_sysarg2, timer);
 
 	return;
 }
@@ -975,7 +976,7 @@
 	ndis_miniport_timer	*timer;
 	uint32_t		msecs;
 {
-	struct callout_handle	*ch;
+	struct callout		*ch;
 	struct timeval		tv;
 
 	tv.tv_sec = 0;
@@ -985,8 +986,7 @@
 	ch = timer->nmt_dpc.nk_deferredctx;
 	timer->nmt_dpc.nk_sysarg2 = ndis_tick;
 	timer->nmt_ktimer.nk_header.dh_sigstate = TRUE;
-	*ch = timeout((timeout_t *)timer->nmt_dpc.nk_sysarg2, timer,
-	    tvtohz(&tv));
+	callout_reset(ch, tvtohz(&tv), timer->nmt_dpc.nk_sysarg2, timer);
 
 	return;
 }
@@ -996,10 +996,10 @@
 	ndis_miniport_timer	*timer;
 	uint8_t			*cancelled;
 {
-	struct callout_handle	*ch;
+	struct callout		*ch;
 
 	ch = timer->nmt_dpc.nk_deferredctx;
-	untimeout(ch->callout->c_func, ch->callout->c_arg, *ch);
+	callout_stop(ch);
 	*cancelled = timer->nmt_ktimer.nk_header.dh_sigstate;
 
 	return;
@@ -1089,6 +1089,15 @@
 }
 
 __stdcall static ndis_status
+ndis_mapreg_cnt(bustype, cnt)
+	uint32_t		bustype;
+	uint32_t		*cnt;
+{
+	*cnt = 64;
+	return(NDIS_STATUS_SUCCESS);
+}
+
+__stdcall static ndis_status
 ndis_alloc_mapreg(adapter, dmachannel, dmasize, physmapneeded, maxmap)
 	ndis_handle		adapter;
 	uint32_t		dmachannel;
@@ -2252,6 +2261,16 @@
 	return;
 }
 
+__stdcall static uint8_t
+ndis_cpu_cnt()
+{
+#ifdef SMP
+	return(mp_ncpus);
+#else
+	return(1);
+#endif
+};
+
 __stdcall static void
 dummy()
 {
@@ -2260,6 +2279,7 @@
 }
 
 image_patch_table ndis_functbl[] = {
+	{ "NdisSystemProcessorCount",	(FUNC)ndis_cpu_cnt },
 	{ "NdisUnchainBufferAtBack",	(FUNC)ndis_unchain_tailbuf, },
 	{ "NdisGetFirstBufferFromPacket", (FUNC)ndis_firstbuf },
 	{ "NdisGetFirstBufferFromPacketSafe", (FUNC)ndis_firstbuf_safe },
@@ -2309,8 +2329,9 @@
 	{ "NdisMRegisterIoPortRange",	(FUNC)ndis_register_ioport },
 	{ "NdisMDeregisterIoPortRange",	(FUNC)ndis_deregister_ioport },
 	{ "NdisReadNetworkAddress",	(FUNC)ndis_read_netaddr },
+	{ "NdisQueryMapRegisterCount",	(FUNC)ndis_mapreg_cnt },
 	{ "NdisMAllocateMapRegisters",	(FUNC)ndis_alloc_mapreg },
-        { "NdisMFreeMapRegisters",	(FUNC)ndis_free_mapreg },
+	{ "NdisMFreeMapRegisters",	(FUNC)ndis_free_mapreg },
 	{ "NdisMAllocateSharedMemory",	(FUNC)ndis_alloc_sharedmem },
 	{ "NdisMMapIoSpace",		(FUNC)ndis_map_iospace },
 	{ "NdisMUnmapIoSpace",		(FUNC)ndis_unmap_iospace },

==== //depot/projects/netperf/sys/compat/ndis/subr_pe.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_pe.c,v 1.2 2003/12/24 21:21:18 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_pe.c,v 1.3 2003/12/26 03:31:34 wpaul Exp $");
 
 /*
  * This file contains routines for relocating and dynamically linking
@@ -520,7 +520,7 @@
 	fptr = (vm_offset_t *)pe_translate_addr(imgbase,
 	    imp_desc.iid_import_address_table_addr);
 
-	while (nptr != NULL && pe_translate_addr(imgbase, *nptr) != NULL) {
+	while (nptr != NULL && pe_translate_addr(imgbase, *nptr)) {
 		fname = (char *)pe_translate_addr(imgbase, (*nptr) + 2);
 		func = pe_functbl_match(functbl, fname);
 		if (func)

==== //depot/projects/netperf/sys/dev/acpica/acpi.c#17 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.111 2003/12/23 18:47:31 njl Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.112 2003/12/26 15:42:13 jhb Exp $
  */
 
 #include "opt_acpi.h"
@@ -1216,10 +1216,10 @@
 	return (FALSE);
     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
 
-    if ((devinfo->Valid & ACPI_VALID_HID) != 0) {
-	if (strcmp(hid, devinfo->HardwareId.Value) == 0)
+    if ((devinfo->Valid & ACPI_VALID_HID) != 0 &&
+	strcmp(hid, devinfo->HardwareId.Value) == 0)
 	    ret = TRUE;
-    } else if ((devinfo->Valid & ACPI_VALID_CID) != 0) {
+    else if ((devinfo->Valid & ACPI_VALID_CID) != 0) {
 	for (i = 0; i < devinfo->CompatibilityId.Count; i++) {
 	    if (strcmp(hid, devinfo->CompatibilityId.Id[i].Value) == 0) {
 		ret = TRUE;

==== //depot/projects/netperf/sys/dev/gem/if_gem_pci.c#4 (text+ko) ====

@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/gem/if_gem_pci.c,v 1.12 2003/09/02 20:24:42 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/gem/if_gem_pci.c,v 1.13 2003/12/26 05:36:08 obrien Exp $");
 
 /*
  * PCI bindings for Sun GEM ethernet controllers.
@@ -126,7 +126,7 @@
 	{ 0x2bad108e, GEM_SUN_GEM,	"Sun GEM Gigabit Ethernet Adaptor" },
 	{ 0x0021106b, GEM_APPLE_GMAC,	"Apple GMAC Ethernet Adaptor" },
 	{ 0x0024106b, GEM_APPLE_GMAC,	"Apple GMAC2 Ethernet Adaptor" },
-	{ 0, NULL }
+	{ 0, 0, NULL }
 };
 
 /*

==== //depot/projects/netperf/sys/dev/if_ndis/if_ndis.c#5 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.13 2003/12/25 09:44:49 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.15 2003/12/26 07:01:05 wpaul Exp $");
 
 #include "opt_bdg.h"
 
@@ -633,6 +633,21 @@
 /*
  * A frame has been uploaded: pass the resulting mbuf chain up to
  * the higher level protocols.
+ *
+ * When handling received NDIS packets, the 'status' field in the
+ * out-of-band portion of the ndis_packet has special meaning. In the
+ * most common case, the underlying NDIS driver will set this field
+ * to NDIS_STATUS_SUCCESS, which indicates that it's ok for us to
+ * take posession of it. We then change the status field to
+ * NDIS_STATUS_PENDING to tell the driver that we now own the packet,
+ * and that we will return it at some point in the future via the
+ * return packet handler.
+ *
+ * If the driver hands us a packet with a status of NDIS_STATUS_RESOURCES,
+ * this means the driver is running out of packet/buffer resources and
+ * wants to maintain ownership of the packet. In this case, we have to
+ * copy the packet data into local storage and let the driver keep the
+ * packet.
  */
 __stdcall static void
 ndis_rxeof(adapter, packets, pktcnt)
@@ -644,7 +659,7 @@
 	ndis_miniport_block	*block;
 	ndis_packet		*p;
 	struct ifnet		*ifp;
-	struct mbuf		*m0;
+	struct mbuf		*m0, *m;
 	int			i;
 
 	block = (ndis_miniport_block *)adapter;
@@ -657,8 +672,18 @@
 		p->np_softc = sc;
 		if (ndis_ptom(&m0, p)) {
 			printf ("ndis%d: ptom failed\n", sc->ndis_unit);
-			ndis_return_packet(sc, p);
+			if (p->np_oob.npo_status == NDIS_STATUS_SUCCESS)
+				ndis_return_packet(sc, p);
 		} else {
+			if (p->np_oob.npo_status == NDIS_STATUS_RESOURCES) {
+				m = m_dup(m0, M_DONTWAIT);
+				m_freem(m0);
+				if (m == NULL)
+					ifp->if_ierrors++;
+				else
+					m0 = m;
+			} else
+				p->np_oob.npo_status = NDIS_STATUS_PENDING;
 			m0->m_pkthdr.rcvif = ifp;
 			ifp->if_ipackets++;
 			(*ifp->if_input)(ifp, m0);
@@ -1048,6 +1073,12 @@
 	ndis_media_state	linkstate;
 	int			error, len;
 
+	ifmr->ifm_status = IFM_AVALID;
+	ifmr->ifm_active = IFM_ETHER;
+
+	if (!(ifp->if_flags & IFF_UP))
+		return;
+
 	sc = ifp->if_softc;
 
 	len = sizeof(linkstate);
@@ -1058,9 +1089,6 @@
 	error = ndis_get_info(sc, OID_GEN_LINK_SPEED,
 	    (void *)&media_info, &len);
 
-        ifmr->ifm_status = IFM_AVALID;
-        ifmr->ifm_active = IFM_ETHER;
-
 	if (linkstate == nmc_connected)
 		ifmr->ifm_status |= IFM_ACTIVE;
 

==== //depot/projects/netperf/sys/dev/sio/sio_puc.c#3 (text+ko) ====

@@ -24,10 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/sio/sio_puc.c,v 1.6 2003/08/24 18:03:44 obrien Exp $");
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/sio/sio_puc.c,v 1.6 2003/08/24 18:03:44 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/sio/sio_puc.c,v 1.7 2003/12/26 04:30:01 imp Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>

==== //depot/projects/netperf/sys/fs/msdosfs/bootsect.h#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/bootsect.h,v 1.10 2002/10/21 19:00:50 jhb Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/bootsect.h,v 1.11 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: bootsect.h,v 1.9 1997/11/17 15:36:17 ws Exp $	*/
 
 /*

==== //depot/projects/netperf/sys/fs/msdosfs/bpb.h#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/bpb.h,v 1.9 2001/11/28 16:56:42 jhb Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/bpb.h,v 1.10 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: bpb.h,v 1.7 1997/11/17 15:36:24 ws Exp $	*/
 
 /*

==== //depot/projects/netperf/sys/fs/msdosfs/denode.h#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/denode.h,v 1.25 2003/06/24 22:11:20 jmg Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/denode.h,v 1.27 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: denode.h,v 1.25 1997/11/17 15:36:28 ws Exp $	*/
 
 /*-
@@ -160,6 +160,7 @@
 	u_long de_FileSize;	/* size of file in bytes */
 	struct fatcache de_fc[FC_SIZE];	/* fat cache */
 	u_quad_t de_modrev;	/* Revision level for lease. */
+	struct lockf *de_lockf; /* lockf */
 };
 
 /*

==== //depot/projects/netperf/sys/fs/msdosfs/direntry.h#3 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/direntry.h,v 1.18 2003/09/27 01:18:27 bde Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/direntry.h,v 1.19 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: direntry.h,v 1.14 1997/11/17 15:36:32 ws Exp $	*/
 
 /*-

==== //depot/projects/netperf/sys/fs/msdosfs/fat.h#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/fat.h,v 1.11 2002/03/19 22:20:10 alfred Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/fat.h,v 1.13 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: fat.h,v 1.12 1997/11/17 15:36:36 ws Exp $	*/
 
 /*-
@@ -99,5 +99,6 @@
 int freeclusterchain(struct msdosfsmount *pmp, u_long startchain);
 int extendfile(struct denode *dep, u_long count, struct buf **bpp, u_long *ncp, int flags);
 void fc_purge(struct denode *dep, u_int frcn);
+int markvoldirty(struct msdosfsmount *pmp, int dirty);
 
 #endif	/* _KERNEL */

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_conv.c#4 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_conv.c,v 1.35 2003/12/08 08:32:20 fjoe Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_conv.c,v 1.36 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfs_conv.c,v 1.25 1997/11/17 15:36:40 ws Exp $	*/
 
 /*-

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_denode.c#3 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_denode.c,v 1.71 2003/10/05 02:43:29 jeff Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_denode.c,v 1.72 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $	*/
 
 /*-

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_fat.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_fat.c,v 1.32 2003/03/04 00:04:42 jeff Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_fat.c,v 1.34 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfs_fat.c,v 1.28 1997/11/17 15:36:49 ws Exp $	*/
 
 /*-
@@ -1106,3 +1106,70 @@
 
 	return (0);
 }
+
+/* [2753891]
+ * Routine to mark a FAT16 or FAT32 volume as "clean" or "dirty" by manipulating the upper bit
+ * of the FAT entry for cluster 1.  Note that this bit is not defined for FAT12 volumes, which
+ * are always assumed to be dirty.
+ *
+ * The fatentry() routine only works on cluster numbers that a file could occupy, so it won't
+ * manipulate the entry for cluster 1.  So we have to do it here.  The code is ripped from
+ * fatentry(), and tailored for cluster 1.
+ *
+ * Inputs:
+ *     pmp     The MS-DOS volume to mark
+ *     dirty   Non-zero if the volume should be marked dirty; zero if it should be marked clean.
+ *
+ * Result:
+ *     0       Success
+ *     EROFS   Volume is read-only
+ *     ?       (other errors from called routines)
+ */
+int markvoldirty(struct msdosfsmount *pmp, int dirty)
+{
+    int error;
+    u_long bn, bo, bsize, byteoffset;
+    u_long fatval;
+    struct buf *bp;
+
+    /* FAT12 does not support a "clean" bit, so don't do anything */
+    if (FAT12(pmp))
+        return 0;
+
+    /* Can't change the bit on a read-only filesystem */
+    if (pmp->pm_flags & MSDOSFSMNT_RONLY)
+        return EROFS;
+
+    /* Fetch the block containing the FAT entry */
+    byteoffset = FATOFS(pmp, 1);       /* Find the location of cluster 1 */
+    fatblock(pmp, byteoffset, &bn, &bsize, &bo);
+    
+    error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp);
+    if (error) {
+            brelse(bp);
+            return (error);
+    }
+
+    /* Get the current value of the FAT entry and set/clear the high bit */
+    if (FAT32(pmp)) {
+        /* FAT32 uses bit 27 */
+        fatval = getulong(&bp->b_data[bo]);
+        if (dirty)
+            fatval &= 0xF7FFFFFF;      /* dirty means clear the "clean" bit */
+        else
+            fatval |= 0x08000000;      /* clean means set the "clean" bit */
+        putulong(&bp->b_data[bo], fatval);
+    }
+    else {
+        /* Must be FAT16; use bit 15 */
+        fatval = getushort(&bp->b_data[bo]);
+        if (dirty)
+            fatval &= 0x7FFF;          /* dirty means clear the "clean" bit */
+        else
+            fatval |= 0x8000;          /* clean means set the "clean" bit */
+        putushort(&bp->b_data[bo], fatval);
+    }
+
+    /* Write out the modified FAT block immediately */
+    return bwrite(bp);
+}

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_iconv.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/msdosfs/msdosfs_iconv.c,v 1.1 2003/09/26 20:26:23 fjoe Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/msdosfs/msdosfs_iconv.c,v 1.2 2003/12/26 17:24:37 trhodes Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_lookup.c#3 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_lookup.c,v 1.39 2003/09/26 20:26:23 fjoe Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_lookup.c,v 1.40 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfs_lookup.c,v 1.37 1997/11/17 15:36:54 ws Exp $	*/
 
 /*-

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_vfsops.c#9 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.111 2003/11/05 04:30:06 kan Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.113 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfs_vfsops.c,v 1.51 1997/11/17 15:36:58 ws Exp $	*/
 
 /*-
@@ -209,6 +209,11 @@
 				VOP_UNLOCK(devvp, 0, td);
 			}
 			pmp->pm_flags &= ~MSDOSFSMNT_RONLY;
+			
+			/* [2753891] Now that the volume is modifiable, mark it dirty */
+			error = markvoldirty(pmp, 1);
+			if (error)
+			  return error;
 		}
 		if (args.fspec == 0) {
 #ifdef	__notyet__	/* doesn't work correctly with current mountd	XXX */
@@ -609,8 +614,12 @@
 	 */
 	if (ronly)
 		pmp->pm_flags |= MSDOSFSMNT_RONLY;
-	else
+	else {
+                 /* [2753891] Mark the volume dirty while it is mounted read/write */
+                 if ((error = markvoldirty(pmp, 1)) != 0)
+                     goto error_exit;
 		pmp->pm_fmod = 1;
+	}
 	mp->mnt_data = (qaddr_t) pmp;
 	mp->mnt_stat.f_fsid.val[0] = dev2udev(dev);
 	mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
@@ -667,6 +676,13 @@
 			msdosfs_iconv->close(pmp->pm_u2d);
 	}
 	pmp->pm_devvp->v_rdev->si_mountpoint = NULL;
+
+        /* [2753891] If the volume was mounted read/write, mark it clean now */
+        if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) {
+                error = markvoldirty(pmp, 0);
+                if (error && !(flags & FORCECLOSE))
+                        return (error);
+        }
 #ifdef MSDOSFS_DEBUG
 	{
 		struct vnode *vp = pmp->pm_devvp;

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_vnops.c#5 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vnops.c,v 1.143 2003/10/18 14:10:24 phk Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vnops.c,v 1.145 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $	*/
 
 /*-
@@ -63,6 +63,7 @@
 #include <sys/malloc.h>
 #include <sys/dirent.h>
 #include <sys/signalvar.h>
+#include <sys/lockf.h>
 
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
@@ -101,6 +102,7 @@
 static int msdosfs_strategy(struct vop_strategy_args *);
 static int msdosfs_print(struct vop_print_args *);
 static int msdosfs_pathconf(struct vop_pathconf_args *ap);
+static int msdosfs_advlock(struct vop_advlock_args *);
 
 /*
  * Some general notes:
@@ -1836,6 +1838,23 @@
 	/* NOTREACHED */
 }
 
+/*
+ * Advisory record locking support
+ */
+static int
+msdosfs_advlock(ap)
+	struct vop_advlock_args /* {
+		struct vnode *a_vp;
+		u_char  a_id;
+		int  a_op;
+		struct flock *a_fl;
+		int  a_flags;
+	} */ *ap;
+{
+	struct denode *ip = VTODE(ap->a_vp);
+
+	return (lf_advlock(ap, &(ip->de_lockf), ip->de_FileSize));
+}
 
 /* Global vfs data structures for msdosfs */
 vop_t **msdosfs_vnodeop_p;
@@ -1865,6 +1884,7 @@
 	{ &vop_strategy_desc,		(vop_t *) msdosfs_strategy },
 	{ &vop_symlink_desc,		(vop_t *) msdosfs_symlink },
 	{ &vop_write_desc,		(vop_t *) msdosfs_write },
+	{ &vop_advlock_desc,            (vop_t *) msdosfs_advlock },
 	{ NULL, NULL }
 };
 static struct vnodeopv_desc msdosfs_vnodeop_opv_desc =

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfsmount.h#4 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfsmount.h,v 1.29 2003/09/26 20:26:23 fjoe Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfsmount.h,v 1.30 2003/12/26 17:24:37 trhodes Exp $ */
 /*	$NetBSD: msdosfsmount.h,v 1.17 1997/11/17 15:37:07 ws Exp $	*/
 
 /*-

==== //depot/projects/netperf/sys/kern/kern_event.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_event.c,v 1.65 2003/11/14 18:49:01 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_event.c,v 1.66 2003/12/25 23:42:36 dwmalone Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -395,7 +395,6 @@
 	fp->f_flag = FREAD | FWRITE;
 	fp->f_type = DTYPE_KQUEUE;
 	fp->f_ops = &kqueueops;
-	TAILQ_INIT(&kq->kq_head);
 	fp->f_data = kq;
 	FILE_UNLOCK(fp);
 	fdrop(fp, td);

==== //depot/projects/netperf/sys/kern/kern_subr.c#3 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_subr.c,v 1.77 2003/10/02 15:00:55 nectar Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_subr.c,v 1.78 2003/12/26 05:54:35 alfred Exp $");
 
 #include "opt_zero.h"
 
@@ -448,7 +448,8 @@
 }
 
 int
-copyinfrom(const void *src, void *dst, size_t len, int seg)
+copyinfrom(const void * __restrict src, void * __restrict dst, size_t len,
+    int seg)
 {
 	int error = 0;
 
@@ -466,7 +467,8 @@
 }
 
 int
-copyinstrfrom(const void *src, void *dst, size_t len, size_t *copied, int seg)
+copyinstrfrom(const void * __restrict src, void * __restrict dst, size_t len,
+    size_t * __restrict copied, int seg)
 {
 	int error = 0;
 

==== //depot/projects/netperf/sys/kern/sched_4bsd.c#10 (text+ko) ====

@@ -37,13 +37,14 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.28 2003/11/09 13:45:54 bde Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.29 2003/12/26 17:07:29 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/ktr.h>
 #include <sys/lock.h>
+#include <sys/kthread.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
 #include <sys/resourcevar.h>
@@ -80,11 +81,11 @@
 static int	sched_quantum;	/* Roundrobin scheduling quantum in ticks. */
 #define	SCHED_QUANTUM	(hz / 10)	/* Default sched quantum */
 
-static struct callout schedcpu_callout;
 static struct callout roundrobin_callout;
 
 static void	roundrobin(void *arg);
-static void	schedcpu(void *arg);
+static void	schedcpu(void);
+static void	schedcpu_thread(void *dummy);
 static void	sched_setup(void *dummy);
 static void	maybe_resched(struct thread *td);
 static void	updatepri(struct ksegrp *kg);
@@ -244,7 +245,7 @@
  */
 /* ARGSUSED */
 static void
-schedcpu(void *arg)
+schedcpu(void)
 {
 	register fixpt_t loadfac = loadfactor(averunnable.ldavg[0]);
 	struct thread *td;
@@ -348,7 +349,20 @@
 		mtx_unlock_spin(&sched_lock);
 	} /* end of process loop */
 	sx_sunlock(&allproc_lock);
-	callout_reset(&schedcpu_callout, hz, schedcpu, NULL);
+}
+
+/*
+ * Main loop for a kthread that executes schedcpu once a second.
+ */
+static void
+schedcpu_thread(void *dummy)
+{
+	int nowake;
+
+	for (;;) {
+		schedcpu();
+		tsleep(&nowake, curthread->td_priority, "-", hz);
+	}
 }
 
 /*
@@ -407,12 +421,13 @@
 		sched_quantum = SCHED_QUANTUM;
 	hogticks = 2 * sched_quantum;
 
-	callout_init(&schedcpu_callout, CALLOUT_MPSAFE);
 	callout_init(&roundrobin_callout, 0);
 
 	/* Kick off timeout driven events by calling first time. */
 	roundrobin(NULL);
-	schedcpu(NULL);
+
+	/* Kick off schedcpu kernel process. */
+	kthread_create(schedcpu_thread, NULL, NULL, 0, 0, "schedcpu");
 }
 
 /* External interfaces start here */

==== //depot/projects/netperf/sys/kern/syscalls.master#12 (text+ko) ====

@@ -1,4 +1,4 @@
- $FreeBSD: src/sys/kern/syscalls.master,v 1.164 2003/12/24 19:09:45 alfred Exp $
+ $FreeBSD: src/sys/kern/syscalls.master,v 1.165 2003/12/26 05:58:16 alfred Exp $
 ;	from: @(#)syscalls.master	8.2 (Berkeley) 1/13/94
 ;
 ; System call name/number master file.
@@ -80,14 +80,14 @@
 27	MSTD	{ int recvmsg(int s, struct msghdr *msg, int flags); }
 28	MSTD	{ int sendmsg(int s, struct msghdr *msg, int flags); }
 29	MSTD	{ int recvfrom(int s, caddr_t buf, size_t len, int flags, \
-		    struct sockaddr * from, \
-		    __socklen_t * fromlenaddr); }
-30	MSTD	{ int accept(int s, struct sockaddr * name, \
-		    __socklen_t *anamelen); }
-31	MSTD	{ int getpeername(int fdes, struct sockaddr * asa, \
-		    __socklen_t *alen); }
-32	MSTD	{ int getsockname(int fdes, struct sockaddr * asa, \
-		    __socklen_t *alen); }
+		    struct sockaddr * __restrict from, \
+		    __socklen_t * __restrict fromlenaddr); }
+30	MSTD	{ int accept(int s, struct sockaddr * __restrict name, \
+		    __socklen_t * __restrict anamelen); }
+31	MSTD	{ int getpeername(int fdes, struct sockaddr * __restrict asa, \
+		    __socklen_t * __restrict alen); }
+32	MSTD	{ int getsockname(int fdes, struct sockaddr * __restrict asa, \
+		    __socklen_t * __restrict alen); }
 33	STD	{ int access(char *path, int flags); }
 34	STD	{ int chflags(char *path, int flags); }
 35	STD	{ int fchflags(int fd, int flags); }

==== //depot/projects/netperf/sys/kern/uipc_syscalls.c#10 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.160 2003/12/24 18:47:42 alfred Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.161 2003/12/25 23:44:38 dwmalone Exp $");
 
 #include "opt_compat.h"
 #include "opt_ktrace.h"
@@ -112,14 +112,15 @@
 	struct file *fp;
 	int fd, error;
 
-	mtx_lock(&Giant);
 	fdp = td->td_proc->p_fd;
 	error = falloc(td, &fp, &fd);
 	if (error)
 		goto done2;
 	/* An extra reference on `fp' has been held for us by falloc(). */
+	mtx_lock(&Giant);
 	error = socreate(uap->domain, &so, uap->type, uap->protocol,
 	    td->td_ucred, td);
+	mtx_unlock(&Giant);
 	FILEDESC_LOCK(fdp);
 	if (error) {
 		if (fdp->fd_ofiles[fd] == fp) {
@@ -138,7 +139,6 @@
 	}
 	fdrop(fp, td);
 done2:
-	mtx_unlock(&Giant);
 	return (error);
 }
 

==== //depot/projects/netperf/sys/net/if.c#12 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)if.c	8.5 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/net/if.c,v 1.173 2003/10/31 18:32:08 brooks Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.174 2003/12/26 18:09:35 green Exp $
  */
 
 #include "opt_compat.h"
@@ -1229,7 +1229,7 @@
 struct ifnet *
 ifunit(const char *name)

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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