Module Name:    src
Committed By:   pgoyette
Date:           Wed Jul 20 23:50:56 UTC 2016

Modified Files:
        src/sys/arch/acorn32/mainbus [pgoyette-localcount]: fd.c
        src/sys/arch/alpha/alpha [pgoyette-localcount]: machdep.c
        src/sys/arch/amd64/amd64 [pgoyette-localcount]: machdep.c
        src/sys/arch/amiga/amiga [pgoyette-localcount]: machdep.c
        src/sys/arch/amiga/dev [pgoyette-localcount]: ser.c
        src/sys/arch/arm/arm32 [pgoyette-localcount]: stubs.c
        src/sys/arch/atari/atari [pgoyette-localcount]: autoconf.c machdep.c
        src/sys/arch/atari/dev [pgoyette-localcount]: md_root.c
        src/sys/arch/cesfic/cesfic [pgoyette-localcount]: machdep.c
        src/sys/arch/hp300/dev [pgoyette-localcount]: dcm.c
        src/sys/arch/hp300/hp300 [pgoyette-localcount]: machdep.c
        src/sys/arch/hppa/hppa [pgoyette-localcount]: machdep.c
        src/sys/arch/i386/i386 [pgoyette-localcount]: dumpsys.c
        src/sys/arch/luna68k/luna68k [pgoyette-localcount]: machdep.c
        src/sys/arch/mac68k/dev [pgoyette-localcount]: zs_kgdb.c
        src/sys/arch/mac68k/mac68k [pgoyette-localcount]: machdep.c
        src/sys/arch/mips/mips [pgoyette-localcount]: mips_machdep.c
        src/sys/arch/mipsco/obio [pgoyette-localcount]: zs_kgdb.c
        src/sys/arch/mvme68k/mvme68k [pgoyette-localcount]: machdep.c
        src/sys/arch/news68k/news68k [pgoyette-localcount]: machdep.c
        src/sys/arch/next68k/dev [pgoyette-localcount]: zs_kgdb.c
        src/sys/arch/next68k/next68k [pgoyette-localcount]: machdep.c
        src/sys/arch/sgimips/dev [pgoyette-localcount]: zs_kgdb.c
        src/sys/arch/sparc/dev [pgoyette-localcount]: zs_kgdb.c
        src/sys/arch/sparc/sparc [pgoyette-localcount]: machdep.c
        src/sys/arch/sparc64/sparc64 [pgoyette-localcount]: machdep.c
        src/sys/arch/sun2/dev [pgoyette-localcount]: consinit.c zs_kgdb.c
        src/sys/arch/sun2/sun2 [pgoyette-localcount]: machdep.c
        src/sys/arch/sun3/dev [pgoyette-localcount]: zs_kgdb.c
        src/sys/arch/sun3/sun3 [pgoyette-localcount]: machdep.c
        src/sys/arch/sun3/sun3x [pgoyette-localcount]: machdep.c
        src/sys/arch/vax/vax [pgoyette-localcount]: machdep.c
        src/sys/arch/x68k/x68k [pgoyette-localcount]: machdep.c
        src/sys/arch/xen/xen [pgoyette-localcount]: xbdback_xenbus.c

Log Message:
Adapt the machine/arch dependent code to the new {b,c}devsw reference
counting.

XXX Most of these will require testing by someone other than myself, as
I have a limited selection of hardware!


To generate a diff of this commit:
cvs rdiff -u -r1.58.2.2 -r1.58.2.3 src/sys/arch/acorn32/mainbus/fd.c
cvs rdiff -u -r1.346 -r1.346.4.1 src/sys/arch/alpha/alpha/machdep.c
cvs rdiff -u -r1.223 -r1.223.2.1 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.246 -r1.246.2.1 src/sys/arch/amiga/amiga/machdep.c
cvs rdiff -u -r1.83.8.1 -r1.83.8.2 src/sys/arch/amiga/dev/ser.c
cvs rdiff -u -r1.24 -r1.24.18.1 src/sys/arch/arm/arm32/stubs.c
cvs rdiff -u -r1.65 -r1.65.10.1 src/sys/arch/atari/atari/autoconf.c
cvs rdiff -u -r1.177 -r1.177.10.1 src/sys/arch/atari/atari/machdep.c
cvs rdiff -u -r1.33 -r1.33.44.1 src/sys/arch/atari/dev/md_root.c
cvs rdiff -u -r1.66 -r1.66.2.1 src/sys/arch/cesfic/cesfic/machdep.c
cvs rdiff -u -r1.88 -r1.88.4.1 src/sys/arch/hp300/dev/dcm.c
cvs rdiff -u -r1.229 -r1.229.8.1 src/sys/arch/hp300/hp300/machdep.c
cvs rdiff -u -r1.6 -r1.6.2.1 src/sys/arch/hppa/hppa/machdep.c
cvs rdiff -u -r1.16 -r1.16.28.1 src/sys/arch/i386/i386/dumpsys.c
cvs rdiff -u -r1.99 -r1.99.2.1 src/sys/arch/luna68k/luna68k/machdep.c
cvs rdiff -u -r1.11 -r1.11.68.1 src/sys/arch/mac68k/dev/zs_kgdb.c
cvs rdiff -u -r1.349 -r1.349.2.1 src/sys/arch/mac68k/mac68k/machdep.c
cvs rdiff -u -r1.272 -r1.272.2.1 src/sys/arch/mips/mips/mips_machdep.c
cvs rdiff -u -r1.10 -r1.10.44.1 src/sys/arch/mipsco/obio/zs_kgdb.c
cvs rdiff -u -r1.154 -r1.154.2.1 src/sys/arch/mvme68k/mvme68k/machdep.c
cvs rdiff -u -r1.101 -r1.101.10.1 src/sys/arch/news68k/news68k/machdep.c
cvs rdiff -u -r1.12 -r1.12.68.1 src/sys/arch/next68k/dev/zs_kgdb.c
cvs rdiff -u -r1.111 -r1.111.10.1 src/sys/arch/next68k/next68k/machdep.c
cvs rdiff -u -r1.15 -r1.15.44.1 src/sys/arch/sgimips/dev/zs_kgdb.c
cvs rdiff -u -r1.21 -r1.21.44.1 src/sys/arch/sparc/dev/zs_kgdb.c
cvs rdiff -u -r1.327 -r1.327.4.1 src/sys/arch/sparc/sparc/machdep.c
cvs rdiff -u -r1.285 -r1.285.2.1 src/sys/arch/sparc64/sparc64/machdep.c
cvs rdiff -u -r1.9 -r1.9.20.1 src/sys/arch/sun2/dev/consinit.c
cvs rdiff -u -r1.10 -r1.10.68.1 src/sys/arch/sun2/dev/zs_kgdb.c
cvs rdiff -u -r1.77 -r1.77.10.1 src/sys/arch/sun2/sun2/machdep.c
cvs rdiff -u -r1.26 -r1.26.18.1 src/sys/arch/sun3/dev/zs_kgdb.c
cvs rdiff -u -r1.208 -r1.208.10.1 src/sys/arch/sun3/sun3/machdep.c
cvs rdiff -u -r1.135 -r1.135.10.1 src/sys/arch/sun3/sun3x/machdep.c
cvs rdiff -u -r1.191 -r1.191.2.1 src/sys/arch/vax/vax/machdep.c
cvs rdiff -u -r1.193 -r1.193.2.1 src/sys/arch/x68k/x68k/machdep.c
cvs rdiff -u -r1.62 -r1.62.2.1 src/sys/arch/xen/xen/xbdback_xenbus.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/acorn32/mainbus/fd.c
diff -u src/sys/arch/acorn32/mainbus/fd.c:1.58.2.2 src/sys/arch/acorn32/mainbus/fd.c:1.58.2.3
--- src/sys/arch/acorn32/mainbus/fd.c:1.58.2.2	Wed Jul 20 02:06:15 2016
+++ src/sys/arch/acorn32/mainbus/fd.c	Wed Jul 20 23:50:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fd.c,v 1.58.2.2 2016/07/20 02:06:15 pgoyette Exp $	*/
+/*	$NetBSD: fd.c,v 1.58.2.3 2016/07/20 23:50:53 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -82,7 +82,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.58.2.2 2016/07/20 02:06:15 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.58.2.3 2016/07/20 23:50:53 pgoyette Exp $");
 
 #include "opt_ddb.h"
 
@@ -1543,18 +1543,24 @@ load_memory_disc_from_floppy(struct md_c
 	int s;
 	int type;
 	int floppysize;
+	const struct bdevsw *bdev;
 
-	if (bdevsw_lookup(dev) != &fd_bdevsw)
+	if ((bdev = bdevsw_lookup_acquire(dev)) != &fd_bdevsw) {
+		bdevsw_release(bdev);
 		return(EINVAL);
+	}
 
-	if (md->md_type == MD_UNCONFIGURED || md->md_addr == 0)
+	if (md->md_type == MD_UNCONFIGURED || md->md_addr == 0) {
+		bdevsw_release(bdev);
 		return(EBUSY);
+	}
 
 	type = FDTYPE(dev) - 1;
 	if (type < 0) type = 0;
 	floppysize = fd_types[type].size << (fd_types[type].secsize + 7);
         
 	if (md->md_size < floppysize) {
+		bdevsw_release(bdev);
 		printf("Memory disc is not big enough for floppy image\n");
 		return(EINVAL);
 	}
@@ -1575,8 +1581,9 @@ load_memory_disc_from_floppy(struct md_c
 
 	if (fdopen(bp->b_dev, 0, 0, curlwp) != 0) {
 		brelse(bp, 0);		
+		bdevsw_release(bdev);
 		printf("Cannot open floppy device\n");
-			return(EINVAL);
+		return(EINVAL);
 	}
 
 	for (loop = 0;
@@ -1606,5 +1613,6 @@ load_memory_disc_from_floppy(struct md_c
 	brelse(bp, 0);
 
 	splx(s);
+	bdevsw_release(bdev);
 	return(0);
 }

Index: src/sys/arch/alpha/alpha/machdep.c
diff -u src/sys/arch/alpha/alpha/machdep.c:1.346 src/sys/arch/alpha/alpha/machdep.c:1.346.4.1
--- src/sys/arch/alpha/alpha/machdep.c:1.346	Fri Oct 17 18:14:42 2014
+++ src/sys/arch/alpha/alpha/machdep.c	Wed Jul 20 23:50:53 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.346 2014/10/17 18:14:42 uebayasi Exp $ */
+/* $NetBSD: machdep.c,v 1.346.4.1 2016/07/20 23:50:53 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.346 2014/10/17 18:14:42 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.346.4.1 2016/07/20 23:50:53 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1116,9 +1116,9 @@ cpu_dump(void)
 	cpu_kcore_hdr_t *cpuhdrp;
 	phys_ram_seg_t *memsegp;
 	const struct bdevsw *bdev;
-	int i;
+	int i, error;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return (ENXIO);
 	dump = bdev->d_dump;
@@ -1150,7 +1150,9 @@ cpu_dump(void)
 		memsegp[i].size = mem_clusters[i].size & ~PAGE_MASK;
 	}
 
-	return (dump(dumpdev, dumplo, (void *)buf, dbtob(1)));
+	error = (dump(dumpdev, dumplo, (void *)buf, dbtob(1)));
+	bdevsw_release(bdev);
+	return error;
 }
 
 /*
@@ -1213,9 +1215,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
+		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
 		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -1224,6 +1230,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -1234,6 +1241,7 @@ dumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -1276,6 +1284,7 @@ dumpsys(void)
 	}
 
 err:
+	bdevsw_release(bdev);
 	switch (error) {
 
 	case ENXIO:

Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.223 src/sys/arch/amd64/amd64/machdep.c:1.223.2.1
--- src/sys/arch/amd64/amd64/machdep.c:1.223	Wed Jul 13 15:53:26 2016
+++ src/sys/arch/amd64/amd64/machdep.c	Wed Jul 20 23:50:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.223 2016/07/13 15:53:26 maxv Exp $	*/
+/*	$NetBSD: machdep.c,v 1.223.2.1 2016/07/20 23:50:53 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -111,7 +111,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.223 2016/07/13 15:53:26 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.223.2.1 2016/07/20 23:50:53 pgoyette Exp $");
 
 /* #define XENDEBUG_LOW  */
 
