Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Sep 2009 15:56:26 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 168280 for review
Message-ID:  <200909071556.n87FuQOp076207@repoman.freebsd.org>

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

Change 168280 by hselasky@hselasky_laptop001 on 2009/09/07 15:55:49

	
	IFC @ 168278

Affected files ...

.. //depot/projects/usb/src/sys/amd64/amd64/elf_machdep.c#8 integrate
.. //depot/projects/usb/src/sys/amd64/amd64/local_apic.c#20 integrate
.. //depot/projects/usb/src/sys/amd64/amd64/pmap.c#29 integrate
.. //depot/projects/usb/src/sys/arm/arm/vm_machdep.c#11 integrate
.. //depot/projects/usb/src/sys/arm/conf/CAMBRIA#9 integrate
.. //depot/projects/usb/src/sys/cam/ata/ata_all.c#2 integrate
.. //depot/projects/usb/src/sys/cam/ata/ata_all.h#2 integrate
.. //depot/projects/usb/src/sys/cam/ata/ata_da.c#3 integrate
.. //depot/projects/usb/src/sys/cam/ata/ata_xpt.c#3 integrate
.. //depot/projects/usb/src/sys/cam/cam_xpt.c#21 integrate
.. //depot/projects/usb/src/sys/cam/cam_xpt_internal.h#2 integrate
.. //depot/projects/usb/src/sys/cam/scsi/scsi_da.c#15 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c#7 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c#7 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c#4 integrate
.. //depot/projects/usb/src/sys/compat/ia32/ia32_sysvec.c#12 integrate
.. //depot/projects/usb/src/sys/compat/linprocfs/linprocfs.c#23 integrate
.. //depot/projects/usb/src/sys/compat/linux/linux_ioctl.c#18 integrate
.. //depot/projects/usb/src/sys/conf/NOTES#45 integrate
.. //depot/projects/usb/src/sys/conf/files#78 integrate
.. //depot/projects/usb/src/sys/conf/files.amd64#23 integrate
.. //depot/projects/usb/src/sys/conf/files.i386#28 integrate
.. //depot/projects/usb/src/sys/conf/files.ia64#13 integrate
.. //depot/projects/usb/src/sys/conf/files.powerpc#27 integrate
.. //depot/projects/usb/src/sys/conf/files.sparc64#14 integrate
.. //depot/projects/usb/src/sys/dev/ahci/ahci.c#2 integrate
.. //depot/projects/usb/src/sys/dev/ahci/ahci.h#2 integrate
.. //depot/projects/usb/src/sys/dev/ata/ata-disk.c#15 integrate
.. //depot/projects/usb/src/sys/dev/ata/ata-dma.c#10 integrate
.. //depot/projects/usb/src/sys/dev/ath/ath_hal/ah_regdomain.c#5 integrate
.. //depot/projects/usb/src/sys/dev/ath/if_ath.c#31 integrate
.. //depot/projects/usb/src/sys/dev/coretemp/coretemp.c#5 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_main.c#22 integrate
.. //depot/projects/usb/src/sys/dev/hwpmc/hwpmc_core.c#4 integrate
.. //depot/projects/usb/src/sys/dev/hwpmc/pmc_events.h#6 integrate
.. //depot/projects/usb/src/sys/dev/ixgbe/ixgbe.c#12 integrate
.. //depot/projects/usb/src/sys/dev/mwl/if_mwl.c#5 integrate
.. //depot/projects/usb/src/sys/dev/null/null.c#3 integrate
.. //depot/projects/usb/src/sys/dev/pty/pty.c#2 integrate
.. //depot/projects/usb/src/sys/dev/rp/rp_pci.c#3 integrate
.. //depot/projects/usb/src/sys/dev/siis/siis.c#2 integrate
.. //depot/projects/usb/src/sys/dev/sound/pci/hda/hdac.c#35 integrate
.. //depot/projects/usb/src/sys/dev/sound/pci/hda/hdac_private.h#7 integrate
.. //depot/projects/usb/src/sys/dev/sound/pci/hda/hdac_reg.h#2 integrate
.. //depot/projects/usb/src/sys/dev/syscons/scterm-teken.c#7 integrate
.. //depot/projects/usb/src/sys/dev/syscons/teken/Makefile#2 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/gensequences#2 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/sequences#4 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken.c#9 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken.h#7 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken_demo.c#5 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken_scs.h#2 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken_stress.c#3 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken_subr.h#5 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken_subr_compat.h#4 delete
.. //depot/projects/usb/src/sys/dev/syscons/teken/teken_wcwidth.h#2 delete
.. //depot/projects/usb/src/sys/dev/txp/if_txp.c#9 integrate
.. //depot/projects/usb/src/sys/dev/usb/storage/umass.c#31 integrate
.. //depot/projects/usb/src/sys/dev/usb/wlan/if_zyd.c#22 integrate
.. //depot/projects/usb/src/sys/dev/xen/blkfront/blkfront.c#7 integrate
.. //depot/projects/usb/src/sys/fs/pseudofs/pseudofs_vncache.c#9 integrate
.. //depot/projects/usb/src/sys/fs/pseudofs/pseudofs_vnops.c#17 integrate
.. //depot/projects/usb/src/sys/geom/geom_disk.c#10 integrate
.. //depot/projects/usb/src/sys/geom/geom_io.c#11 integrate
.. //depot/projects/usb/src/sys/geom/mirror/g_mirror_ctl.c#4 integrate
.. //depot/projects/usb/src/sys/geom/multipath/g_multipath.c#3 integrate
.. //depot/projects/usb/src/sys/geom/stripe/g_stripe.c#5 integrate
.. //depot/projects/usb/src/sys/i386/i386/elf_machdep.c#9 integrate
.. //depot/projects/usb/src/sys/i386/i386/local_apic.c#20 integrate
.. //depot/projects/usb/src/sys/i386/i386/machdep.c#22 integrate
.. //depot/projects/usb/src/sys/i386/i386/pmap.c#26 integrate
.. //depot/projects/usb/src/sys/i386/include/pcpu.h#7 integrate
.. //depot/projects/usb/src/sys/i386/include/pmap.h#14 integrate
.. //depot/projects/usb/src/sys/i386/isa/vesa.c#5 integrate
.. //depot/projects/usb/src/sys/i386/xen/locore.s#3 integrate
.. //depot/projects/usb/src/sys/i386/xen/pmap.c#13 integrate
.. //depot/projects/usb/src/sys/kern/imgact_elf.c#14 integrate
.. //depot/projects/usb/src/sys/kern/kern_conf.c#19 integrate
.. //depot/projects/usb/src/sys/kern/kern_exit.c#23 integrate
.. //depot/projects/usb/src/sys/kern/kern_fork.c#20 integrate
.. //depot/projects/usb/src/sys/kern/kern_jail.c#31 integrate
.. //depot/projects/usb/src/sys/kern/kern_kthread.c#8 integrate
.. //depot/projects/usb/src/sys/kern/kern_lock.c#18 integrate
.. //depot/projects/usb/src/sys/kern/kern_proc.c#22 integrate
.. //depot/projects/usb/src/sys/kern/kern_sx.c#18 integrate
.. //depot/projects/usb/src/sys/kern/kern_thr.c#13 integrate
.. //depot/projects/usb/src/sys/kern/kern_thread.c#16 integrate
.. //depot/projects/usb/src/sys/kern/subr_bus.c#29 integrate
.. //depot/projects/usb/src/sys/kern/subr_witness.c#21 integrate
.. //depot/projects/usb/src/sys/kern/tty_pts.c#18 integrate
.. //depot/projects/usb/src/sys/kern/vfs_syscalls.c#29 integrate
.. //depot/projects/usb/src/sys/kern/vfs_vnops.c#22 integrate
.. //depot/projects/usb/src/sys/modules/Makefile#42 integrate
.. //depot/projects/usb/src/sys/net/flowtable.c#11 integrate
.. //depot/projects/usb/src/sys/net/if.c#40 integrate
.. //depot/projects/usb/src/sys/net/if_arp.h#2 integrate
.. //depot/projects/usb/src/sys/net/if_llatbl.c#7 integrate
.. //depot/projects/usb/src/sys/net/rtsock.c#32 integrate
.. //depot/projects/usb/src/sys/net/vnet.c#5 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_dfs.c#5 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_sta.c#13 integrate
.. //depot/projects/usb/src/sys/netinet/if_ether.c#28 integrate
.. //depot/projects/usb/src/sys/netinet/in.c#35 integrate
.. //depot/projects/usb/src/sys/netinet/ip_fastfwd.c#14 integrate
.. //depot/projects/usb/src/sys/netinet/ip_output.c#28 integrate
.. //depot/projects/usb/src/sys/netinet/sctp_bsd_addr.c#11 integrate
.. //depot/projects/usb/src/sys/netinet6/icmp6.c#27 integrate
.. //depot/projects/usb/src/sys/netinet6/in6.c#33 integrate
.. //depot/projects/usb/src/sys/netinet6/in6_src.c#22 integrate
.. //depot/projects/usb/src/sys/netinet6/ip6_input.c#29 integrate
.. //depot/projects/usb/src/sys/netinet6/ip6_output.c#20 integrate
.. //depot/projects/usb/src/sys/netinet6/nd6_rtr.c#23 integrate
.. //depot/projects/usb/src/sys/netipsec/ipsec.h#16 integrate
.. //depot/projects/usb/src/sys/netipsec/key.c#25 integrate
.. //depot/projects/usb/src/sys/opencrypto/cryptodev.c#8 integrate
.. //depot/projects/usb/src/sys/sys/bus.h#10 integrate
.. //depot/projects/usb/src/sys/sys/conf.h#20 integrate
.. //depot/projects/usb/src/sys/sys/imgact_elf.h#7 integrate
.. //depot/projects/usb/src/sys/sys/ioctl_compat.h#6 integrate
.. //depot/projects/usb/src/sys/sys/proc.h#22 integrate
.. //depot/projects/usb/src/sys/sys/tty.h#12 integrate
.. //depot/projects/usb/src/sys/sys/ttycom.h#6 integrate
.. //depot/projects/usb/src/sys/sys/types.h#8 integrate
.. //depot/projects/usb/src/sys/teken/Makefile#1 branch
.. //depot/projects/usb/src/sys/teken/gensequences#1 branch
.. //depot/projects/usb/src/sys/teken/sequences#1 branch
.. //depot/projects/usb/src/sys/teken/teken.c#1 branch
.. //depot/projects/usb/src/sys/teken/teken.h#1 branch
.. //depot/projects/usb/src/sys/teken/teken_demo.c#1 branch
.. //depot/projects/usb/src/sys/teken/teken_scs.h#1 branch
.. //depot/projects/usb/src/sys/teken/teken_stress.c#1 branch
.. //depot/projects/usb/src/sys/teken/teken_subr.h#1 branch
.. //depot/projects/usb/src/sys/teken/teken_subr_compat.h#1 branch
.. //depot/projects/usb/src/sys/teken/teken_wcwidth.h#1 branch
.. //depot/projects/usb/src/sys/ufs/ffs/ffs_softdep.c#15 integrate
.. //depot/projects/usb/src/sys/ufs/ffs/ffs_vfsops.c#20 integrate
.. //depot/projects/usb/src/sys/vm/device_pager.c#11 integrate
.. //depot/projects/usb/src/sys/vm/sg_pager.c#2 integrate
.. //depot/projects/usb/src/sys/vm/vm.h#8 integrate
.. //depot/projects/usb/src/sys/vm/vm_extern.h#10 integrate
.. //depot/projects/usb/src/sys/vm/vm_glue.c#10 integrate

