Module Name:    src
Committed By:   mlelstv
Date:           Tue Dec 30 19:11:05 UTC 2014

Modified Files:
        src/sys/dev: ccd.c

Log Message:
Fix locking error.
Clear EPASSTHROUGH return value from disk_ioctl.
Add missing wedge ioctls.


To generate a diff of this commit:
cvs rdiff -u -r1.156 -r1.157 src/sys/dev/ccd.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/ccd.c
diff -u src/sys/dev/ccd.c:1.156 src/sys/dev/ccd.c:1.157
--- src/sys/dev/ccd.c:1.156	Tue Dec 30 12:42:16 2014
+++ src/sys/dev/ccd.c	Tue Dec 30 19:11:05 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ccd.c,v 1.156 2014/12/30 12:42:16 jnemeth Exp $	*/
+/*	$NetBSD: ccd.c,v 1.157 2014/12/30 19:11:05 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc.
@@ -88,7 +88,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.156 2014/12/30 12:42:16 jnemeth Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.157 2014/12/30 19:11:05 mlelstv Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -1128,6 +1128,10 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	case CCDIOCCLR:
 	case DIOCSDINFO:
 	case DIOCWDINFO:
+	case DIOCCACHESYNC:
+	case DIOCAWEDGE:
+	case DIOCDWEDGE:
+	case DIOCMWEDGES:
 #ifdef __HAVE_OLD_DISKLABEL
 	case ODIOCSDINFO:
 	case ODIOCWDINFO:
@@ -1145,6 +1149,10 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	case CCDIOCCLR:
 	case DIOCGDINFO:
 	case DIOCCACHESYNC:
+	case DIOCAWEDGE:
+	case DIOCDWEDGE:
+	case DIOCLWEDGES:
+	case DIOCMWEDGES:
 	case DIOCSDINFO:
 	case DIOCWDINFO:
 	case DIOCGPART:
@@ -1167,6 +1175,7 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	if (error != EPASSTHROUGH)
 		goto out;
 
+	error = 0;
 	switch (cmd) {
 	case CCDIOCSET:
 		if (cs->sc_flags & CCDF_INITED) {
@@ -1252,8 +1261,6 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 			bufq_free(cs->sc_bufq);
 			goto out;
 		}
-		disk_set_info(NULL, &cs->sc_dkdev, NULL);
-		dkwedge_discover(&cs->sc_dkdev);
 
 		/* We can free the temporary variables now. */
 		kmem_free(vpp, ccio->ccio_ndisks * sizeof(*vpp));
@@ -1271,7 +1278,12 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 
 		/* Try and read the disklabel. */
 		ccdgetdisklabel(dev);
-		break;
+		disk_set_info(NULL, &cs->sc_dkdev, NULL);
+
+		/* discover wedges */
+		mutex_exit(&cs->sc_dvlock);
+		dkwedge_discover(&cs->sc_dkdev);
+		return 0;
 
 	case CCDIOCCLR:
 		/*
@@ -1288,6 +1300,9 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 			goto out;
 		}
 
+		/* Delete all of our wedges. */
+		dkwedge_delall(&cs->sc_dkdev);
+
 		/* Stop new I/O, wait for in-flight I/O to complete. */
 		mutex_enter(cs->sc_iolock);
 		cs->sc_flags &= ~(CCDF_INITED|CCDF_VLABEL);
@@ -1337,7 +1352,6 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 		aprint_normal("%s: detached\n", cs->sc_xname);
 
 		/* Detach the disk. */
-		dkwedge_delall(&cs->sc_dkdev);
 		disk_detach(&cs->sc_dkdev);
 		bufq_free(cs->sc_bufq);
 		ccdput(cs);
@@ -1365,13 +1379,6 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 
 	case DIOCCACHESYNC:
 		/*
-		 * XXX Do we really need to care about having a writable
-		 * file descriptor here?
-		 */
-		if ((flag & FWRITE) == 0)
-			return (EBADF);
-
-		/*
 		 * We pass this call down to all components and report
 		 * the first error we encounter.
 		 */
@@ -1383,6 +1390,42 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 		}
 		break;
 
+	case DIOCAWEDGE:
+	    {
+	    	struct dkwedge_info *dkw = (void *) data;
+
+		/* If the ioctl happens here, the parent is us. */
+		strlcpy(dkw->dkw_parent, cs->sc_xname,
+			sizeof(dkw->dkw_parent));
+		error = dkwedge_add(dkw);
+		break;
+	    }
+
+	case DIOCDWEDGE:
+	    {
+	    	struct dkwedge_info *dkw = (void *) data;
+
+		/* If the ioctl happens here, the parent is us. */
+		strlcpy(dkw->dkw_parent, cs->sc_xname,
+			sizeof(dkw->dkw_parent));
+		error = dkwedge_del(dkw);
+		break;
+	    }
+
+	case DIOCLWEDGES:
+	    {
+	    	struct dkwedge_list *dkwl = (void *) data;
+
+		error = dkwedge_list(&cs->sc_dkdev, dkwl, l);
+		break;
+	    }
+
+	case DIOCMWEDGES:
+	    {
+		dkwedge_discover(&cs->sc_dkdev);
+		break;
+	    }
+
 	case DIOCWDINFO:
 	case DIOCSDINFO:
 #ifdef __HAVE_OLD_DISKLABEL

Reply via email to