@@ -937,12 +937,13 @@ dump_header_flush(void)
 	size_t to_write;
 	int error;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	to_write = roundup(dump_headerbuf_ptr - dump_headerbuf, dbtob(1));
 	error = bdev->d_dump(dumpdev, dump_header_blkno,
 	    dump_headerbuf, to_write);
 	dump_header_blkno += btodb(to_write);
 	dump_headerbuf_ptr = dump_headerbuf;
+	bdevsw_release(bdev);
 	return error;
 }
 
@@ -1031,8 +1032,9 @@ cpu_dump(void)
 	kcore_seg_t seg;
 	cpu_kcore_hdr_t cpuhdr;
 	const struct bdevsw *bdev;
+	int err;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return (ENXIO);
 
@@ -1053,7 +1055,9 @@ cpu_dump(void)
 	/*
 	 * Write out the memory segment descriptors.
 	 */
-	return dump_seg_iter(dump_header_addseg);
+	err = dump_seg_iter(dump_header_addseg);
+	bdevsw_release(bdev);
+	return err;
 }
 
 /*
@@ -1083,7 +1087,7 @@ dumpsys_seg(paddr_t maddr, paddr_t bytes
 
 	if (dumpdev == NODEV)
 		return ENODEV;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL || bdev->d_psize == NULL)
 		return ENODEV;
 
@@ -1108,19 +1112,24 @@ dumpsys_seg(paddr_t maddr, paddr_t bytes
 
 		error = (*dump)(dumpdev, blkno, (void *)dumpspace, n);
 		pmap_kremove_local(dumpspace, n);
-		if (error)
+		if (error) {
+			bdevsw_release(bdev);
 			return error;
+		}
 		maddr += n;
 		blkno += btodb(n);		/* XXX? */
 
 #if 0	/* XXX this doesn't work.  grr. */
 		/* operator aborting dump? */
-		if (sget() != NULL)
+		if (sget() != NULL) {
+			bdevsw_release(bdev);
 			return EINTR;
+		}
 #endif
 	}
 	dump_header_blkno = blkno;
 
+	bdevsw_release(bdev);
 	return 0;
 }
 
@@ -1134,9 +1143,13 @@ dodumpsys(void)
 	if (dumpdev == NODEV)
 		return;
 
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
+		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
 		return;
+	}
 	/*
 	 * For dumps during autoconfiguration,
 	 * if dump device has already configured...
@@ -1149,6 +1162,7 @@ dodumpsys(void)
 	    (unsigned long long)minor(dumpdev), dumplo, dumpsize);
 
 	if (dumplo <= 0 || dumpsize <= 0) {
+		bdevsw_release(bdev);
 		printf(" not possible\n");
 		return;
 	}
@@ -1156,6 +1170,7 @@ dodumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("\ndump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -1228,6 +1243,7 @@ err:
 		break;
 	}
 failed:
+	bdevsw_release(bdev);
 	printf("\n\n");
 	delay(5000000);		/* 5 seconds */
 }

Index: src/sys/arch/amiga/amiga/machdep.c
diff -u src/sys/arch/amiga/amiga/machdep.c:1.246 src/sys/arch/amiga/amiga/machdep.c:1.246.2.1
--- src/sys/arch/amiga/amiga/machdep.c:1.246	Sat Apr  2 08:16:54 2016
+++ src/sys/arch/amiga/amiga/machdep.c	Wed Jul 20 23:50:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.246 2016/04/02 08:16:54 mlelstv Exp $	*/
+/*	$NetBSD: machdep.c,v 1.246.2.1 2016/07/20 23:50:53 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -50,7 +50,7 @@
 #include "empm.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.246 2016/04/02 08:16:54 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.246.2.1 2016/07/20 23:50:53 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -467,6 +467,7 @@ cpu_dumpconf(void)
 	int nblks;
 	int i;
 	extern int end[];
+	const struct bdevsw *bdev;
 
 	memset(&cpu_kcore_hdr, 0, sizeof(cpu_kcore_hdr));
 
@@ -524,7 +525,7 @@ cpu_dumpconf(void)
 		m->ram_segs[1].size  = memlist->m_seg[i].ms_size;
 		break;
 	}
-	if (bdevsw_lookup(dumpdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(dumpdev)) == NULL) {
 		dumpdev = NODEV;
 		return;
 	}
@@ -542,6 +543,7 @@ cpu_dumpconf(void)
 	 */
 	if (dumplo < btodb(PAGE_SIZE))
 		dumplo = btodb(PAGE_SIZE);