Differences ...

==== //depot/projects/usb/src/sys/amd64/amd64/elf_machdep.c#8 (text+ko) ====

@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/elf_machdep.c,v 1.31 2009/08/24 16:19:47 bz Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/elf_machdep.c,v 1.32 2009/08/30 14:38:17 bz Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -118,7 +118,7 @@
 	.sysvec		= &elf64_freebsd_sysvec,
 	.interp_newpath	= NULL,
 	.brand_note	= &elf64_kfreebsd_brandnote,
-	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE_MANDATORY
 };
 
 SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY,

==== //depot/projects/usb/src/sys/amd64/amd64/local_apic.c#20 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/local_apic.c,v 1.60 2009/08/14 21:05:08 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/local_apic.c,v 1.61 2009/09/02 00:39:59 jhb Exp $");
 
 #include "opt_hwpmc_hooks.h"
 #include "opt_kdtrace.h"
@@ -990,18 +990,21 @@
 	 * we don't lose an interrupt delivery race.
 	 */
 	td = curthread;
-	thread_lock(td);
-	if (sched_is_bound(td))
-		panic("apic_free_vector: Thread already bound.\n");
-	sched_bind(td, apic_cpuid(apic_id));
-	thread_unlock(td);
+	if (!rebooting) {
+		thread_lock(td);
+		if (sched_is_bound(td))
+			panic("apic_free_vector: Thread already bound.\n");
+		sched_bind(td, apic_cpuid(apic_id));
+		thread_unlock(td);
+	}
 	mtx_lock_spin(&icu_lock);
 	lapics[apic_id].la_ioint_irqs[vector - APIC_IO_INTS] = -1;
 	mtx_unlock_spin(&icu_lock);
