Module Name:    src
Committed By:   jdolecek
Date:           Thu Mar 30 16:50:33 UTC 2017

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

Log Message:
support DIOCGCACHE - result is intersection of flags returned by underlying
devices; devices can't be added or removed, so the feature flags remain
static

add support for DIOCGSTRATEGY while here, mainly to make dkctl(8) output neater


To generate a diff of this commit:
cvs rdiff -u -r1.169 -r1.170 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.169 src/sys/dev/ccd.c:1.170
--- src/sys/dev/ccd.c:1.169	Sun Mar  5 23:07:12 2017
+++ src/sys/dev/ccd.c	Thu Mar 30 16:50:32 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ccd.c,v 1.169 2017/03/05 23:07:12 mlelstv Exp $	*/
+/*	$NetBSD: ccd.c,v 1.170 2017/03/30 16:50:32 jdolecek 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.169 2017/03/05 23:07:12 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.170 2017/03/30 16:50:32 jdolecek Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -1182,6 +1182,8 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	switch (cmd) {
 	case CCDIOCCLR:
 	case DIOCGDINFO:
+	case DIOCGSTRATEGY:
+	case DIOCGCACHE:
 	case DIOCCACHESYNC:
 	case DIOCAWEDGE:
 	case DIOCDWEDGE:
@@ -1393,6 +1395,50 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 		/* Don't break, otherwise cs is read again. */
 		return 0;
 
+	case DIOCGSTRATEGY:
+	    {
+		struct disk_strategy *dks = (void *)data;
+
+		mutex_enter(cs->sc_iolock);
+		if (cs->sc_bufq != NULL)
+			strlcpy(dks->dks_name,
+			    bufq_getstrategyname(cs->sc_bufq),
+			    sizeof(dks->dks_name));
+		else
+			error = EINVAL;
+		mutex_exit(cs->sc_iolock);
+		dks->dks_paramlen = 0;
+		break;
+	    }
+
+	case DIOCGCACHE:
+	    {
+		int dkcache = 0;
+
+		/*
+		 * We pass this call down to all components and report
+		 * intersection of the flags returned by the components.
+		 * If any errors out, we return error. CCD components
+		 * can not change unless the device is unconfigured, so
+		 * device feature flags will remain static. RCE/WCE can change
+		 * of course, if set directly on underlying device.
+		 */
+		for (error = 0, i = 0; i < cs->sc_nccdisks; i++) {
+			error = VOP_IOCTL(cs->sc_cinfo[i].ci_vp, cmd, &j,
+				      flag, uc);
+			if (error)
+				break;
+
+			if (i == 0)
+				dkcache = j;
+			else
+				dkcache &= j;
+		}
+
+		*((int *)data) = dkcache;
+		break;
+	    }
+
 	case DIOCCACHESYNC:
 		/*
 		 * We pass this call down to all components and report

Reply via email to