+	bdevsw_release(bdev);
 }
 
 /*
@@ -574,9 +576,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
+		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
 		return;
+	}
 	/*
 	 * For dumps during autoconfiguration,
 	 * if dump device has already configured...
@@ -584,6 +590,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n", major(dumpdev),
 		    minor(dumpdev));
 		return;
@@ -594,6 +601,7 @@ dumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable.\n");
 		return;
 	}
@@ -651,6 +659,7 @@ dumpsys(void)
 		}
 	}
 
+	bdevsw_release(bdev);
 	switch (error) {
 
 	case ENXIO:

Index: src/sys/arch/amiga/dev/ser.c
diff -u src/sys/arch/amiga/dev/ser.c:1.83.8.1 src/sys/arch/amiga/dev/ser.c:1.83.8.2
--- src/sys/arch/amiga/dev/ser.c:1.83.8.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/ser.c	Wed Jul 20 23:50:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ser.c,v 1.83.8.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: ser.c,v 1.83.8.2 2016/07/20 23:50:53 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
@@ -40,7 +40,7 @@
 #include "opt_kgdb.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ser.c,v 1.83.8.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ser.c,v 1.83.8.2 2016/07/20 23:50:53 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1078,6 +1078,7 @@ sercnprobe(struct consdev *cp)
 	int maj, unit;
 #ifdef KGDB
 	extern const struct cdevsw ctty_cdevsw;
+	const struct cdevsw *cdev;
 #endif
 
 	/* locate the major number */
@@ -1096,8 +1097,11 @@ sercnprobe(struct consdev *cp)
 		cp->cn_pri = CN_NORMAL;
 #ifdef KGDB
 	/* XXX */
-	if (cdevsw_lookup(kgdb_dev) == &ctty_cdevsw)
+	cdev = cdevsw_lookup_acquire(kgdb_dev);
+	if (cdev == &ctty_cdevsw)
 		kgdb_dev = makedev(maj, minor(kgdb_dev));
+	if (cdev != NULL)
+		cdevsw_release(cdev);
 #endif
 }
 

Index: src/sys/arch/arm/arm32/stubs.c
diff -u src/sys/arch/arm/arm32/stubs.c:1.24 src/sys/arch/arm/arm32/stubs.c:1.24.18.1
--- src/sys/arch/arm/arm32/stubs.c:1.24	Mon Nov 12 18:00:35 2012
+++ src/sys/arch/arm/arm32/stubs.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: stubs.c,v 1.24 2012/11/12 18:00:35 skrll Exp $	*/
+/*	$NetBSD: stubs.c,v 1.24.18.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: stubs.c,v 1.24 2012/11/12 18:00:35 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: stubs.c,v 1.24.18.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -126,9 +126,9 @@ cpu_dump(void)
 	cpu_kcore_hdr_t *cpuhdrp;
 	phys_ram_seg_t *memsegp;
 	const struct bdevsw *bdev;
-	int i;
+	int i, err;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return (ENXIO);
 	dump = bdev->d_dump;
@@ -162,7 +162,9 @@ cpu_dump(void)
 		memsegp[i].size = bootconfig.dram[i].pages * PAGE_SIZE;
 	}
 
-	return (dump(dumpdev, dumplo, bf, dbtob(1)));
+	err = (dump(dumpdev, dumplo, bf, dbtob(1)));
+	bdevsw_release(bdev);
+	return err;
 }
 
 /*
@@ -238,13 +240,17 @@ dodumpsys(void)
 	printf("\ndumping to dev %u,%u offset %ld\n",
 	    major(dumpdev), minor(dumpdev), dumplo);
 
-
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
 		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
+		return;
+	}
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -276,6 +282,7 @@ dodumpsys(void)
 		}
 	}
 err:
+	bdevsw_release(bdev);
 	switch (error) {
 	case ENXIO:
 		printf("device bad\n");

Index: src/sys/arch/atari/atari/autoconf.c
diff -u src/sys/arch/atari/atari/autoconf.c:1.65 src/sys/arch/atari/atari/autoconf.c:1.65.10.1
--- src/sys/arch/atari/atari/autoconf.c:1.65	Mon Mar 24 18:39:57 2014
+++ src/sys/arch/atari/atari/autoconf.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.65 2014/03/24 18:39:57 christos Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.65.10.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.65 2014/03/24 18:39:57 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.65.10.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_md.h"
 
@@ -256,25 +256,31 @@ findroot(void)
 			maj = devsw_name2blk(genericconf[i]->cd_name, NULL, 0);
 			if (maj == -1)
 				continue;
-			bdev = bdevsw_lookup(makedev(maj, 0));
+			bdev = bdevsw_lookup_acquire(makedev(maj, 0));
+			if (bdev == NULL) {
 #ifdef DIAGNOSTIC
-			if (bdev == NULL)
 				panic("findroot: impossible");
 #endif
-			if (bdev == NULL ||
-			    bdev->d_strategy != dkp->dk_driver->d_strategy)
 				continue;
+			}
+			if (bdev->d_strategy != dkp->dk_driver->d_strategy) {
+				bdevsw_release(bdev);
+				continue;
+			}
 
 			/* Open disk; forces read of disklabel. */
 			if ((*bdev->d_open)(MAKEDISKDEV(maj,
-			    unit, 0), FREAD|FNONBLOCK, 0, &lwp0))
+			    unit, 0), FREAD|FNONBLOCK, 0, &lwp0)) {
+				bdevsw_release(bdev);
 				continue;
+			}
 			(void)(*bdev->d_close)(MAKEDISKDEV(maj,
 			    unit, 0), FREAD|FNONBLOCK, 0, &lwp0);
 			
 			pp = &dkp->dk_label->d_partitions[booted_partition];
 			if (pp->p_size != 0 && pp->p_fstype == FS_BSDFFS) {
 				booted_device = devs[unit];
+				bdevsw_release(bdev);
 				return;
 			}
 		}

Index: src/sys/arch/atari/atari/machdep.c
diff -u src/sys/arch/atari/atari/machdep.c:1.177 src/sys/arch/atari/atari/machdep.c:1.177.10.1
--- src/sys/arch/atari/atari/machdep.c:1.177	Wed Mar 26 18:04:33 2014
+++ src/sys/arch/atari/atari/machdep.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.177 2014/03/26 18:04:33 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.177.10.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.177 2014/03/26 18:04:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.177.10.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -434,7 +434,7 @@ dumpsys(void)
 	error = segnum = 0;
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	/*
@@ -457,6 +457,7 @@ dumpsys(void)
 	switch (i) {
 	case 'n':
 	case 'N':
+		bdevsw_release(bdev);
 		return;
 	case '\n':
 		break;
@@ -514,6 +515,8 @@ dumpsys(void)
 			blkno += btodb(n);
 		}
 	}
+	bdevsw_release(bdev);
+
 	switch (error) {
 
 	case ENXIO:

Index: src/sys/arch/atari/dev/md_root.c
diff -u src/sys/arch/atari/dev/md_root.c:1.33 src/sys/arch/atari/dev/md_root.c:1.33.44.1
--- src/sys/arch/atari/dev/md_root.c:1.33	Tue Oct 20 19:10:10 2009
+++ src/sys/arch/atari/dev/md_root.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: md_root.c,v 1.33 2009/10/20 19:10:10 snj Exp $	*/
+/*	$NetBSD: md_root.c,v 1.33.44.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1996 Leo Weppelman.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: md_root.c,v 1.33 2009/10/20 19:10:10 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: md_root.c,v 1.33.44.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -152,7 +152,7 @@ loaddisk(struct md_conf *md, dev_t ld_de
 	struct disklabel	dl;
 	struct read_info	rs;
 
-	bdp = bdevsw_lookup(ld_dev);
+	bdp = bdevsw_lookup_acquire(ld_dev);
 	if (bdp == NULL)
 		return ENXIO;
 
@@ -182,6 +182,7 @@ loaddisk(struct md_conf *md, dev_t ld_de
 	 */
 	if ((error = bdp->d_open(ld_dev, FREAD | FNONBLOCK, 0, lwp)) != 0) {
 		putiobuf(buf);
+		bdevsw_release(bdp);
 		return error;
 	}
 	if (bdp->d_ioctl(ld_dev, DIOCGDINFO, (void *)&dl, FREAD, lwp) == 0) {
@@ -199,6 +200,7 @@ loaddisk(struct md_conf *md, dev_t ld_de
 
 	bdp->d_close(ld_dev, FREAD | FNONBLOCK, 0, lwp);
 	putiobuf(buf);
+	bdevsw_release(bdp);
 	return error;
 }
 

Index: src/sys/arch/cesfic/cesfic/machdep.c
diff -u src/sys/arch/cesfic/cesfic/machdep.c:1.66 src/sys/arch/cesfic/cesfic/machdep.c:1.66.2.1
--- src/sys/arch/cesfic/cesfic/machdep.c:1.66	Thu Nov  5 03:48:51 2015
+++ src/sys/arch/cesfic/cesfic/machdep.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.66 2015/11/05 03:48:51 pgoyette Exp $	*/
+/*	$NetBSD: machdep.c,v 1.66.2.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.66 2015/11/05 03:48:51 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.66.2.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_bufcache.h"
 #include "opt_ddb.h"
@@ -417,16 +417,20 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
-	if (dumplo < 0)
+	if (dumplo < 0) {
+		bdevsw_release(bdev);
 		return;
+	}
 	dump = bdev->d_dump;
 	blkno = dumplo;
 
@@ -453,29 +457,34 @@ dumpsys(void)
 
 		case ENXIO:
 			printf("device bad\n");
-			return;
+			break;
 
 		case EFAULT:
 			printf("device not ready\n");
-			return;
+			break;
 
 		case EINVAL:
 			printf("area improper\n");
-			return;
+			break;
 
 		case EIO:
 			printf("i/o error\n");
-			return;
+			break;
 
 		case EINTR:
 			printf("aborted from console\n");
-			return;
+			break;
 
 		default:
 			printf("error %d\n", error);
+			break;
+		}
+		if (error != 0) {
+			bdevsw_release(bdev);
 			return;
 		}
 	}
+	bdevsw_release(bdev);
 	printf("succeeded\n");
 }
 

Index: src/sys/arch/hp300/dev/dcm.c
diff -u src/sys/arch/hp300/dev/dcm.c:1.88 src/sys/arch/hp300/dev/dcm.c:1.88.4.1
--- src/sys/arch/hp300/dev/dcm.c:1.88	Sat Nov 15 19:20:01 2014
+++ src/sys/arch/hp300/dev/dcm.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: dcm.c,v 1.88 2014/11/15 19:20:01 christos Exp $	*/
+/*	$NetBSD: dcm.c,v 1.88.4.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dcm.c,v 1.88 2014/11/15 19:20:01 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dcm.c,v 1.88.4.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_kgdb.h"
 
@@ -368,6 +368,9 @@ dcmattach(device_t parent, device_t self
 	int brd = device_unit(self);
 	int scode = da->da_scode;
 	int i, mbits, code;
+#ifdef KGDB
+	const struct cdevsw *cdev;
+#endif
 
 	sc->sc_dev = self;
 	sc->sc_flags = 0;
@@ -460,7 +463,7 @@ dcmattach(device_t parent, device_t self
 		aprint_normal("\n");
 
 #ifdef KGDB
-	if (cdevsw_lookup(kgdb_dev) == &dcm_cdevsw &&
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) == &dcm_cdevsw &&
 	    DCMBOARD(DCMUNIT(kgdb_dev)) == brd) {
 		if (dcmconsole == DCMUNIT(kgdb_dev))	/* XXX fixme */
 			kgdb_dev = NODEV; /* can't debug over console port */
@@ -484,6 +487,7 @@ dcmattach(device_t parent, device_t self
 		/* end could be replaced */
 #endif /* KGDB_CHEAT */
 	}
+	cdevsw_release(cdev);
 #endif /* KGDB */
 }
 