-	thread_lock(td);
-	sched_unbind(td);
-	thread_unlock(td);
-
+	if (!rebooting) {
+		thread_lock(td);
+		sched_unbind(td);
+		thread_unlock(td);
+	}
 }
 
 /* Map an IDT vector (APIC) to an IRQ (interrupt source). */

==== //depot/projects/usb/src/sys/amd64/amd64/pmap.c#29 (text+ko) ====

@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.668 2009/08/17 13:27:55 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.672 2009/09/02 16:47:10 jkim Exp $");
 
 /*
  *	Manages physical address maps.
@@ -178,6 +178,8 @@
 vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
 pt_entry_t pg_nx;
 
+static int pat_works = 0;		/* Is page attribute table sane? */
+
 SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
 
 static int pg_ps_enabled = 1;
@@ -590,20 +592,56 @@
 pmap_init_pat(void)
 {
 	uint64_t pat_msr;
+	char *sysenv;
+	static int pat_tested = 0;
 
 	/* Bail if this CPU doesn't implement PAT. */
 	if (!(cpu_feature & CPUID_PAT))
 		panic("no PAT??");
 
 	/*
-	 * Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
-	 * Program 4 and 5 as WP and WC.
-	 * Leave 6 and 7 as UC and UC-.
+	 * Some Apple Macs based on nVidia chipsets cannot enter ACPI mode
+	 * via SMI# when we use upper 4 PAT entries for unknown reason.
 	 */
-	pat_msr = rdmsr(MSR_PAT);
-	pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
-	pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
-	    PAT_VALUE(5, PAT_WRITE_COMBINING);
+	if (!pat_tested) {
+		pat_works = 1;
+		sysenv = getenv("smbios.system.product");
+		if (sysenv != NULL) {
+			if (strncmp(sysenv, "MacBook5,1", 10) == 0 ||
+			    strncmp(sysenv, "MacBookPro5,5", 13) == 0 ||
+			    strncmp(sysenv, "Macmini3,1", 10) == 0)
+				pat_works = 0;
+			freeenv(sysenv);
+		}
+		pat_tested = 1;
+	}
+
+	/* Initialize default PAT entries. */
+	pat_msr = PAT_VALUE(0, PAT_WRITE_BACK) |
+	    PAT_VALUE(1, PAT_WRITE_THROUGH) |
+	    PAT_VALUE(2, PAT_UNCACHED) |
+	    PAT_VALUE(3, PAT_UNCACHEABLE) |
+	    PAT_VALUE(4, PAT_WRITE_BACK) |
+	    PAT_VALUE(5, PAT_WRITE_THROUGH) |
+	    PAT_VALUE(6, PAT_UNCACHED) |
+	    PAT_VALUE(7, PAT_UNCACHEABLE);
+
+	if (pat_works) {
+		/*
+		 * Leave the indices 0-3 at the default of WB, WT, UC-, and UC.
+		 * Program 4 and 5 as WP and WC.
+		 * Leave 6 and 7 as UC- and UC.
+		 */
+		pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
+		pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
+		    PAT_VALUE(5, PAT_WRITE_COMBINING);
+	} else {
+		/*
+		 * Just replace PAT Index 2 with WC instead of UC-.
+		 */
+		pat_msr &= ~PAT_MASK(2);
+		pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
+	}
 	wrmsr(MSR_PAT, pat_msr);
 }
 
