Module Name:    src
Committed By:   bouyer
Date:           Wed Aug 22 20:29:21 UTC 2012

Modified Files:
        src/sys/dev [netbsd-5]: vnd.c

Log Message:
Apply patch, requested by buhrow in ticket 1771
        sys/dev/vnd.c:          patch
Implement wedge ioctls and wedge autodiscovery for vnd(4)


To generate a diff of this commit:
cvs rdiff -u -r1.187.4.5 -r1.187.4.6 src/sys/dev/vnd.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/dev/vnd.c
diff -u src/sys/dev/vnd.c:1.187.4.5 src/sys/dev/vnd.c:1.187.4.6
--- src/sys/dev/vnd.c:1.187.4.5	Sat Dec 31 22:11:12 2011
+++ src/sys/dev/vnd.c	Wed Aug 22 20:29:20 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnd.c,v 1.187.4.5 2011/12/31 22:11:12 snj Exp $	*/
+/*	$NetBSD: vnd.c,v 1.187.4.6 2012/08/22 20:29:20 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -130,7 +130,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.187.4.5 2011/12/31 22:11:12 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.187.4.6 2012/08/22 20:29:20 bouyer Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "fs_nfs.h"
@@ -253,6 +253,8 @@ extern struct cfdriver vnd_cd;
 static struct vnd_softc	*vnd_spawn(int);
 int	vnd_destroy(device_t);
 
+static struct	dkdriver vnddkdriver = { vndstrategy, minphys };
+
 void
 vndattach(int num)
 {
@@ -281,7 +283,7 @@ vnd_attach(device_t parent, device_t sel
 	sc->sc_comp_buff = NULL;
 	sc->sc_comp_decombuf = NULL;
 	bufq_alloc(&sc->sc_tab, "disksort", BUFQ_SORT_RAWBLOCK);
-	disk_init(&sc->sc_dkdev, device_xname(self), NULL);
+	disk_init(&sc->sc_dkdev, device_xname(self), &vnddkdriver);
 	if (!pmf_device_register(self, NULL, NULL))
 		aprint_error_dev(self, "couldn't establish power handler\n");
 }
@@ -362,8 +364,20 @@ vndopen(dev_t dev, int flags, int mode, 
 	 * not already valid.
 	 */
 	if ((sc->sc_flags & (VNF_INITED|VNF_VLABEL)) == VNF_INITED &&
-	    sc->sc_dkdev.dk_openmask == 0)
-		vndgetdisklabel(dev, sc);
+	    sc->sc_dkdev.dk_openmask == 0) {
+		/*See if we have wedges, then check for the disklabel*/
+		if (sc->sc_dkdev.dk_nwedges == 0) 
+			vndgetdisklabel(dev, sc);
+	}
+
+	/*
+	 * If there are wedges, and this is not RAW_PART, then we
+	 * need to fail.
+	 */
+	if (sc->sc_dkdev.dk_nwedges != 0 && part != RAW_PART) {
+		error = EBUSY;
+		goto done;
+	}
 
 	/* Check that the partitions exists. */
 	if (part != RAW_PART) {
@@ -975,6 +989,8 @@ vndioctl(dev_t dev, u_long cmd, void *da
 #ifdef __HAVE_OLD_DISKLABEL
 	struct disklabel newlabel;
 #endif
+	struct dkwedge_info *dkw;
+	struct dkwedge_list *dkwl;
 
 #ifdef DEBUG
 	if (vnddebug & VDB_FOLLOW)
@@ -1261,7 +1277,15 @@ vndioctl(dev_t dev, u_long cmd, void *da
 		    0, 0, "vndxpl", NULL, IPL_BIO);
 
 		/* Try and read the disklabel. */
-		vndgetdisklabel(dev, vnd);
+		/*Discover wedges if there are any*/
+		vndgetdefaultlabel(vnd, vnd->sc_dkdev.dk_label); /*XXX: */
+		vndunlock(vnd); /*XXX*/
+		dkwedge_discover(&vnd->sc_dkdev);
+		if ((error = vndlock(vnd)) != 0)
+			goto close_and_exit;
+
+		if (vnd->sc_dkdev.dk_nwedges == 0)
+			vndgetdisklabel(dev, vnd);
 
 		vndunlock(vnd);
 
@@ -1322,6 +1346,7 @@ unlock_and_exit:
 		pool_destroy(&vnd->sc_vxpool);
 
 		/* Detatch the disk. */
+		dkwedge_delall(&vnd->sc_dkdev);
 		disk_detach(&vnd->sc_dkdev);
 		break;
 
@@ -1466,6 +1491,33 @@ unlock_and_exit:
 		VOP_UNLOCK(vnd->sc_vp, 0);
 		return error;
 
+	case DIOCAWEDGE:
+		dkw = (void *) data;
+
+		if ((flag & FWRITE) == 0)
+			return EBADF;
+
+		/* If the ioctl happens here, the parent is us. */
+		strlcpy(dkw->dkw_parent, device_xname(vnd->sc_dev),
+		    sizeof(dkw->dkw_parent));
+		return dkwedge_add(dkw);
+
+	case DIOCDWEDGE:
+		dkw = (void *) data;
+
+		if ((flag & FWRITE) == 0)
+			return EBADF;
+
+		/* If the ioctl happens here, the parent is us. */
+		strlcpy(dkw->dkw_parent, device_xname(vnd->sc_dev),
+		    sizeof(dkw->dkw_parent));
+		return dkwedge_del(dkw);
+
+	case DIOCLWEDGES:
+		dkwl = (void *) data;
+
+		return dkwedge_list(&vnd->sc_dkdev, dkwl, l);
+
 	default:
 		return (ENOTTY);
 	}

Reply via email to