Index: src/sys/arch/hp300/hp300/machdep.c
diff -u src/sys/arch/hp300/hp300/machdep.c:1.229 src/sys/arch/hp300/hp300/machdep.c:1.229.8.1
--- src/sys/arch/hp300/hp300/machdep.c:1.229	Sun Apr 20 04:12:54 2014
+++ src/sys/arch/hp300/hp300/machdep.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.229 2014/04/20 04:12:54 tsutsui Exp $	*/
+/*	$NetBSD: machdep.c,v 1.229.8.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.229 2014/04/20 04:12:54 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.229.8.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -792,15 +792,18 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -838,29 +841,34 @@ dumpsys(void)
 
 		case ENXIO:
 			printf("device bad\n");
-			return;
+			break;
 
 		case EFAULT:
 			printf("device not ready\n");
-			return;
+			break;
 
 		case EINVAL:
 			printf("area improper\n");
-			return;
+			break;
 
 		case EIO:
 			printf("i/o error\n");
-			return;
+			break;
 
 		case EINTR:
 			printf("aborted from console\n");
-			return;
+			break;
 
 		default:
 			printf("error %d\n", error);
+			break;
+		}
+		if (error != 0) {
+			bdevsw_release(bdev);
 			return;
 		}
 	}
+	bdevsw_release(bdev);
 	printf("succeeded\n");
 }
 

Index: src/sys/arch/hppa/hppa/machdep.c
diff -u src/sys/arch/hppa/hppa/machdep.c:1.6 src/sys/arch/hppa/hppa/machdep.c:1.6.2.1
--- src/sys/arch/hppa/hppa/machdep.c:1.6	Sun Oct 18 17:13:33 2015
+++ src/sys/arch/hppa/hppa/machdep.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.6 2015/10/18 17:13:33 maxv Exp $	*/
+/*	$NetBSD: machdep.c,v 1.6.2.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.6 2015/10/18 17:13:33 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.6.2.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -1762,6 +1762,7 @@ cpu_dump(void)
 	kcore_seg_t	*segp;
 	cpu_kcore_hdr_t	*cpuhdrp __unused;
 	const struct bdevsw *bdev;
+	int err;
 
 	segp = (kcore_seg_t *)buf;
 	cpuhdrp = (cpu_kcore_hdr_t *)&buf[ALIGN(sizeof(*segp)) / sizeof (long)];
@@ -1777,11 +1778,13 @@ cpu_dump(void)
 	 */
 	/* nothing for now */
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return (-1);
 
-	return (*bdev->d_dump)(dumpdev, dumplo, (void *)buf, dbtob(1));
+	err = (*bdev->d_dump)(dumpdev, dumplo, (void *)buf, dbtob(1));
+	bdevsw_release(bdev);
+	return err;
 }
 
 /*
@@ -1801,7 +1804,7 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 
@@ -1811,6 +1814,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -1821,6 +1825,7 @@ dumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -1861,6 +1866,7 @@ dumpsys(void)
 	case 0:		printf("succeeded\n");			break;
 	default:	printf("error %d\n", error);		break;
 	}
+	bdevsw_release(bdev);
 }
 
 void

Index: src/sys/arch/i386/i386/dumpsys.c
diff -u src/sys/arch/i386/i386/dumpsys.c:1.16 src/sys/arch/i386/i386/dumpsys.c:1.16.28.1
--- src/sys/arch/i386/i386/dumpsys.c:1.16	Mon Dec 12 19:03:09 2011
+++ src/sys/arch/i386/i386/dumpsys.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: dumpsys.c,v 1.16 2011/12/12 19:03:09 mrg Exp $	*/
+/*	$NetBSD: dumpsys.c,v 1.16.28.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dumpsys.c,v 1.16 2011/12/12 19:03:09 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dumpsys.c,v 1.16.28.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -157,9 +157,13 @@ dodumpsys(void)
 	if (dumpdev == NODEV)
 		return;
 
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
+		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
 		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -168,6 +172,7 @@ dodumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0 || dumpsize == 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %llu,%llu not possible\n",
 		    (unsigned long long)major(dumpdev),
 		    (unsigned long long)minor(dumpdev));
@@ -180,6 +185,7 @@ dodumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -252,6 +258,7 @@ dodumpsys(void)
 		break;
 	}
 failed:
+	bdevsw_release(bdev);
 	printf("\n\n");
 	delay(5000000);		/* 5 seconds */
 }
@@ -516,12 +523,13 @@ dump_header_flush(void)
 	size_t to_write;
 	int error;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	to_write = roundup(dump_headerbuf_ptr - dump_headerbuf, dbtob(1));
 	error = bdev->d_dump(dumpdev, dump_header_blkno,
 	    dump_headerbuf, to_write);
 	dump_header_blkno += btodb(to_write);
 	dump_headerbuf_ptr = dump_headerbuf;
+	bdevsw_release(bdev);
 	return error;
 }
 
@@ -603,8 +611,9 @@ cpu_dump(void)
 	kcore_seg_t seg;
 	cpu_kcore_hdr_t cpuhdr;
 	const struct bdevsw *bdev;
+	int err;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return (ENXIO);
 
@@ -627,7 +636,9 @@ cpu_dump(void)
 	/*
 	 * Write out the memory segment descriptors.
 	 */
-	return dump_seg_iter(dump_header_addseg);
+	err = dump_seg_iter(dump_header_addseg);
+	bdevsw_release(bdev);
+	return err;
 }
 
 static int