@@ -754,27 +792,48 @@
 	pat_flag = is_pde ? PG_PDE_PAT : PG_PTE_PAT;
 
 	/* Map the caching mode to a PAT index. */
-	switch (mode) {
-	case PAT_UNCACHEABLE:
-		pat_index = 3;
-		break;
-	case PAT_WRITE_THROUGH:
-		pat_index = 1;
-		break;
-	case PAT_WRITE_BACK:
-		pat_index = 0;
-		break;
-	case PAT_UNCACHED:
-		pat_index = 2;
-		break;
-	case PAT_WRITE_COMBINING:
-		pat_index = 5;
-		break;
-	case PAT_WRITE_PROTECTED:
-		pat_index = 4;
-		break;
-	default:
-		panic("Unknown caching mode %d\n", mode);
+	if (pat_works) {
+		switch (mode) {
+		case PAT_UNCACHEABLE:
+			pat_index = 3;
+			break;
+		case PAT_WRITE_THROUGH:
+			pat_index = 1;
+			break;
+		case PAT_WRITE_BACK:
+			pat_index = 0;
+			break;
+		case PAT_UNCACHED:
+			pat_index = 2;
+			break;
+		case PAT_WRITE_COMBINING:
+			pat_index = 5;
+			break;
+		case PAT_WRITE_PROTECTED:
+			pat_index = 4;
+			break;
+		default:
+			panic("Unknown caching mode %d\n", mode);
+		}
+	} else {
+		switch (mode) {
+		case PAT_UNCACHED:
+		case PAT_UNCACHEABLE:
+		case PAT_WRITE_PROTECTED:
+			pat_index = 3;
+			break;
+		case PAT_WRITE_THROUGH:
+			pat_index = 1;
+			break;
+		case PAT_WRITE_BACK:
+			pat_index = 0;
+			break;
+		case PAT_WRITE_COMBINING:
+			pat_index = 2;
+			break;
+		default:
+			panic("Unknown caching mode %d\n", mode);
+		}
 	}
 
 	/* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
@@ -943,8 +1002,8 @@
 		 * coherence domain.
 		 */
 		mfence();
-		for (; eva < sva; eva += cpu_clflush_line_size)
-			clflush(eva);
+		for (; sva < eva; sva += cpu_clflush_line_size)
+			clflush(sva);
 		mfence();
 	} else {
 
@@ -4476,7 +4535,8 @@
 	if (base < DMAP_MIN_ADDRESS)
 		return (EINVAL);
 
-	cache_bits_pde = cache_bits_pte = -1;
+	cache_bits_pde = pmap_cache_bits(mode, 1);
+	cache_bits_pte = pmap_cache_bits(mode, 0);
 	changed = FALSE;
 
 	/*
@@ -4493,8 +4553,6 @@
 			 * memory type, then we need not demote this page. Just
 			 * increment tmpva to the next 1GB page frame.
 			 */
-			if (cache_bits_pde < 0)
-				cache_bits_pde = pmap_cache_bits(mode, 1);
 			if ((*pdpe & PG_PDE_CACHE) == cache_bits_pde) {
 				tmpva = trunc_1gpage(tmpva) + NBPDP;
 				continue;
@@ -4522,8 +4580,6 @@
 			 * memory type, then we need not demote this page. Just
 			 * increment tmpva to the next 2MB page frame.
 			 */
-			if (cache_bits_pde < 0)
-				cache_bits_pde = pmap_cache_bits(mode, 1);
 			if ((*pde & PG_PDE_CACHE) == cache_bits_pde) {
 				tmpva = trunc_2mpage(tmpva) + NBPDR;
 				continue;
@@ -4557,12 +4613,9 @@
 	for (tmpva = base; tmpva < base + size; ) {
 		pdpe = pmap_pdpe(kernel_pmap, tmpva);
 		if (*pdpe & PG_PS) {
-			if (cache_bits_pde < 0)
-				cache_bits_pde = pmap_cache_bits(mode, 1);
 			if ((*pdpe & PG_PDE_CACHE) != cache_bits_pde) {
 				pmap_pde_attr(pdpe, cache_bits_pde);
-				if (!changed)
-					changed = TRUE;
+				changed = TRUE;
 			}
 			if (tmpva >= VM_MIN_KERNEL_ADDRESS) {
 				if (pa_start == pa_end) {
@@ -4588,12 +4641,9 @@
 		}
 		pde = pmap_pdpe_to_pde(pdpe, tmpva);
 		if (*pde & PG_PS) {
-			if (cache_bits_pde < 0)
-				cache_bits_pde = pmap_cache_bits(mode, 1);
 			if ((*pde & PG_PDE_CACHE) != cache_bits_pde) {
 				pmap_pde_attr(pde, cache_bits_pde);
-				if (!changed)
-					changed = TRUE;
+				changed = TRUE;
 			}
 			if (tmpva >= VM_MIN_KERNEL_ADDRESS) {
 				if (pa_start == pa_end) {
@@ -4616,13 +4666,10 @@
 			}
 			tmpva = trunc_2mpage(tmpva) + NBPDR;
 		} else {
-			if (cache_bits_pte < 0)
-				cache_bits_pte = pmap_cache_bits(mode, 0);
 			pte = pmap_pde_to_pte(pde, tmpva);
 			if ((*pte & PG_PTE_CACHE) != cache_bits_pte) {
 				pmap_pte_attr(pte, cache_bits_pte);
-				if (!changed)
-					changed = TRUE;
+				changed = TRUE;
 			}
 			if (tmpva >= VM_MIN_KERNEL_ADDRESS) {
 				if (pa_start == pa_end) {

==== //depot/projects/usb/src/sys/arm/arm/vm_machdep.c#11 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/vm_machdep.c,v 1.40 2009/07/20 07:53:07 raj Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/vm_machdep.c,v 1.43 2009/09/01 11:41:51 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -119,9 +119,6 @@
 #ifdef __XSCALE__
 #ifndef CPU_XSCALE_CORE3
 	pmap_use_minicache(td2->td_kstack, td2->td_kstack_pages * PAGE_SIZE);
-	if (td2->td_altkstack)
-		pmap_use_minicache(td2->td_altkstack, td2->td_altkstack_pages *
-		    PAGE_SIZE);
 #endif
 #endif
 	td2->td_pcb = pcb2;

==== //depot/projects/usb/src/sys/arm/conf/CAMBRIA#9 (text+ko) ====

@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first 
 # in NOTES.
 #
-# $FreeBSD: src/sys/arm/conf/CAMBRIA,v 1.12 2009/07/17 18:35:45 rpaulo Exp $
+# $FreeBSD: src/sys/arm/conf/CAMBRIA,v 1.14 2009/08/27 17:55:44 sam Exp $
 
 ident		CAMBRIA
 

==== //depot/projects/usb/src/sys/cam/ata/ata_all.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/ata/ata_all.c,v 1.1 2009/07/10 08:18:08 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/ata/ata_all.c,v 1.2 2009/08/30 16:31:25 mav Exp $");
 
 #include <sys/param.h>
 
@@ -91,7 +91,7 @@
 }
 
 void
-ata_36bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
+ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
     uint32_t lba, uint8_t sector_count)
 {
 	bzero(&ataio->cmd, sizeof(ataio->cmd));

==== //depot/projects/usb/src/sys/cam/ata/ata_all.h#2 (text+ko) ====

@@ -23,7 +23,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/cam/ata/ata_all.h,v 1.1 2009/07/10 08:18:08 scottl Exp $
+ * $FreeBSD: src/sys/cam/ata/ata_all.h,v 1.2 2009/08/30 16:31:25 mav Exp $
  */
 
 #ifndef	CAM_ATA_ALL_H
@@ -83,7 +83,7 @@
 int	ata_version(int ver);
 void	ata_print_ident(struct ata_params *ident_data);
 
-void	ata_36bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
+void	ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
     uint32_t lba, uint8_t sector_count);
 void	ata_48bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint16_t features,
     uint64_t lba, uint16_t sector_count);

==== //depot/projects/usb/src/sys/cam/ata/ata_da.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/ata/ata_da.c,v 1.2 2009/07/17 21:48:08 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/ata/ata_da.c,v 1.4 2009/08/30 16:31:25 mav Exp $");
 
 #include <sys/param.h>
 
@@ -287,7 +287,7 @@
 		if (softc->flags & ADA_FLAG_CAN_48BIT)
 			ata_48bit_cmd(&ccb->ataio, ATA_FLUSHCACHE48, 0, 0, 0);
 		else
-			ata_48bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0);
+			ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0);
 		cam_periph_runccb(ccb, /*error_routine*/NULL, /*cam_flags*/0,
 		    /*sense_flags*/SF_RETRY_UA,
 		    softc->disk->d_devstat);
@@ -411,7 +411,7 @@
 			ata_48bit_cmd(&ccb.ataio, ATA_WRITE_DMA48,
 			    0, lba, count);
 		} else {
-			ata_36bit_cmd(&ccb.ataio, ATA_WRITE_DMA,
+			ata_28bit_cmd(&ccb.ataio, ATA_WRITE_DMA,
 			    0, lba, count);
 		}
 		xpt_polled_action(&ccb);
@@ -441,7 +441,7 @@
 		if (softc->flags & ADA_FLAG_CAN_48BIT)
 			ata_48bit_cmd(&ccb.ataio, ATA_FLUSHCACHE48, 0, 0, 0);
 		else
-			ata_48bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0);
+			ata_28bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0);
 		xpt_polled_action(&ccb);
 
 		if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
@@ -856,10 +856,10 @@
 					}
 				} else {
 					if (bp->bio_cmd == BIO_READ) {
-						ata_36bit_cmd(ataio, ATA_READ_DMA,
+						ata_28bit_cmd(ataio, ATA_READ_DMA,
 						    0, lba, count);
 					} else {
-						ata_36bit_cmd(ataio, ATA_WRITE_DMA,
+						ata_28bit_cmd(ataio, ATA_WRITE_DMA,
 						    0, lba, count);
 					}
 				}
@@ -878,7 +878,7 @@
 				if (softc->flags & ADA_FLAG_CAN_48BIT)
 					ata_48bit_cmd(ataio, ATA_FLUSHCACHE48, 0, 0, 0);
 				else
-					ata_48bit_cmd(ataio, ATA_FLUSHCACHE, 0, 0, 0);
+					ata_28bit_cmd(ataio, ATA_FLUSHCACHE, 0, 0, 0);
 				break;
 			}
 			start_ccb->ccb_h.ccb_state = ADA_CCB_BUFFER_IO;
@@ -1126,7 +1126,7 @@
 		if (softc->flags & ADA_FLAG_CAN_48BIT)
 			ata_48bit_cmd(&ccb.ataio, ATA_FLUSHCACHE48, 0, 0, 0);
 		else
-			ata_48bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0);
+			ata_28bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0);
 		xpt_polled_action(&ccb);
 
 		if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)

