Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/ata add support for DIOCCACHESYNC (!), and DIOCGCACH...



details:   https://anonhg.NetBSD.org/src/rev/5f5cb2ff5e59
branches:  trunk
changeset: 994181:5f5cb2ff5e59
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Tue Oct 23 22:05:01 2018 +0000

description:
add support for DIOCCACHESYNC (!), and DIOCGCACHE; code adapted from ccd(4)

tested with Intel ATA Raid

diffstat:

 sys/dev/ata/TODO.ncq     |   3 +-
 sys/dev/ata/ld_ataraid.c |  73 ++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 73 insertions(+), 3 deletions(-)

diffs (118 lines):

diff -r 23df28fb17f7 -r 5f5cb2ff5e59 sys/dev/ata/TODO.ncq
--- a/sys/dev/ata/TODO.ncq      Tue Oct 23 20:09:40 2018 +0000
+++ b/sys/dev/ata/TODO.ncq      Tue Oct 23 22:05:01 2018 +0000
@@ -15,4 +15,5 @@
 
 add support for the NCQ TRIM if supported by device?
 
-implement DIOCGCACHE/DIOCCACHESYNC for ld@ataraid? just passthrough, like ccd
+ahcisata(4)/siisata(4) - enable detach on shutdown, and fix the issue
+with atabus being detached several times
diff -r 23df28fb17f7 -r 5f5cb2ff5e59 sys/dev/ata/ld_ataraid.c
--- a/sys/dev/ata/ld_ataraid.c  Tue Oct 23 20:09:40 2018 +0000
+++ b/sys/dev/ata/ld_ataraid.c  Tue Oct 23 22:05:01 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ld_ataraid.c,v 1.47 2018/10/22 19:36:28 jdolecek Exp $ */
+/*     $NetBSD: ld_ataraid.c,v 1.48 2018/10/23 22:05:01 jdolecek Exp $ */
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld_ataraid.c,v 1.47 2018/10/22 19:36:28 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld_ataraid.c,v 1.48 2018/10/23 22:05:01 jdolecek Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "bio.h"
@@ -102,6 +102,8 @@
 static void    ld_ataraid_attach(device_t, device_t, void *);
 
 static int     ld_ataraid_dump(struct ld_softc *, void *, int, int);
+static int     ld_ataraid_ioctl(struct ld_softc *, u_long, void *, int32_t,
+    bool);
 
 static int     cbufpool_ctor(void *, void *, int);
 static void    cbufpool_dtor(void *, void *);
@@ -170,6 +172,7 @@
        ld->sc_secsize = 512;                           /* XXX */
        ld->sc_maxqueuecnt = 128;                       /* XXX */
        ld->sc_dump = ld_ataraid_dump;
+       ld->sc_ioctl = ld_ataraid_ioctl;
 
        switch (aai->aai_level) {
        case AAI_L_SPAN:
@@ -715,6 +718,72 @@
 }
 #endif /* NBIO > 0 */
 
+static int
+ld_ataraid_ioctl(struct ld_softc *ld, u_long cmd, void *addr, int32_t flag,
+    bool poll)
+{
+       struct ld_ataraid_softc *sc = (void *)ld;
+       int error, i, j;
+       kauth_cred_t uc;
+
+       uc = kauth_cred_get();
+
+       switch (cmd) {
+       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. ATA RAID components
+                * can only change via BIOS, device feature flags will remain
+                * static. RCE/WCE can change if set directly on underlying
+                * device.
+                */
+               for (error = 0, i = 0; i < sc->sc_aai->aai_ndisks; i++) {
+                       KASSERT(sc->sc_vnodes[i] != NULL);
+
+                       error = VOP_IOCTL(sc->sc_vnodes[i], cmd, &j,
+                                     flag, uc);
+                       if (error)
+                               break;
+
+                       if (i == 0)
+                               dkcache = j;
+                       else
+                               dkcache = DKCACHE_COMBINE(dkcache, j);
+               }
+
+               *((int *)addr) = dkcache;
+               break;
+           }
+
+       case DIOCCACHESYNC:
+           {
+               /*
+                * We pass this call down to all components and report
+                * the first error we encounter.
+                */
+               for (error = 0, i = 0; i < sc->sc_aai->aai_ndisks; i++) {
+                       KASSERT(sc->sc_vnodes[i] != NULL);
+
+                       j = VOP_IOCTL(sc->sc_vnodes[i], cmd, addr,
+                                     flag, uc);
+                       if (j != 0 && error == 0)
+                               error = j;
+               }
+               break;
+           }
+
+       default:
+               error = EPASSTHROUGH;
+               break;
+       }
+
+       return error;
+}
+
 MODULE(MODULE_CLASS_DRIVER, ld_ataraid, "ld,ataraid");
 
 #ifdef _MODULE



Home | Main Index | Thread Index | Old Index