@@ -639,7 +650,7 @@ dumpsys_seg(paddr_t maddr, paddr_t bytes
 	int (*dump)(dev_t, daddr_t, void *, size_t);
 	int error;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	dump = bdev->d_dump;
 
 	blkno = dump_header_blkno;
@@ -660,18 +671,23 @@ dumpsys_seg(paddr_t maddr, paddr_t bytes
 		pmap_update(pmap_kernel());
 
 		error = (*dump)(dumpdev, blkno, (void *)dumpspace, n);
-		if (error)
+		if (error) {
+			bdevsw_release(bdev);
 			return error;
+		}
 		maddr += n;
 		blkno += btodb(n);		/* XXX? */
 
 #if 0	/* XXX this doesn't work.  grr. */
 		/* operator aborting dump? */
-		if (sget() != NULL)
+		if (sget() != NULL) {
+			bdevsw_release(bdev);
 			return EINTR;
+		}
 #endif
 	}
 	dump_header_blkno = blkno;
 
+	bdevsw_release(bdev);
 	return 0;
 }

Index: src/sys/arch/luna68k/luna68k/machdep.c
diff -u src/sys/arch/luna68k/luna68k/machdep.c:1.99 src/sys/arch/luna68k/luna68k/machdep.c:1.99.2.1
--- src/sys/arch/luna68k/luna68k/machdep.c:1.99	Fri Aug 21 10:48:06 2015
+++ src/sys/arch/luna68k/luna68k/machdep.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.99 2015/08/21 10:48:06 christos Exp $ */
+/* $NetBSD: machdep.c,v 1.99.2.1 2016/07/20 23:50:54 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.99 2015/08/21 10:48:06 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.99.2.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -656,15 +656,18 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u  not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -702,29 +705,36 @@ dumpsys(void)
 
 		case ENXIO:
 			printf("device bad\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EFAULT:
 			printf("device not ready\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EINVAL:
 			printf("area improper\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EIO:
 			printf("i/o error\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EINTR:
 			printf("aborted from console\n");
+			bdevsw_release(bdev);
 			return;
 
 		default:
 			printf("error %d\n", error);
+			bdevsw_release(bdev);
 			return;
 		}
 	}
+	bdevsw_release(bdev);
 	printf("succeeded\n");
 }
 

Index: src/sys/arch/mac68k/dev/zs_kgdb.c
diff -u src/sys/arch/mac68k/dev/zs_kgdb.c:1.11 src/sys/arch/mac68k/dev/zs_kgdb.c:1.11.68.1
--- src/sys/arch/mac68k/dev/zs_kgdb.c:1.11	Mon Apr 28 20:23:27 2008
+++ src/sys/arch/mac68k/dev/zs_kgdb.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.11 2008/04/28 20:23:27 martin Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.11.68.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.11 2008/04/28 20:23:27 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.11.68.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_kgdb.h"
 #include <sys/param.h>
@@ -141,10 +141,14 @@ zs_kgdb_init(void)
 	volatile struct zschan *zc;
 	int channel;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
 	/* printf("zs_kgdb_init: kgdb_dev=0x%x\n", kgdb_dev); */
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	/* Note: (ttya,ttyb) on zsc1, and (ttyc,ttyd) on zsc0 */
 	channel = kgdb_dev & 1;
@@ -160,6 +164,7 @@ zs_kgdb_init(void)
 	if (zc == NULL) {
 		printf("zs_kgdb_init: zs not mapped.\n");
 		kgdb_dev = -1;
+		cdevsw_release(cdev);
 		return;
 	}
 
@@ -173,6 +178,7 @@ zs_kgdb_init(void)
 
 	/* Store the getc/putc functions and arg. */
 	kgdb_attach(zs_getc, zs_putc, __UNVOLATILE(zc));
+	cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/mac68k/mac68k/machdep.c
diff -u src/sys/arch/mac68k/mac68k/machdep.c:1.349 src/sys/arch/mac68k/mac68k/machdep.c:1.349.2.1
--- src/sys/arch/mac68k/mac68k/machdep.c:1.349	Sun Aug 30 01:46:03 2015
+++ src/sys/arch/mac68k/mac68k/machdep.c	Wed Jul 20 23:50:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.349 2015/08/30 01:46:03 uebayasi Exp $	*/
+/*	$NetBSD: machdep.c,v 1.349.2.1 2016/07/20 23:50:54 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.349 2015/08/30 01:46:03 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.349.2.1 2016/07/20 23:50:54 pgoyette Exp $");
 
 #include "opt_adb.h"
 #include "opt_copy_symtab.h"
@@ -687,15 +687,18 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -742,29 +745,36 @@ dumpsys(void)
 
 		case ENXIO:
 			printf("device bad\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EFAULT:
 			printf("device not ready\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EINVAL:
 			printf("area improper\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EIO:
 			printf("i/o error\n");
+			bdevsw_release(bdev);
 			return;
 
 		case EINTR:
 			printf("aborted from console\n");
+			bdevsw_release(bdev);
 			return;
 
 		default:
 			printf("error %d\n", error);
+			bdevsw_release(bdev);
 			return;
 		}
 	}
+	bdevsw_release(bdev);
 	printf("succeeded\n");
 }
 

Index: src/sys/arch/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.272 src/sys/arch/mips/mips/mips_machdep.c:1.272.2.1
--- src/sys/arch/mips/mips/mips_machdep.c:1.272	Mon Jul 11 18:56:41 2016
+++ src/sys/arch/mips/mips/mips_machdep.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: mips_machdep.c,v 1.272 2016/07/11 18:56:41 skrll Exp $	*/
+/*	$NetBSD: mips_machdep.c,v 1.272.2.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -111,7 +111,7 @@
  */
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.272 2016/07/11 18:56:41 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.272.2.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #define __INTR_PRIVATE
 #include "opt_cputype.h"
@@ -1791,9 +1791,9 @@ cpu_dump(void)
 	cpu_kcore_hdr_t *cpuhdrp;
 	phys_ram_seg_t *memsegp;
 	const struct bdevsw *bdev;
-	int i;
+	int i, err;
 
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return (ENXIO);
 
@@ -1836,7 +1836,9 @@ cpu_dump(void)
 		memsegp[i].size = mem_clusters[i].size;
 	}
 
-	return (dump(dumpdev, dumplo, (void *)buf, dbtob(1)));
+	err = (dump(dumpdev, dumplo, (void *)buf, dbtob(1)));
+	bdevsw_release(bdev);
+	return err;
 }
 
 /*
@@ -1900,9 +1902,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
+		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
 		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -1911,6 +1917,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n", major(dumpdev),
 		    minor(dumpdev));
 		return;
@@ -1921,6 +1928,7 @@ dumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -1998,6 +2006,7 @@ dumpsys(void)
 		printf("error %d\n", error);
 		break;
 	}
+	bdevsw_release(bdev);
 	printf("\n\n");
 	delay(5000000);		/* 5 seconds */
 }

Index: src/sys/arch/mipsco/obio/zs_kgdb.c
diff -u src/sys/arch/mipsco/obio/zs_kgdb.c:1.10 src/sys/arch/mipsco/obio/zs_kgdb.c:1.10.44.1
--- src/sys/arch/mipsco/obio/zs_kgdb.c:1.10	Wed Mar 18 10:22:32 2009
+++ src/sys/arch/mipsco/obio/zs_kgdb.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.10 2009/03/18 10:22:32 cegger Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.10.44.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.10 2009/03/18 10:22:32 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.10.44.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -130,9 +130,13 @@ zs_kgdb_init(void)
 	struct zschan *zc;
 	int channel, unit;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	unit = (kgdb_dev & 2) ? 2 : 0;
 	channel = kgdb_dev & 1;
@@ -143,6 +147,8 @@ zs_kgdb_init(void)
 
 	/* Attach KGDB comms functions to this device */
 	kgdb_attach(zs_getc, zs_putc, (void *)zc);