==== //depot/projects/usb/src/sys/cam/ata/ata_xpt.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/ata/ata_xpt.c,v 1.4 2009/08/18 09:27:17 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/ata/ata_xpt.c,v 1.5 2009/08/30 16:31:25 mav Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -357,9 +357,9 @@
 		      /*dxfer_len*/sizeof(struct ata_params),
 		      30 * 1000);
 		if (periph->path->device->protocol == PROTO_ATA)
-			ata_36bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
+			ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
 		else
-			ata_36bit_cmd(ataio, ATA_ATAPI_IDENTIFY, 0, 0, 0);
+			ata_28bit_cmd(ataio, ATA_ATAPI_IDENTIFY, 0, 0, 0);
 		break;
 	}
 	case PROBE_SETMODE:
@@ -375,7 +375,7 @@
 		      /*data_ptr*/NULL,
 		      /*dxfer_len*/0,
 		      30 * 1000);
-		ata_36bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0,
+		ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0,
 		    ata_max_mode(ident_buf, ATA_UDMA6, ATA_UDMA6));
 		break;
 	}

==== //depot/projects/usb/src/sys/cam/cam_xpt.c#21 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.218 2009/08/18 08:46:54 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.223 2009/09/06 19:06:50 mav Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1033,11 +1033,12 @@
 	 * To ensure that this is printed in one piece,
 	 * mask out CAM interrupts.
 	 */
