Module Name:    src
Committed By:   martin
Date:           Tue Nov 11 10:36:41 UTC 2014

Modified Files:
        src/sbin/dkctl [netbsd-7]: dkctl.8 dkctl.c
        src/sys/dev [netbsd-7]: dksubr.c ld.c vnd.c
        src/sys/dev/ata [netbsd-7]: wd.c
        src/sys/dev/dkwedge [netbsd-7]: dk.c
        src/sys/dev/raidframe [netbsd-7]: rf_netbsdkintf.c
        src/sys/dev/scsipi [netbsd-7]: sd.c
        src/sys/sys [netbsd-7]: dkio.h

Log Message:
Pull up following revision(s) (requested by mlelstv in ticket #201):
        sbin/dkctl/dkctl.8: revision 1.24
        sbin/dkctl/dkctl.8: revision 1.25
        sys/dev/scsipi/sd.c: revision 1.310
        sys/dev/ata/wd.c: revision 1.415
        sbin/dkctl/dkctl.c: revision 1.21
        sys/dev/raidframe/rf_netbsdkintf.c: revision 1.315
        sys/dev/ld.c: revision 1.78
        sys/dev/vnd.c: revision 1.234
        sys/dev/dksubr.c: revision 1.54
        sys/sys/dkio.h: revision 1.20
        sys/dev/dkwedge/dk.c: revision 1.74
Add ioctl to autodiscover wedges.
Implement DIOCMWEDGES ioctl that triggers wedge autodiscovery.
Also fix a reference counting bug and clean up some code.
support DIOCMWEDGES ioctl.
Add 'makewedges' option to autodiscover wedges from a changed label.
New sentence, new line. Bump date for previous.


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.23.24.1 src/sbin/dkctl/dkctl.8
cvs rdiff -u -r1.20 -r1.20.20.1 src/sbin/dkctl/dkctl.c
cvs rdiff -u -r1.51 -r1.51.2.1 src/sys/dev/dksubr.c
cvs rdiff -u -r1.75 -r1.75.2.1 src/sys/dev/ld.c
cvs rdiff -u -r1.232 -r1.232.2.1 src/sys/dev/vnd.c
cvs rdiff -u -r1.412 -r1.412.2.1 src/sys/dev/ata/wd.c
cvs rdiff -u -r1.72.2.1 -r1.72.2.2 src/sys/dev/dkwedge/dk.c
cvs rdiff -u -r1.312 -r1.312.2.1 src/sys/dev/raidframe/rf_netbsdkintf.c
cvs rdiff -u -r1.308 -r1.308.2.1 src/sys/dev/scsipi/sd.c
cvs rdiff -u -r1.19 -r1.19.2.1 src/sys/sys/dkio.h

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

Modified files:

Index: src/sbin/dkctl/dkctl.8
diff -u src/sbin/dkctl/dkctl.8:1.23 src/sbin/dkctl/dkctl.8:1.23.24.1
--- src/sbin/dkctl/dkctl.8:1.23	Tue Jan  4 23:29:51 2011
+++ src/sbin/dkctl/dkctl.8	Tue Nov 11 10:36:40 2014
@@ -1,4 +1,4 @@
-.\"	$NetBSD: dkctl.8,v 1.23 2011/01/04 23:29:51 wiz Exp $
+.\"	$NetBSD: dkctl.8,v 1.23.24.1 2014/11/11 10:36:40 martin Exp $
 .\"
 .\" Copyright 2002 Wasabi Systems, Inc.
 .\" All rights reserved.
@@ -33,7 +33,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd January 5, 2011
+.Dd November 4, 2014
 .Dt DKCTL 8
 .Os
 .Sh NAME
@@ -165,6 +165,12 @@ Display information about the specified 
 in this case is the wedge name.
 .It Ic listwedges
 List all of the wedges configured on the specified disk.
+.It Ic makewedges
+Delete all wedges configured on the specified disk, and autodiscover
+the wedges again.
+Wedges that are in use are not deleted and conflicting
+or overlapping wedges are not created.
+You need to list wedges to find out what has changed.
 .It Ic strategy Op Ar name
 Get and set the disk I/O scheduler (buffer queue strategy) on the
 drive.

Index: src/sbin/dkctl/dkctl.c
diff -u src/sbin/dkctl/dkctl.c:1.20 src/sbin/dkctl/dkctl.c:1.20.20.1
--- src/sbin/dkctl/dkctl.c:1.20	Sat Aug 27 16:34:38 2011
+++ src/sbin/dkctl/dkctl.c	Tue Nov 11 10:36:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkctl.c,v 1.20 2011/08/27 16:34:38 joerg Exp $	*/
+/*	$NetBSD: dkctl.c,v 1.20.20.1 2014/11/11 10:36:40 martin Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -41,7 +41,7 @@
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: dkctl.c,v 1.20 2011/08/27 16:34:38 joerg Exp $");
+__RCSID("$NetBSD: dkctl.c,v 1.20.20.1 2014/11/11 10:36:40 martin Exp $");
 #endif
 
 
@@ -101,6 +101,7 @@ static void	disk_addwedge(int, char *[])
 static void	disk_delwedge(int, char *[]);
 static void	disk_getwedgeinfo(int, char *[]);
 static void	disk_listwedges(int, char *[]);
+static void	disk_makewedges(int, char *[]);
 static void	disk_strategy(int, char *[]);
 
 static struct command commands[] = {
@@ -149,6 +150,11 @@ static struct command commands[] = {
 	  disk_listwedges,
 	  O_RDONLY },
 
+	{ "makewedges",
+	  "",
+	  disk_makewedges,
+	  O_RDWR },
+
 	{ "strategy",
 	  "[name]",
 	  disk_strategy,
@@ -666,6 +672,20 @@ disk_listwedges(int argc, char *argv[])
 	}
 }
 
+static void
+disk_makewedges(int argc, char *argv[])
+{
+	int bits;
+
+	if (argc != 0)
+		usage();
+
+	if (ioctl(fd, DIOCMWEDGES, &bits) == -1)
+		err(1, "%s: makewedges", dvname);
+	else
+		printf("successfully scanned %s.\n", dvname);
+}
+
 static int
 dkw_sort(const void *a, const void *b)
 {

Index: src/sys/dev/dksubr.c
diff -u src/sys/dev/dksubr.c:1.51 src/sys/dev/dksubr.c:1.51.2.1
--- src/sys/dev/dksubr.c:1.51	Sat Jun 14 07:39:00 2014
+++ src/sys/dev/dksubr.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: dksubr.c,v 1.51 2014/06/14 07:39:00 hannken Exp $ */
+/* $NetBSD: dksubr.c,v 1.51.2.1 2014/11/11 10:36:41 martin Exp $ */
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 1999, 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.51 2014/06/14 07:39:00 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.51.2.1 2014/11/11 10:36:41 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -304,6 +304,7 @@ dk_ioctl(struct dk_intf *di, struct dk_s
 	case DIOCAWEDGE:
 	case DIOCDWEDGE:
 	case DIOCLWEDGES:
+	case DIOCMWEDGES:
 	case DIOCCACHESYNC:
 #ifdef __HAVE_OLD_DISKLABEL
 	case ODIOCGDINFO:
@@ -433,6 +434,15 @@ dk_ioctl(struct dk_intf *di, struct dk_s
 		return (dkwedge_list(&dksc->sc_dkdev, dkwl, l));
 	    }
 
+	case DIOCMWEDGES:
+	    {
+		if ((flag & FWRITE) == 0)
+			return (EBADF);
+
+	    	dkwedge_discover(&dksc->sc_dkdev);
+		return 0;
+	    }
+
 	case DIOCGSTRATEGY:
 	    {
 		struct disk_strategy *dks = (void *)data;

Index: src/sys/dev/ld.c
diff -u src/sys/dev/ld.c:1.75 src/sys/dev/ld.c:1.75.2.1
--- src/sys/dev/ld.c:1.75	Sun Aug 10 16:44:35 2014
+++ src/sys/dev/ld.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ld.c,v 1.75 2014/08/10 16:44:35 tls Exp $	*/
+/*	$NetBSD: ld.c,v 1.75.2.1 2014/11/11 10:36:41 martin Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.75 2014/08/10 16:44:35 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.75.2.1 2014/11/11 10:36:41 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -555,6 +555,16 @@ ldioctl(dev_t dev, u_long cmd, void *add
 
 		return (dkwedge_list(&sc->sc_dk, dkwl, l));
 	    }
+
+	case DIOCMWEDGES:
+	    {
+	    	if ((flag & FWRITE) == 0)
+			return (EBADF);
+
+		dkwedge_discover(&sc->sc_dk);
+		return 0;
+	    }
+
 	case DIOCGSTRATEGY:
 	    {
 		struct disk_strategy *dks = (void *)addr;

Index: src/sys/dev/vnd.c
diff -u src/sys/dev/vnd.c:1.232 src/sys/dev/vnd.c:1.232.2.1
--- src/sys/dev/vnd.c:1.232	Fri Jul 25 08:10:35 2014
+++ src/sys/dev/vnd.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnd.c,v 1.232 2014/07/25 08:10:35 dholland Exp $	*/
+/*	$NetBSD: vnd.c,v 1.232.2.1 2014/11/11 10:36:41 martin Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.232 2014/07/25 08:10:35 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.232.2.1 2014/11/11 10:36:41 martin Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vnd.h"
@@ -1592,6 +1592,13 @@ unlock_and_exit:
 
 		return dkwedge_list(&vnd->sc_dkdev, dkwl, l);
 
+	case DIOCMWEDGES:
+		if ((flag & FWRITE) == 0)
+			return EBADF;
+
+		dkwedge_discover(&vnd->sc_dkdev);
+		return 0;
+
 	default:
 		return ENOTTY;
 	}

Index: src/sys/dev/ata/wd.c
diff -u src/sys/dev/ata/wd.c:1.412 src/sys/dev/ata/wd.c:1.412.2.1
--- src/sys/dev/ata/wd.c:1.412	Sun Aug 10 16:44:35 2014
+++ src/sys/dev/ata/wd.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: wd.c,v 1.412 2014/08/10 16:44:35 tls Exp $ */
+/*	$NetBSD: wd.c,v 1.412.2.1 2014/11/11 10:36:41 martin Exp $ */
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.412 2014/08/10 16:44:35 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.412.2.1 2014/11/11 10:36:41 martin Exp $");
 
 #include "opt_ata.h"
 
@@ -1511,6 +1511,15 @@ wdioctl(dev_t dev, u_long xfer, void *ad
 		return (dkwedge_list(&wd->sc_dk, dkwl, l));
 	    }
 
+	case DIOCMWEDGES:
+	    {
+	    	if ((flag & FWRITE) == 0)
+			return (EBADF);
+
+		dkwedge_discover(&wd->sc_dk);
+		return 0;
+	    }
+
 	case DIOCGSTRATEGY:
 	    {
 		struct disk_strategy *dks = (void *)addr;

Index: src/sys/dev/dkwedge/dk.c
diff -u src/sys/dev/dkwedge/dk.c:1.72.2.1 src/sys/dev/dkwedge/dk.c:1.72.2.2
--- src/sys/dev/dkwedge/dk.c:1.72.2.1	Fri Aug 29 11:49:41 2014
+++ src/sys/dev/dkwedge/dk.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dk.c,v 1.72.2.1 2014/08/29 11:49:41 martin Exp $	*/
+/*	$NetBSD: dk.c,v 1.72.2.2 2014/11/11 10:36:41 martin Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.72.2.1 2014/08/29 11:49:41 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.72.2.2 2014/11/11 10:36:41 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_dkwedge.h"
@@ -98,7 +98,10 @@ static void	dkrestart(void *);
 static void	dkminphys(struct buf *);
 
 static int	dklastclose(struct dkwedge_softc *);
+static int	dkwedge_cleanup_parent(struct dkwedge_softc *, int);
 static int	dkwedge_detach(device_t, int);
+static void	dkwedge_delall1(struct disk *, bool);
+static int	dkwedge_del1(struct dkwedge_info *, int);
 
 static dev_type_open(dkopen);
 static dev_type_close(dkclose);
@@ -198,7 +201,7 @@ dkwedge_wait_drain(struct dkwedge_softc 
  *	Compute the parent disk's dev_t.
  */
 static int
-dkwedge_compute_pdev(const char *pname, dev_t *pdevp)
+dkwedge_compute_pdev(const char *pname, dev_t *pdevp, enum vtype type)
 {
 	const char *name, *cp;
 	devmajor_t pmaj;
@@ -206,7 +209,18 @@ dkwedge_compute_pdev(const char *pname, 
 	char devname[16];
 
 	name = pname;
-	if ((pmaj = devsw_name2blk(name, devname, sizeof(devname))) == -1)
+	switch (type) {
+	case VBLK:
+		pmaj = devsw_name2blk(name, devname, sizeof(devname));
+		break;
+	case VCHR:
+		pmaj = devsw_name2chr(name, devname, sizeof(devname));
+		break;
+	default:
+		pmaj = -1;
+		break;
+	}
+	if (pmaj == -1)
 		return (ENODEV);
 
 	name += strlen(devname);
@@ -282,7 +296,7 @@ dkwedge_add(struct dkwedge_info *dkw)
 	if (pdk == NULL)
 		return (ENODEV);
 
-	error = dkwedge_compute_pdev(pdk->dk_name, &pdev);
+	error = dkwedge_compute_pdev(pdk->dk_name, &pdev, VBLK);
 	if (error)
 		return (error);
 
@@ -331,9 +345,14 @@ dkwedge_add(struct dkwedge_info *dkw)
 			    	break;
 			}
 		}
-		if (lsc != NULL)
-			error = EINVAL;
-		else {
+		if (lsc != NULL) {
+			if (sc->sc_offset == lsc->sc_offset &&
+			    sc->sc_size == lsc->sc_size &&
+			    strcmp(sc->sc_wname, lsc->sc_wname) == 0)
+				error = EEXIST;
+			else
+				error = EINVAL;
+		} else {
 			pdk->dk_nwedges++;
 			LIST_INSERT_HEAD(&pdk->dk_wedges, sc, sc_plink);
 		}
@@ -497,17 +516,23 @@ dkwedge_find(struct dkwedge_info *dkw, u
 int
 dkwedge_del(struct dkwedge_info *dkw)
 {
+	return dkwedge_del1(dkw, 0);
+}
+
+int
+dkwedge_del1(struct dkwedge_info *dkw, int flags)
+{
 	struct dkwedge_softc *sc = NULL;
 
 	/* Find our softc. */
 	if ((sc = dkwedge_find(dkw, NULL)) == NULL)
 		return (ESRCH);
 
-	return config_detach(sc->sc_dev, DETACH_FORCE | DETACH_QUIET);
+	return config_detach(sc->sc_dev, flags);
 }
 
 static int
-dkwedge_begindetach(struct dkwedge_softc *sc, int flags)
+dkwedge_cleanup_parent(struct dkwedge_softc *sc, int flags)
 {
 	struct disk *dk = &sc->sc_dk;
 	int rc;
@@ -546,7 +571,7 @@ dkwedge_detach(device_t self, int flags)
 	}
 	if (unit == ndkwedges)
 		rc = ENXIO;
-	else if ((rc = dkwedge_begindetach(sc, flags)) == 0) {
+	else if ((rc = dkwedge_cleanup_parent(sc, flags)) == 0) {
 		/* Mark the wedge as dying. */
 		sc->sc_state = DKW_STATE_DYING;
 	}
@@ -579,20 +604,7 @@ dkwedge_detach(device_t self, int flags)
 	vdevgone(cmaj, unit, unit, VCHR);
 
 	/* Clean up the parent. */
-	mutex_enter(&sc->sc_dk.dk_openlock);
-	if (sc->sc_dk.dk_openmask) {
-		mutex_enter(&sc->sc_parent->dk_rawlock);
-		if (sc->sc_parent->dk_rawopens-- == 1) {
-			KASSERT(sc->sc_parent->dk_rawvp != NULL);
-			mutex_exit(&sc->sc_parent->dk_rawlock);
-			(void) vn_close(sc->sc_parent->dk_rawvp, FREAD | FWRITE,
-			    NOCRED);
-			sc->sc_parent->dk_rawvp = NULL;
-		} else
-			mutex_exit(&sc->sc_parent->dk_rawlock);
-		sc->sc_dk.dk_openmask = 0;
-	}
-	mutex_exit(&sc->sc_dk.dk_openlock);
+	dkwedge_cleanup_parent(sc, flags | DETACH_FORCE);
 
 	/* Announce our departure. */
 	aprint_normal("%s at %s (%s) deleted\n", device_xname(sc->sc_dev),
@@ -631,13 +643,27 @@ dkwedge_detach(device_t self, int flags)
 void
 dkwedge_delall(struct disk *pdk)
 {
+	dkwedge_delall1(pdk, false);
+}
+
+static void
+dkwedge_delall1(struct disk *pdk, bool idleonly)
+{
 	struct dkwedge_info dkw;
 	struct dkwedge_softc *sc;
+	int flags;
+
+	flags = DETACH_QUIET;
+	if (!idleonly) flags |= DETACH_FORCE;
 
 	for (;;) {
 		mutex_enter(&pdk->dk_openlock);
-		if ((sc = LIST_FIRST(&pdk->dk_wedges)) == NULL) {
-			KASSERT(pdk->dk_nwedges == 0);
+		LIST_FOREACH(sc, &pdk->dk_wedges, sc_plink) {
+			if (!idleonly || sc->sc_dk.dk_openmask == 0)
+				break;
+		}
+		if (sc == NULL) {
+			KASSERT(idleonly || pdk->dk_nwedges == 0);
 			mutex_exit(&pdk->dk_openlock);
 			return;
 		}
@@ -645,7 +671,7 @@ dkwedge_delall(struct disk *pdk)
 		strlcpy(dkw.dkw_devname, device_xname(sc->sc_dev),
 			sizeof(dkw.dkw_devname));
 		mutex_exit(&pdk->dk_openlock);
-		(void) dkwedge_del(&dkw);
+		(void) dkwedge_del1(&dkw, flags);
 	}
 }
 
@@ -823,6 +849,7 @@ int	dkwedge_autodiscover = 0;
  * dkwedge_discover:	[exported function]
  *
  *	Discover the wedges on a newly attached disk.
+ *	Remove all unused wedges on the disk first.
  */
 void
 dkwedge_discover(struct disk *pdk)
@@ -840,14 +867,18 @@ dkwedge_discover(struct disk *pdk)
 
 	rw_enter(&dkwedge_discovery_methods_lock, RW_READER);
 
-	error = dkwedge_compute_pdev(pdk->dk_name, &pdev);
+	/*
+	 * Use the character device for scanning, the block device
+	 * is busy if there are already wedges attached.
+	 */
+	error = dkwedge_compute_pdev(pdk->dk_name, &pdev, VCHR);
 	if (error) {
 		aprint_error("%s: unable to compute pdev, error = %d\n",
 		    pdk->dk_name, error);
 		goto out;
 	}
 
-	error = bdevvp(pdev, &vp);
+	error = cdevvp(pdev, &vp);
 	if (error) {
 		aprint_error("%s: unable to find vnode for pdev, error = %d\n",
 		    pdk->dk_name, error);
@@ -873,6 +904,11 @@ dkwedge_discover(struct disk *pdk)
 	VOP_UNLOCK(vp);
 
 	/*
+	 * Remove unused wedges
+	 */
+	dkwedge_delall1(pdk, true);
+
+	/*
 	 * For each supported partition map type, look to see if
 	 * this map type exists.  If so, parse it and add the
 	 * corresponding wedges.
@@ -905,24 +941,37 @@ int
 dkwedge_read(struct disk *pdk, struct vnode *vp, daddr_t blkno,
     void *tbuf, size_t len)
 {
-	struct buf *bp;
-	int result;
+	buf_t *bp;
+	int error;
 
-	bp = getiobuf(vp, true);
+	/*
+	 * The kernel cannot read from a character device vnode
+	 * as physio() only handles user memory.
+	 *
+	 * Determine the corresponding block device and call into
+	 * the driver directly.
+	 */
 
-	bp->b_dev = vp->v_rdev;
-	bp->b_blkno = blkno;
-	bp->b_bcount = len;
-	bp->b_resid = len;
+	bp = getiobuf(vp, true);
 	bp->b_flags = B_READ;
+	bp->b_cflags = BC_BUSY;
+	bp->b_dev = devsw_chr2blk(vp->v_rdev);
 	bp->b_data = tbuf;
-	SET(bp->b_cflags, BC_BUSY);	/* mark buffer busy */
+	bp->b_bufsize = bp->b_resid = bp->b_bcount = len;
+	bp->b_lblkno = 0;
+	bp->b_blkno = blkno;
+
+	error = bdev_open(bp->b_dev, FREAD, S_IFBLK, curlwp);
+	if (error)
+		return error;
 
-	VOP_STRATEGY(vp, bp);
-	result = biowait(bp);
+	bdev_strategy(bp);
+	error = biowait(bp);
 	putiobuf(bp);
 
-	return result;
+	bdev_close(bp->b_dev, FREAD, S_IFBLK, curlwp);
+
+	return error;
 }
 
 /*
@@ -1012,16 +1061,23 @@ dkopen(dev_t dev, int flags, int fmt, st
 static int
 dklastclose(struct dkwedge_softc *sc)
 {
-	int error = 0;
+	int error = 0, doclose;
 
-	if (sc->sc_parent->dk_rawopens-- == 1) {
+	doclose = 0;
+	if (sc->sc_parent->dk_rawopens > 0) {
+		if (--sc->sc_parent->dk_rawopens == 0)
+			doclose = 1;
+	}
+
+	mutex_exit(&sc->sc_parent->dk_rawlock);
+
+	if (doclose) {
 		KASSERT(sc->sc_parent->dk_rawvp != NULL);
-		mutex_exit(&sc->sc_parent->dk_rawlock);
 		error = vn_close(sc->sc_parent->dk_rawvp,
 		    FREAD | FWRITE, NOCRED);
 		sc->sc_parent->dk_rawvp = NULL;
-	} else
-		mutex_exit(&sc->sc_parent->dk_rawlock);
+	}
+
 	return error;
 }
 

Index: src/sys/dev/raidframe/rf_netbsdkintf.c
diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.312 src/sys/dev/raidframe/rf_netbsdkintf.c:1.312.2.1
--- src/sys/dev/raidframe/rf_netbsdkintf.c:1.312	Fri Jul 25 08:10:38 2014
+++ src/sys/dev/raidframe/rf_netbsdkintf.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_netbsdkintf.c,v 1.312 2014/07/25 08:10:38 dholland Exp $	*/
+/*	$NetBSD: rf_netbsdkintf.c,v 1.312.2.1 2014/11/11 10:36:41 martin Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
  ***********************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.312 2014/07/25 08:10:38 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.312.2.1 2014/11/11 10:36:41 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1090,6 +1090,7 @@ raidioctl(dev_t dev, u_long cmd, void *d
 	case DIOCWLABEL:
 	case DIOCAWEDGE:
 	case DIOCDWEDGE:
+	case DIOCMWEDGES:
 	case DIOCSSTRATEGY:
 		if ((flag & FWRITE) == 0)
 			return (EBADF);
@@ -1112,6 +1113,7 @@ raidioctl(dev_t dev, u_long cmd, void *d
 	case DIOCAWEDGE:
 	case DIOCDWEDGE:
 	case DIOCLWEDGES:
+	case DIOCMWEDGES:
 	case DIOCCACHESYNC:
 	case RAIDFRAME_SHUTDOWN:
 	case RAIDFRAME_REWRITEPARITY:
@@ -1917,6 +1919,9 @@ raidioctl(dev_t dev, u_long cmd, void *d
 	case DIOCLWEDGES:
 		return dkwedge_list(&rs->sc_dkdev,
 		    (struct dkwedge_list *)data, l);
+	case DIOCMWEDGES:
+		dkwedge_discover(&rs->sc_dkdev);
+		return 0;
 	case DIOCCACHESYNC:
 		return rf_sync_component_caches(raidPtr);
 

Index: src/sys/dev/scsipi/sd.c
diff -u src/sys/dev/scsipi/sd.c:1.308 src/sys/dev/scsipi/sd.c:1.308.2.1
--- src/sys/dev/scsipi/sd.c:1.308	Sun Aug 10 16:44:36 2014
+++ src/sys/dev/scsipi/sd.c	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sd.c,v 1.308 2014/08/10 16:44:36 tls Exp $	*/
+/*	$NetBSD: sd.c,v 1.308.2.1 2014/11/11 10:36:41 martin Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.308 2014/08/10 16:44:36 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.308.2.1 2014/11/11 10:36:41 martin Exp $");
 
 #include "opt_scsi.h"
 
@@ -1256,6 +1256,15 @@ sdioctl(dev_t dev, u_long cmd, void *add
 		return (dkwedge_list(&sd->sc_dk, dkwl, l));
 	    }
 
+	case DIOCMWEDGES:
+	    {
+		if ((flag & FWRITE) == 0)
+			return (EBADF);
+
+		dkwedge_discover(&sd->sc_dk);
+		return 0;
+	    }
+
 	case DIOCGSTRATEGY:
 	    {
 		struct disk_strategy *dks = addr;

Index: src/sys/sys/dkio.h
diff -u src/sys/sys/dkio.h:1.19 src/sys/sys/dkio.h:1.19.2.1
--- src/sys/sys/dkio.h:1.19	Fri Jul 25 08:34:48 2014
+++ src/sys/sys/dkio.h	Tue Nov 11 10:36:41 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkio.h,v 1.19 2014/07/25 08:34:48 dholland Exp $	*/
+/*	$NetBSD: dkio.h,v 1.19.2.1 2014/11/11 10:36:41 martin Exp $	*/
 
 /*
  * Copyright (c) 1987, 1988, 1993
@@ -112,4 +112,7 @@
 /* 129 was DIOCGDISCARDPARAMS during 6.99 */
 /* 130 was DIOCDISCARD during 6.99 */
 
+		/* trigger wedge auto discover */
+#define	DIOCMWEDGES	_IOR('d', 131, int)	/* make wedges */
+
 #endif /* _SYS_DKIO_H_ */

Reply via email to