+	if (cdev != NULL)
+		cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/mvme68k/mvme68k/machdep.c
diff -u src/sys/arch/mvme68k/mvme68k/machdep.c:1.154 src/sys/arch/mvme68k/mvme68k/machdep.c:1.154.2.1
--- src/sys/arch/mvme68k/mvme68k/machdep.c:1.154	Tue May 31 03:25:46 2016
+++ src/sys/arch/mvme68k/mvme68k/machdep.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.154 2016/05/31 03:25:46 dholland Exp $	*/
+/*	$NetBSD: machdep.c,v 1.154.2.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.154 2016/05/31 03:25:46 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.154.2.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_m060sp.h"
@@ -856,9 +856,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
 		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
+		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -867,6 +871,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -877,6 +882,7 @@ dumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -950,6 +956,7 @@ dumpsys(void)
 		printf("error %d\n", error);
 		break;
 	}
+	bdevsw_release(bdev);
 	printf("\n\n");
 	delay(5000);
 }

Index: src/sys/arch/news68k/news68k/machdep.c
diff -u src/sys/arch/news68k/news68k/machdep.c:1.101 src/sys/arch/news68k/news68k/machdep.c:1.101.10.1
--- src/sys/arch/news68k/news68k/machdep.c:1.101	Mon Mar 24 19:54:28 2014
+++ src/sys/arch/news68k/news68k/machdep.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.101 2014/03/24 19:54:28 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.101.10.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.101 2014/03/24 19:54:28 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.101.10.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -509,15 +509,18 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -554,30 +557,37 @@ dumpsys(void)
 			break;
 
 		case ENXIO:
+			bdevsw_release(bdev);
 			printf("device bad\n");
-				return;
+			return;
 
 		case EFAULT:
+			bdevsw_release(bdev);
 			printf("device not ready\n");
 			return;
 
 		case EINVAL:
+			bdevsw_release(bdev);
 			printf("area improper\n");
 			return;
 
 		case EIO:
+			bdevsw_release(bdev);
 			printf("i/o error\n");
 			return;
 
 		case EINTR:
+			bdevsw_release(bdev);
 			printf("aborted from console\n");
 			return;
 
 		default:
+			bdevsw_release(bdev);
 			printf("error %d\n", error);
 			return;
 		}
 	}
+	bdevsw_release(bdev);
 	printf("succeeded\n");
 }
 

Index: src/sys/arch/next68k/dev/zs_kgdb.c
diff -u src/sys/arch/next68k/dev/zs_kgdb.c:1.12 src/sys/arch/next68k/dev/zs_kgdb.c:1.12.68.1
--- src/sys/arch/next68k/dev/zs_kgdb.c:1.12	Mon Apr 28 20:23:30 2008
+++ src/sys/arch/next68k/dev/zs_kgdb.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.12 2008/04/28 20:23:30 martin Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.12.68.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.12 2008/04/28 20:23:30 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.12.68.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_kgdb.h"
 
@@ -133,10 +133,14 @@ zs_kgdb_init(void)
 	volatile struct zschan *zc;
 	int channel;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
 	printf("zs_kgdb_init: kgdb_dev=0x%x\n", kgdb_dev);
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	/* Note: (ttya,ttyb) on zs0, and (ttyc,ttyd) on zs2 */
 	channel  =  kgdb_dev & 1;
@@ -150,6 +154,7 @@ zs_kgdb_init(void)
 	if (zc == NULL) {
 		printf("zs_kgdb_init: zs not mapped.\n");
 		kgdb_dev = -1;
+		cdevsw_release(cdev);
 		return;
 	}
 
@@ -163,6 +168,7 @@ zs_kgdb_init(void)
 
 	/* Store the getc/putc functions and arg. */
 	kgdb_attach(zs_getc, zs_putc, __UNVOLATILE(zc));
+	cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/next68k/next68k/machdep.c
diff -u src/sys/arch/next68k/next68k/machdep.c:1.111 src/sys/arch/next68k/next68k/machdep.c:1.111.10.1
--- src/sys/arch/next68k/next68k/machdep.c:1.111	Mon Mar 24 20:01:03 2014
+++ src/sys/arch/next68k/next68k/machdep.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.111 2014/03/24 20:01:03 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.111.10.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1998 Darrin B. Jewell
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.111 2014/03/24 20:01:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.111.10.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -660,13 +660,15 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
 	if (dumplo < 0)
 		return;
@@ -701,30 +703,37 @@ dumpsys(void)
 			break;
 
 		case ENXIO:
+			bdevsw_release(bdev);
 			printf("device bad\n");
 			return;
 
 		case EFAULT:
+			bdevsw_release(bdev);
 			printf("device not ready\n");
 			return;
 
 		case EINVAL:
+			bdevsw_release(bdev);
 			printf("area improper\n");
 			return;
 
 		case EIO:
+			bdevsw_release(bdev);
 			printf("i/o error\n");
 			return;
 
 		case EINTR:
+			bdevsw_release(bdev);
 			printf("aborted from console\n");
 			return;
 
 		default:
+			bdevsw_release(bdev);
 			printf("error %d\n", error);
 			return;
 		}
 	}
+	bdevsw_release(bdev);
 	printf("succeeded\n");
 }
 

Index: src/sys/arch/sgimips/dev/zs_kgdb.c
diff -u src/sys/arch/sgimips/dev/zs_kgdb.c:1.15 src/sys/arch/sgimips/dev/zs_kgdb.c:1.15.44.1
--- src/sys/arch/sgimips/dev/zs_kgdb.c:1.15	Wed Mar 18 10:22:35 2009
+++ src/sys/arch/sgimips/dev/zs_kgdb.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.15 2009/03/18 10:22:35 cegger Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.15.44.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.15 2009/03/18 10:22:35 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.15.44.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -130,9 +130,13 @@ zs_kgdb_init(void)
 	volatile struct zschan *zc;
 	int channel, unit;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	unit = (kgdb_dev & 2) ? 1 : 0;	/* XXX ??? */
 	channel = kgdb_dev & 1;
@@ -143,6 +147,7 @@ zs_kgdb_init(void)
 
 	/* Attach KGDB comms functions to this device */
 	kgdb_attach(zs_getc, zs_putc, __UNVOLATILE(zc));
+	cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/sparc/dev/zs_kgdb.c
diff -u src/sys/arch/sparc/dev/zs_kgdb.c:1.21 src/sys/arch/sparc/dev/zs_kgdb.c:1.21.44.1
--- src/sys/arch/sparc/dev/zs_kgdb.c:1.21	Sat May 16 16:55:24 2009
+++ src/sys/arch/sparc/dev/zs_kgdb.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.21 2009/05/16 16:55:24 cegger Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.21.44.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.21 2009/05/16 16:55:24 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.21.44.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_kgdb.h"
 
@@ -141,10 +141,14 @@ zs_kgdb_init(void)
 	volatile struct zschan *zc;
 	int channel, promzs_unit;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
 	/* printf("zs_kgdb_init: kgdb_dev=0x%x\n", kgdb_dev); */
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	/* Note: (ttya,ttyb) on zs0, and (ttyc,ttyd) on zs2 */
 	promzs_unit = (kgdb_dev & 2) ? 2 : 0;
@@ -171,6 +175,7 @@ zs_kgdb_init(void)
 
 	/* Store the getc/putc functions and arg. */
 	kgdb_attach(zs_getc, zs_putc, __UNVOLATILE(zc));
+	cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/sparc/sparc/machdep.c
diff -u src/sys/arch/sparc/sparc/machdep.c:1.327 src/sys/arch/sparc/sparc/machdep.c:1.327.4.1
--- src/sys/arch/sparc/sparc/machdep.c:1.327	Sun Sep 21 16:36:32 2014
+++ src/sys/arch/sparc/sparc/machdep.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.327 2014/09/21 16:36:32 christos Exp $ */
+/*	$NetBSD: machdep.c,v 1.327.4.1 2016/07/20 23:50:55 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.327 2014/09/21 16:36:32 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.327.4.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_compat_sunos.h"
@@ -974,9 +974,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
 		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
+		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -985,6 +989,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -995,6 +1000,7 @@ dumpsys(void)
 	psize = bdev_size(dumpdev);
 	printf("dump ");
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("area unavailable\n");
 		return;
 	}
@@ -1063,6 +1069,7 @@ dumpsys(void)
 		printf("error %d\n", error);
 		break;
 	}
+	bdevsw_release(bdev);
 }
 
 /*

Index: src/sys/arch/sparc64/sparc64/machdep.c
diff -u src/sys/arch/sparc64/sparc64/machdep.c:1.285 src/sys/arch/sparc64/sparc64/machdep.c:1.285.2.1
--- src/sys/arch/sparc64/sparc64/machdep.c:1.285	Thu Jul  7 06:55:38 2016
+++ src/sys/arch/sparc64/sparc64/machdep.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.285 2016/07/07 06:55:38 msaitoh Exp $ */
+/*	$NetBSD: machdep.c,v 1.285.2.1 2016/07/20 23:50:55 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.285 2016/07/07 06:55:38 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.285.2.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -707,9 +707,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
-	if (bdev == NULL || bdev->d_psize == NULL)
+	bdev = bdevsw_lookup_acquire(dumpdev);
+	if (bdev == NULL)
 		return;
+	if (bdev->d_psize == NULL) {
+		bdevsw_release(bdev);
+		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -718,10 +722,12 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (!dumpspace) {
+		bdevsw_release(bdev);
 		printf("\nno address space available, dump not possible\n");
 		return;
 	}
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %" PRId32 ",%" PRId32 " not possible ("
 		    "partition too small?)\n", major(dumpdev), minor(dumpdev));
 		return;
@@ -731,6 +737,7 @@ dumpsys(void)
 
 	psize = bdev_size(dumpdev);
 	if (psize == -1) {
+		bdevsw_release(bdev);
 		printf("dump area unavailable\n");
 		return;
 	}
@@ -798,6 +805,7 @@ dumpsys(void)
 		printf("- error %d\n", error);
 		break;
 	}
+	bdevsw_release(bdev);
 }
 
 void trapdump(struct trapframe64*);

Index: src/sys/arch/sun2/dev/consinit.c
diff -u src/sys/arch/sun2/dev/consinit.c:1.9 src/sys/arch/sun2/dev/consinit.c:1.9.20.1
--- src/sys/arch/sun2/dev/consinit.c:1.9	Fri Aug 10 14:52:26 2012
+++ src/sys/arch/sun2/dev/consinit.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: consinit.c,v 1.9 2012/08/10 14:52:26 tsutsui Exp $	*/
+/*	$NetBSD: consinit.c,v 1.9.20.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2001 Matthew Fredette
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: consinit.c,v 1.9 2012/08/10 14:52:26 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: consinit.c,v 1.9.20.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -282,8 +282,14 @@ consinit(void)
 #ifdef	KGDB
 	/* Set up KGDB */
 #if NZS > 0