-	printf("%s%d at %s%d bus %d target %d lun %d\n",
+	printf("%s%d at %s%d bus %d scbus%d target %d lun %d\n",
 	       periph->periph_name, periph->unit_number,
 	       path->bus->sim->sim_name,
 	       path->bus->sim->unit_number,
 	       path->bus->sim->bus_id,
+	       path->bus->path_id,
 	       path->target->target_id,
 	       path->device->lun_id);
 	printf("%s%d: ", periph->periph_name, periph->unit_number);
@@ -2471,7 +2472,7 @@
 		path = start_ccb->ccb_h.path;
 
 		cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb);
-		if (path->device->qfrozen_cnt == 0)
+		if (path->device->ccbq.queue.qfrozen_cnt == 0)
 			runq = xpt_schedule_dev_sendq(path->bus, path->device);
 		else
 			runq = 0;
@@ -2930,7 +2931,7 @@
 			xpt_release_devq(crs->ccb_h.path, /*count*/1,
 					 /*run_queue*/TRUE);
 		}
-		start_ccb->crs.qfrozen_cnt = dev->qfrozen_cnt;
+		start_ccb->crs.qfrozen_cnt = dev->ccbq.queue.qfrozen_cnt;
 		start_ccb->ccb_h.status = CAM_REQ_CMP;
 		break;
 	}
@@ -3226,7 +3227,7 @@
 		 * If the device has been "frozen", don't attempt
 		 * to run it.
 		 */
-		if (device->qfrozen_cnt > 0) {
+		if (device->ccbq.queue.qfrozen_cnt > 0) {
 			continue;
 		}
 
@@ -3249,7 +3250,7 @@
 				 * the device queue until we have a slot
 				 * available.
 				 */
-				device->qfrozen_cnt++;
+				device->ccbq.queue.qfrozen_cnt++;
 				STAILQ_INSERT_TAIL(&xsoftc.highpowerq,
 						   &work_ccb->ccb_h,
 						   xpt_links.stqe);
@@ -3281,7 +3282,7 @@
 			 * The client wants to freeze the queue
 			 * after this CCB is sent.
 			 */
-			device->qfrozen_cnt++;
+			device->ccbq.queue.qfrozen_cnt++;
 		}
 
 		/* In Target mode, the peripheral driver knows best... */
@@ -4030,7 +4031,7 @@
 
 	mtx_assert(path->bus->sim->mtx, MA_OWNED);
 
-	path->device->qfrozen_cnt += count;
+	path->device->ccbq.queue.qfrozen_cnt += count;
 
 	/*
 	 * Mark the last CCB in the queue as needing
@@ -4048,7 +4049,7 @@
 	ccbh = TAILQ_LAST(&path->device->ccbq.active_ccbs, ccb_hdr_tailq);
 	if (ccbh && ccbh->status == CAM_REQ_INPROG)
 		ccbh->status = CAM_REQUEUE_REQ;
-	return (path->device->qfrozen_cnt);
+	return (path->device->ccbq.queue.qfrozen_cnt);
 }
 
 u_int32_t
@@ -4092,11 +4093,12 @@
 	int	rundevq;
 
 	rundevq = 0;
-	if (dev->qfrozen_cnt > 0) {
+	if (dev->ccbq.queue.qfrozen_cnt > 0) {
 
-		count = (count > dev->qfrozen_cnt) ? dev->qfrozen_cnt : count;
-		dev->qfrozen_cnt -= count;
-		if (dev->qfrozen_cnt == 0) {
+		count = (count > dev->ccbq.queue.qfrozen_cnt) ?
+		    dev->ccbq.queue.qfrozen_cnt : count;
+		dev->ccbq.queue.qfrozen_cnt -= count;
+		if (dev->ccbq.queue.qfrozen_cnt == 0) {
 
 			/*
 			 * No longer need to wait for a successful
@@ -4198,12 +4200,12 @@
 				mtx_lock(&cam_simq_lock);
 				TAILQ_INSERT_TAIL(&cam_simq, sim,
 						  links);
+				mtx_unlock(&cam_simq_lock);
 				sim->flags |= CAM_SIM_ON_DONEQ;
-				mtx_unlock(&cam_simq_lock);
+				if ((done_ccb->ccb_h.path->periph->flags &
+				    CAM_PERIPH_POLLED) == 0)
+					swi_sched(cambio_ih, 0);
 			}
-			if ((done_ccb->ccb_h.path->periph->flags &
-			    CAM_PERIPH_POLLED) == 0)
-				swi_sched(cambio_ih, 0);
 			break;
 		default:
 			panic("unknown periph type %d",
@@ -4401,15 +4403,11 @@
 		SLIST_INIT(&device->periphs);
 		device->generation = 0;
 		device->owner = NULL;
-		device->qfrozen_cnt = 0;
 		device->flags = CAM_DEV_UNCONFIGURED;
 		device->tag_delay_count = 0;
 		device->tag_saved_openings = 0;
 		device->refcount = 1;
-		if (bus->sim->flags & CAM_SIM_MPSAFE)
-			callout_init_mtx(&device->callout, bus->sim->mtx, 0);
-		else
-			callout_init_mtx(&device->callout, &Giant, 0);
+		callout_init_mtx(&device->callout, bus->sim->mtx, 0);
 
 		/*
 		 * Hold a reference to our parent target so it
@@ -4604,7 +4602,7 @@
 					      CAM_TARGET_WILDCARD,
 					      CAM_LUN_WILDCARD)) !=CAM_REQ_CMP){
 			printf("xptconfigfunc: xpt_create_path failed with "
-			       "status %#x for bus %d\n", status, bus->path_id);
+			       "status %#x for scbus%d\n", status, bus->path_id);
 			printf("xptconfigfunc: halting bus configuration\n");
 			xpt_free_ccb(work_ccb);
 			busses_to_config--;
@@ -4615,7 +4613,7 @@
 		work_ccb->ccb_h.func_code = XPT_PATH_INQ;
 		xpt_action(work_ccb);
 		if (work_ccb->ccb_h.status != CAM_REQ_CMP) {
-			printf("xptconfigfunc: CPI failed on bus %d "
+			printf("xptconfigfunc: CPI failed on scbus%d "
 			       "with status %d\n", bus->path_id,
 			       work_ccb->ccb_h.status);
 			xpt_finishconfig(xpt_periph, work_ccb);
@@ -4889,16 +4887,20 @@
 
 	mtx_lock(&cam_simq_lock);
 	TAILQ_INIT(&queue);
-	TAILQ_CONCAT(&queue, &cam_simq, links);
-	mtx_unlock(&cam_simq_lock);
+	while (!TAILQ_EMPTY(&cam_simq)) {
+		TAILQ_CONCAT(&queue, &cam_simq, links);
+		mtx_unlock(&cam_simq_lock);
 
-	while ((sim = TAILQ_FIRST(&queue)) != NULL) {
-		TAILQ_REMOVE(&queue, sim, links);
-		CAM_SIM_LOCK(sim);
-		sim->flags &= ~CAM_SIM_ON_DONEQ;
-		camisr_runqueue(&sim->sim_doneq);
-		CAM_SIM_UNLOCK(sim);
+		while ((sim = TAILQ_FIRST(&queue)) != NULL) {
+			TAILQ_REMOVE(&queue, sim, links);
+			CAM_SIM_LOCK(sim);
+			sim->flags &= ~CAM_SIM_ON_DONEQ;
+			camisr_runqueue(&sim->sim_doneq);
+			CAM_SIM_UNLOCK(sim);
+		}
+		mtx_lock(&cam_simq_lock);
 	}
+	mtx_unlock(&cam_simq_lock);
 }
 
 static void
@@ -4969,7 +4971,7 @@
 				xpt_start_tags(ccb_h->path);
 
 			if ((dev->ccbq.queue.entries > 0)
-			 && (dev->qfrozen_cnt == 0)
+			 && (dev->ccbq.queue.qfrozen_cnt == 0)
 			 && (device_is_send_queued(dev) == 0)) {
 				runq = xpt_schedule_dev_sendq(ccb_h->path->bus,
 							      dev);

==== //depot/projects/usb/src/sys/cam/cam_xpt_internal.h#2 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/cam/cam_xpt_internal.h,v 1.1 2009/07/10 08:18:08 scottl Exp $
+ * $FreeBSD: src/sys/cam/cam_xpt_internal.h,v 1.2 2009/09/06 19:06:50 mav Exp $
  */
 
 #ifndef _CAM_CAM_XPT_INTERNAL_H
@@ -106,7 +106,6 @@
 	u_int8_t	 queue_flags;	/* Queue flags from the control page */
 	u_int8_t	 serial_num_len;
 	u_int8_t	*serial_num;