-	if (cdevsw_lookup(kgdb_dev) == &zstty_cdevsw)
+	{
+	  const struct cdevsw *cdev = cdevsw_lookup_acquire(kgdb_dev);
+
+	  if (cdev == &zstty_cdevsw)
 		zs_kgdb_init();
+	  if (cdev !\ NULL)
+		cdevsw_release(cdev);
+	}
 #endif	/* NZS > 0 */
 #endif	/* KGDB */
 }

Index: src/sys/arch/sun2/dev/zs_kgdb.c
diff -u src/sys/arch/sun2/dev/zs_kgdb.c:1.10 src/sys/arch/sun2/dev/zs_kgdb.c:1.10.68.1
--- src/sys/arch/sun2/dev/zs_kgdb.c:1.10	Mon Apr 28 20:23:37 2008
+++ src/sys/arch/sun2/dev/zs_kgdb.c	Wed Jul 20 23:50:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.10 2008/04/28 20:23:37 martin Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.10.68.1 2016/07/20 23:50:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.10 2008/04/28 20:23:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.10.68.1 2016/07/20 23:50:55 pgoyette Exp $");
 
 #include "opt_kgdb.h"
 
@@ -131,10 +131,14 @@ zs_kgdb_init(void)
 	volatile struct zschan *zc;
 	int channel, promzs_unit;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
 	/* printf("zs_kgdb_init: kgdb_dev=0x%x\n", kgdb_dev); */
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	/* Note: (ttya,ttyb) on zs0, and (ttyc,ttyd) on zs2 */
 	promzs_unit = (kgdb_dev & 2) ? 2 : 0;
@@ -146,6 +150,7 @@ zs_kgdb_init(void)
 	memset((void *)&cs, 0, sizeof(cs));
 	zsd = zs_find_prom(promzs_unit);
 	if (zsd == NULL) {
+		cdevsw_release(cdev);
 		printf("zs_kgdb_init: zs not mapped.\n");
 		return;
 	}
@@ -161,6 +166,7 @@ zs_kgdb_init(void)
 
 	/* Store the getc/putc functions and arg. */
 	kgdb_attach(zs_getc, zs_putc, __UNVOLATILE(zc));
+	cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/sun2/sun2/machdep.c
diff -u src/sys/arch/sun2/sun2/machdep.c:1.77 src/sys/arch/sun2/sun2/machdep.c:1.77.10.1
--- src/sys/arch/sun2/sun2/machdep.c:1.77	Mon Mar 24 18:50:31 2014
+++ src/sys/arch/sun2/sun2/machdep.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.77 2014/03/24 18:50:31 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.77.10.1 2016/07/20 23:50:56 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -149,7 +149,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.77 2014/03/24 18:50:31 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.77.10.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -615,11 +615,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	dsw = bdevsw_lookup(dumpdev);
-	if (dsw == NULL || dsw->d_psize == NULL)
+	dsw = bdevsw_lookup_acquire(dumpdev);
+	if (dsw == NULL)
 		return;
-	if (dumppage == 0)
+	if (dsw->d_psize == NULL || dumppage == 0) {
+		bdevsw_release(dsw);
 		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -628,6 +630,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(dsw);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -727,9 +730,11 @@ dumpsys(void)
 		blkno += btodb(PAGE_SIZE);
 	} while (--todo > 0);
 
+	bdevsw_release(dsw);
 	printf("\rdump succeeded\n");
 	return;
 fail:
+	bdevsw_release(dsw);
 	printf(" dump error=%d\n", error);
 }
 

Index: src/sys/arch/sun3/dev/zs_kgdb.c
diff -u src/sys/arch/sun3/dev/zs_kgdb.c:1.26 src/sys/arch/sun3/dev/zs_kgdb.c:1.26.18.1
--- src/sys/arch/sun3/dev/zs_kgdb.c:1.26	Sat Oct 13 06:35:54 2012
+++ src/sys/arch/sun3/dev/zs_kgdb.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs_kgdb.c,v 1.26 2012/10/13 06:35:54 tsutsui Exp $	*/
+/*	$NetBSD: zs_kgdb.c,v 1.26.18.1 2016/07/20 23:50:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.26 2012/10/13 06:35:54 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs_kgdb.c,v 1.26.18.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include "opt_kgdb.h"
 
@@ -134,10 +134,14 @@ zs_kgdb_init(void)
 	struct zschan *zc;
 	int channel, zsc_unit;
 	extern const struct cdevsw zstty_cdevsw;
+	const struct cdevsw *cdev;
 
 	/* printf("zs_kgdb_init: kgdb_dev=0x%x\n", kgdb_dev); */
-	if (cdevsw_lookup(kgdb_dev) != &zstty_cdevsw)
+	if ((cdev = cdevsw_lookup_acquire(kgdb_dev)) != &zstty_cdevsw) {
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 		return;
+	}
 
 	/* Note: (ttya,ttyb) on zsc1, and (ttyc,ttyd) on zsc0 */
 	zsc_unit = (kgdb_dev & 2) ? 0 : 1;