-	u_int32_t	 qfrozen_cnt;
 	u_int32_t	 flags;
 #define CAM_DEV_UNCONFIGURED	 	0x01
 #define CAM_DEV_REL_TIMEOUT_PENDING	0x02

==== //depot/projects/usb/src/sys/cam/scsi/scsi_da.c#15 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.236 2009/07/10 08:18:08 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.238 2009/09/04 09:40:59 pjd Exp $");
 
 #include <sys/param.h>
 
@@ -554,6 +554,14 @@
 	{
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Netac", "OnlyDisk*",
 		 "2000"}, /*quirks*/ DA_Q_NO_SYNC_CACHE
+	},
+	{
+		/*
+		 * Sony Cyber-Shot DSC cameras
+		 * PR: usb/137035
+		 */
+		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "Sony DSC", "*"},
+		/*quirks*/ DA_Q_NO_SYNC_CACHE | DA_Q_NO_PREVENT
 	}
 };
 
@@ -1258,6 +1266,8 @@
 	softc->disk->d_flags = 0;
 	if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0)
 		softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE;
+	strlcpy(softc->disk->d_ident, cgd->serial_num,
+	    MIN(sizeof(softc->disk->d_ident), cgd->serial_num_len + 1));
 	disk_create(softc->disk, DISK_VERSION);
 	mtx_lock(periph->sim->mtx);
 

==== //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c#7 (text+ko) ====

@@ -3557,15 +3557,19 @@
 	
 #ifdef __i386__
 	if (prefetch_tunable_set == 0) {
-		printf("ZFS NOTICE: prefetch is disabled by default on i386"
-		    " - add enable to tunable to change.\n" );
+		printf("ZFS NOTICE: Prefetch is disabled by default on i386 "
+		    "-- to enable,\n");
+		printf("            add \"vfs.zfs.prefetch_disable=0\" "
+		    "to /boot/loader.conf.\n");
 		zfs_prefetch_disable=1;
 	}
 #else	
 	if ((((uint64_t)physmem * PAGESIZE) < (1ULL << 32)) &&
 	    prefetch_tunable_set == 0) {
-		printf("ZFS NOTICE: system has less than 4GB and prefetch enable is not set"
-		    "... disabling.\n");
+		printf("ZFS NOTICE: Prefetch is disabled by default if less "
+		    "than 4 GB of RAM is present;\n"
+		    "            to enable, add \"vfs.zfs.prefetch_disable=0\" "
+		    "to /boot/loader.conf.\n");
 		zfs_prefetch_disable=1;
 	}
 #endif	

==== //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c#3 (text+ko) ====

@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -864,10 +864,11 @@
 		/* currently allocated, want to be allocated */
 		dmu_tx_hold_bonus(tx, drro->drr_object);
 		/*
-		 * We may change blocksize, so need to
-		 * hold_write
+		 * We may change blocksize and delete old content,
+		 * so need to hold_write and hold_free.
 		 */
 		dmu_tx_hold_write(tx, drro->drr_object, 0, 1);
+		dmu_tx_hold_free(tx, drro->drr_object, 0, DMU_OBJECT_END);
 		err = dmu_tx_assign(tx, TXG_WAIT);
 		if (err) {
 			dmu_tx_abort(tx);

==== //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c#3 (text+ko) ====

@@ -415,7 +415,7 @@
 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
     dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
 {
-	int i, old_nblkptr;
+	int i, nblkptr;
 	dmu_buf_impl_t *db = NULL;
 
 	ASSERT3U(blocksize, >=, SPA_MINBLOCKSIZE);
@@ -445,6 +445,8 @@
 		dnode_free_range(dn, 0, -1ULL, tx);
 	}
 
+	nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT);
+
 	/* change blocksize */
 	rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 	if (blocksize != dn->dn_datablksz &&
@@ -457,6 +459,8 @@
 	dnode_setdirty(dn, tx);
 	dn->dn_next_bonuslen[tx->tx_txg&TXG_MASK] = bonuslen;
 	dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize;
+	if (dn->dn_nblkptr != nblkptr)
+		dn->dn_next_nblkptr[tx->tx_txg&TXG_MASK] = nblkptr;
 	rw_exit(&dn->dn_struct_rwlock);
 	if (db)
 		dbuf_rele(db, FTAG);
@@ -466,19 +470,15 @@
 
 	/* change bonus size and type */
 	mutex_enter(&dn->dn_mtx);
-	old_nblkptr = dn->dn_nblkptr;
 	dn->dn_bonustype = bonustype;
 	dn->dn_bonuslen = bonuslen;
-	dn->dn_nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT);
+	dn->dn_nblkptr = nblkptr;
 	dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
 	dn->dn_compress = ZIO_COMPRESS_INHERIT;
 	ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
 
-	/* XXX - for now, we can't make nblkptr smaller */
-	ASSERT3U(dn->dn_nblkptr, >=, old_nblkptr);
-
-	/* fix up the bonus db_size if dn_nblkptr has changed */
-	if (dn->dn_bonus && dn->dn_bonuslen != old_nblkptr) {
+	/* fix up the bonus db_size */
+	if (dn->dn_bonus) {
 		dn->dn_bonus->db.db_size =
 		    DN_MAX_BONUSLEN - (dn->dn_nblkptr-1) * sizeof (blkptr_t);
 		ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size);

==== //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c#3 (text+ko) ====

@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*

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



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