@@ -149,6 +153,7 @@ zs_kgdb_init(void)
 	memset((void *)&cs, 0, sizeof(cs));
 	zc = zs_get_chan_addr(zsc_unit, channel);
 	if (zc == NULL) {
+		cdevsw_release(cdev);
 		printf("zs_kgdb_init: zs not mapped.\n");
 		kgdb_dev = -1;
 		return;
@@ -164,6 +169,7 @@ zs_kgdb_init(void)
 
 	/* Store the getc/putc functions and arg. */
 	kgdb_attach(zs_getc, zs_putc, __UNVOLATILE(zc));
+	cdevsw_release(cdev);
 }
 
 /*

Index: src/sys/arch/sun3/sun3/machdep.c
diff -u src/sys/arch/sun3/sun3/machdep.c:1.208 src/sys/arch/sun3/sun3/machdep.c:1.208.10.1
--- src/sys/arch/sun3/sun3/machdep.c:1.208	Mon Mar 24 20:06:33 2014
+++ src/sys/arch/sun3/sun3/machdep.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.208 2014/03/24 20:06:33 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.208.10.1 2016/07/20 23:50:56 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.208 2014/03/24 20:06:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.208.10.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -534,9 +534,13 @@ dumpsys(void)
 		return;
 	if (dumppage == 0)
 		return;
-	dsw = bdevsw_lookup(dumpdev);
-	if (dsw == NULL || dsw->d_psize == NULL)
+	dsw = bdevsw_lookup_acquire(dumpdev);
+	if (dsw == NULL)
 		return;
+	if (dsw->d_psize == NULL) {
+		bdevsw_release(dsw);
+		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -545,6 +549,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(dsw);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -553,6 +558,7 @@ dumpsys(void)
 
 	psize = bdev_size(dumpdev);
 	if (psize == -1) {
+		bdevsw_release(dsw);
 		printf("dump area unavailable\n");
 		return;
 	}
@@ -649,9 +655,11 @@ dumpsys(void)
 		blkno += btodb(PAGE_SIZE);
 	} while (--todo > 0);
 
+	bdevsw_release(dsw);
 	printf("\rdump succeeded\n");
 	return;
 fail:
+	bdevsw_release(dsw);
 	printf(" dump error=%d\n", error);
 }
 

Index: src/sys/arch/sun3/sun3x/machdep.c
diff -u src/sys/arch/sun3/sun3x/machdep.c:1.135 src/sys/arch/sun3/sun3x/machdep.c:1.135.10.1
--- src/sys/arch/sun3/sun3x/machdep.c:1.135	Mon Mar 24 20:06:33 2014
+++ src/sys/arch/sun3/sun3x/machdep.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.135 2014/03/24 20:06:33 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.135.10.1 2016/07/20 23:50:56 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.135 2014/03/24 20:06:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.135.10.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -522,9 +522,13 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	dsw = bdevsw_lookup(dumpdev);
-	if (dsw == NULL || dsw->d_psize == NULL)
+	dsw = bdevsw_lookup_acquire(dumpdev);
+	if (dsw == NULL)
 		return;
+	if (dsw->d_psize == NULL) {
+		bdevsw_release(dsw);
+		return;
+	}
 
 	/*
 	 * For dumps during autoconfiguration,
@@ -533,6 +537,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(dsw);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -541,6 +546,7 @@ dumpsys(void)
 
 	psize = bdev_size(dumpdev);
 	if (psize == -1) {
+		bdevsw_release(dsw);
 		printf("dump area unavailable\n");
 		return;
 	}
@@ -612,9 +618,11 @@ dumpsys(void)
 			todo--;
 		}
 	}
+	bdevsw_release(dsw);
 	printf("\rdump succeeded\n");
 	return;
 fail:
+	bdevsw_release(dsw);
 	printf(" dump error=%d\n", error);
 }
 

Index: src/sys/arch/vax/vax/machdep.c
diff -u src/sys/arch/vax/vax/machdep.c:1.191 src/sys/arch/vax/vax/machdep.c:1.191.2.1
--- src/sys/arch/vax/vax/machdep.c:1.191	Tue Dec 16 11:23:11 2014
+++ src/sys/arch/vax/vax/machdep.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.191 2014/12/16 11:23:11 jklos Exp $	 */
+/* $NetBSD: machdep.c,v 1.191.2.1 2016/07/20 23:50:56 pgoyette Exp $	 */
 
 /*
  * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
@@ -83,7 +83,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.191 2014/12/16 11:23:11 jklos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.191.2.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -415,7 +415,7 @@ dumpsys(void)
 
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	/*
@@ -425,6 +425,7 @@ dumpsys(void)
 	if (dumpsize == 0)
 		cpu_dumpconf();
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -454,6 +455,7 @@ dumpsys(void)
 		printf("succeeded\n");
 		break;
 	}
+	bdevsw_release(bdev);
 }
 
 int

Index: src/sys/arch/x68k/x68k/machdep.c
diff -u src/sys/arch/x68k/x68k/machdep.c:1.193 src/sys/arch/x68k/x68k/machdep.c:1.193.2.1
--- src/sys/arch/x68k/x68k/machdep.c:1.193	Tue Jun 14 07:51:10 2016
+++ src/sys/arch/x68k/x68k/machdep.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.193 2016/06/14 07:51:10 isaki Exp $	*/
+/*	$NetBSD: machdep.c,v 1.193.2.1 2016/07/20 23:50:56 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.193 2016/06/14 07:51:10 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.193.2.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -721,15 +721,18 @@ dumpsys(void)
 	/* Make sure dump device is valid. */
 	if (dumpdev == NODEV)
 		return;
-	bdev = bdevsw_lookup(dumpdev);
+	bdev = bdevsw_lookup_acquire(dumpdev);
 	if (bdev == NULL)
 		return;
 	if (dumpsize == 0) {
 		cpu_dumpconf();
-		if (dumpsize == 0)
+		if (dumpsize == 0) {
+			bdevsw_release(bdev);
 			return;
+		}
 	}
 	if (dumplo <= 0) {
+		bdevsw_release(bdev);
 		printf("\ndump to dev %u,%u not possible\n",
 		    major(dumpdev), minor(dumpdev));
 		return;
@@ -781,31 +784,38 @@ dumpsys(void)
 			break;
 
 		case ENXIO:
+			bdevsw_release(bdev);
 			printf("device bad\n");
 			return;
 
 		case EFAULT:
+			bdevsw_release(bdev);
 			printf("device not ready\n");
 			return;
 
 		case EINVAL:
+			bdevsw_release(bdev);
 			printf("area improper\n");
 			return;
 
 		case EIO:
+			bdevsw_release(bdev);
 			printf("i/o error\n");
 			return;
 
 		case EINTR:
+			bdevsw_release(bdev);
 			printf("aborted from console\n");
 			return;
 
 		default:
+			bdevsw_release(bdev);
 			printf("error %d\n", error);
 			return;
 		}
 	}
 	printf("succeeded\n");
+	bdevsw_release(bdev);
 }
 
 void

Index: src/sys/arch/xen/xen/xbdback_xenbus.c
diff -u src/sys/arch/xen/xen/xbdback_xenbus.c:1.62 src/sys/arch/xen/xen/xbdback_xenbus.c:1.62.2.1
--- src/sys/arch/xen/xen/xbdback_xenbus.c:1.62	Wed Jan  6 15:28:40 2016
+++ src/sys/arch/xen/xen/xbdback_xenbus.c	Wed Jul 20 23:50:56 2016
@@ -1,4 +1,4 @@
-/*      $NetBSD: xbdback_xenbus.c,v 1.62 2016/01/06 15:28:40 bouyer Exp $      */
+/*      $NetBSD: xbdback_xenbus.c,v 1.62.2.1 2016/07/20 23:50:56 pgoyette Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.62 2016/01/06 15:28:40 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.62.2.1 2016/07/20 23:50:56 pgoyette Exp $");
 
 #include <sys/atomic.h>
 #include <sys/buf.h>
@@ -739,6 +739,7 @@ xbdback_backend_changed(struct xenbus_wa
 	struct xenbus_transaction *xbt;
 	const char *devname;
 	int major;
+	const struct bdevsw *bdev;
 
 	err = xenbus_read_ul(NULL, xbusd->xbusd_path, "physical-device",
 	    &dev, 10);
@@ -781,7 +782,7 @@ xbdback_backend_changed(struct xenbus_wa
 		    xbusd->xbusd_path, xbdi->xbdi_dev);
 		return;
 	}
-	xbdi->xbdi_bdevsw = bdevsw_lookup(xbdi->xbdi_dev);
+	bdev = xbdi->xbdi_bdevsw = bdevsw_lookup_acquire(xbdi->xbdi_dev);
 	if (xbdi->xbdi_bdevsw == NULL) {
 		printf("xbdback %s: no bdevsw for device 0x%"PRIx64"\n",
 		    xbusd->xbusd_path, xbdi->xbdi_dev);
@@ -791,6 +792,7 @@ xbdback_backend_changed(struct xenbus_wa
 	if (err) {
 		printf("xbdback %s: can't open device 0x%"PRIx64": %d\n",
 		    xbusd->xbusd_path, xbdi->xbdi_dev, err);
+		bdevsw_release(bdev);
 		return;
 	}
 	err = vn_lock(xbdi->xbdi_vp, LK_EXCLUSIVE | LK_RETRY);
@@ -798,6 +800,7 @@ xbdback_backend_changed(struct xenbus_wa
 		printf("xbdback %s: can't vn_lock device 0x%"PRIx64": %d\n",
 		    xbusd->xbusd_path, xbdi->xbdi_dev, err);
 		vrele(xbdi->xbdi_vp);
+		bdevsw_release(bdev);
 		return;
 	}
 	err  = VOP_OPEN(xbdi->xbdi_vp, FREAD, NOCRED);
@@ -805,6 +808,7 @@ xbdback_backend_changed(struct xenbus_wa
 		printf("xbdback %s: can't VOP_OPEN device 0x%"PRIx64": %d\n",
 		    xbusd->xbusd_path, xbdi->xbdi_dev, err);
 		vput(xbdi->xbdi_vp);
+		bdevsw_release(bdev);
 		return;
 	}
 	VOP_UNLOCK(xbdi->xbdi_vp);
@@ -824,6 +828,7 @@ xbdback_backend_changed(struct xenbus_wa
 		xbdi->xbdi_size = xbdi->xbdi_dev = 0;
 		vn_close(xbdi->xbdi_vp, FREAD, NOCRED);
 		xbdi->xbdi_vp = NULL;
+		bdevsw_release(bdev);
 		return;
 	}
 again:
@@ -831,7 +836,8 @@ again:
 	if (xbt == NULL) {
 		printf("xbdback %s: can't start transaction\n",
 		    xbusd->xbusd_path);
-		    return;
+		bdevsw_release(bdev);
+		return;
 	}
 	err = xenbus_printf(xbt, xbusd->xbusd_path, "sectors", "%" PRIu64 ,
 	    xbdi->xbdi_size);
@@ -873,9 +879,11 @@ again:
 		printf("xbdback %s: can't switch state: %d\n",
 		    xbusd->xbusd_path, err);
 	}
+	bdevsw_release(bdev);
 	return;
 abort:
 	xenbus_transaction_end(xbt, 1);
+	bdevsw_release(bdev);
 }
 
 /*

Reply via email to