Change the kernel dev_t, representing a pointer to a specinfo structure,
[dragonfly.git] / sys / dev / raid / vinum / vinum.c
index 37c97bf..a45dd57 100644 (file)
@@ -37,7 +37,7 @@
  *
  * $Id: vinum.c,v 1.33 2001/01/09 06:19:15 grog Exp grog $
  * $FreeBSD: src/sys/dev/vinum/vinum.c,v 1.38.2.3 2003/01/07 12:14:16 joerg Exp $
- * $DragonFly: src/sys/dev/raid/vinum/vinum.c,v 1.11 2004/05/19 22:52:48 dillon Exp $
+ * $DragonFly: src/sys/dev/raid/vinum/vinum.c,v 1.18 2006/09/10 01:26:36 dillon Exp $
  */
 
 #define STATIC static                                      /* nothing while we're testing XXX */
@@ -54,17 +54,17 @@ extern struct mc malloced[];
 #endif
 #include "request.h"
 
-struct cdevsw vinum_cdevsw =
+struct dev_ops vinum_ops =
 {
-    /* name */ "vinum",
-    /* cmaj */ VINUM_CDEV_MAJOR, 
-    /* flags */ D_DISK,
-    /* port */ NULL,
-    /* clone */        NULL,
-
-    vinumopen, vinumclose, physread, physwrite,
-    vinumioctl, seltrue, nommap, vinumstrategy,
-    vinumdump, vinumsize,
+       { "vinum", VINUM_CDEV_MAJOR, D_DISK },
+       .d_open =       vinumopen,
+       .d_close =      vinumclose,
+       .d_read =       physread,
+       .d_write =      physwrite,
+       .d_ioctl =      vinumioctl,
+       .d_poll =       vinumpoll,
+       .d_strategy =   vinumstrategy,
+       .d_dump =       vinumdump,
 };
 
 /* Called by main() during pseudo-device attachment. */
@@ -96,7 +96,9 @@ vinumattach(void *dummy)
     daemonq = NULL;                                        /* initialize daemon's work queue */
     dqend = NULL;
 
-    cdevsw_add(&vinum_cdevsw, 0, 0);                       /* add the cdevsw entry */
+    dev_ops_add(&vinum_ops, 0, 0);                         /* add the ops entry */
+
+    vinum_conf.physbufs = nswbuf / 2 + 1;                  /* maximum amount of physical bufs */
 
     /* allocate space: drives... */
     DRIVE = (struct drive *) Malloc(sizeof(struct drive) * INITIAL_DRIVES);
@@ -130,14 +132,14 @@ vinumattach(void *dummy)
      * See if the loader has passed us a disk to
      * read the initial configuration from.
      */
-    if ((cp = getenv("vinum.drives")) != NULL) {
+    if ((cp = kgetenv("vinum.drives")) != NULL) {
        for (cp1 = cp, i = 0, drives = 0; *cp1 != '\0'; i++) {
            cp2 = cp1;
            while (*cp1 != '\0' && *cp1 != ',' && *cp1 != ' ')
                cp1++;
            if (*cp1 != '\0')
                *cp1++ = '\0';
-           drives = realloc(drives, (unsigned long)((i + 1) * sizeof(char *)),
+           drives = krealloc(drives, (unsigned long)((i + 1) * sizeof(char *)),
                             M_TEMP, M_WAITOK);
            drives[i] = cp2;
        }
@@ -147,15 +149,15 @@ vinumattach(void *dummy)
        if (rv)
            log(LOG_NOTICE, "vinum_scandisk() returned %d", rv);
     bailout:
-       free(drives, M_TEMP);
+       kfree(drives, M_TEMP);
     }
-    if ((cp = getenv("vinum.root")) != NULL) {
+    if ((cp = kgetenv("vinum.root")) != NULL) {
        for (i = 0; i < vinum_conf.volumes_used; i++) {
            vol = &vinum_conf.volume[i];
            if ((vol->state == volume_up)
                && (strcmp (vol->name, cp) == 0) 
            ) {
-               rootdev = make_dev(&vinum_cdevsw, i, UID_ROOT, GID_OPERATOR,
+               rootdev = make_dev(&vinum_ops, i, UID_ROOT, GID_OPERATOR,
                                0640, "vinum");
                log(LOG_INFO, "vinum: using volume %s for root device\n", cp);
                break;
@@ -248,7 +250,7 @@ vinum_modevent(module_t mod, modeventtype_t type, void *unused)
        if (!vinum_inactive(1))                             /* is anything open? */
            return EBUSY;                                   /* yes, we can't do it */
        vinum_conf.flags |= VF_STOPPING;                    /* note that we want to stop */
-       sync(NULL);                         /* write out buffers */
+       sys_sync(NULL);                     /* write out buffers */
        free_vinum(0);                                      /* clean up */
 #ifdef VINUMDEBUG
        if (total_malloced) {
@@ -278,7 +280,7 @@ vinum_modevent(module_t mod, modeventtype_t type, void *unused)
            }
        }
 #endif
-       cdevsw_remove(&vinum_cdevsw, 0, 0);
+       dev_ops_remove(&vinum_ops, 0, 0);
        log(LOG_INFO, "vinum: unloaded\n");                 /* tell the world */
        return 0;
     default:
@@ -298,8 +300,9 @@ DECLARE_MODULE(vinum, vinum_mod, SI_SUB_RAID, SI_ORDER_MIDDLE);
 /* ARGSUSED */
 /* Open a vinum object */
 int
-vinumopen(dev_t dev, int flags, int fmt, d_thread_t *td)
+vinumopen(struct dev_open_args *ap)
 {
+    cdev_t dev = ap->a_head.a_dev;
     int error;
     unsigned int index;
     struct volume *vol;
@@ -383,7 +386,7 @@ vinumopen(dev_t dev, int flags, int fmt, d_thread_t *td)
        }
 
     case VINUM_SUPERDEV_TYPE:
-       error = suser(td);                  /* are we root? */
+       error = suser_cred(ap->a_cred, 0);                  /* are we root? */
        if (error == 0) {                                   /* yes, can do */
            if (devminor == VINUM_DAEMON_DEV)               /* daemon device */
                vinum_conf.flags |= VF_DAEMONOPEN;          /* we're open */
@@ -404,8 +407,9 @@ vinumopen(dev_t dev, int flags, int fmt, d_thread_t *td)
 
 /* ARGSUSED */
 int
-vinumclose(dev_t dev, int flags, int fmt, d_thread_t *td)
+vinumclose(struct dev_close_args *ap)
 {
+    cdev_t dev = ap->a_head.a_dev;
     unsigned int index;
     struct volume *vol;
     int devminor;
@@ -482,28 +486,35 @@ vinumclose(dev_t dev, int flags, int fmt, d_thread_t *td)
 
 /* size routine */
 int
-vinumsize(dev_t dev)
+vinumsize(struct dev_psize_args *ap)
 {
+    cdev_t dev = ap->a_head.a_dev;
     struct volume *vol;
-    int size;
 
     vol = &VOL[Volno(dev)];
 
-    if (vol->state == volume_up)
-       size = vol->size;
-    else
-       return 0;                                           /* err on the size of conservatism */
-
-    return size;
+    if (vol->state == volume_up) {
+       ap->a_result = vol->size;
+       return(0);
+    } else {
+       return(ENXIO);
+    }
 }
 
 int
-vinumdump(dev_t dev, u_int count, u_int blkno, u_int secsize)
+vinumdump(struct dev_dump_args *ap)
 {
     /* Not implemented. */
     return ENXIO;
 }
 
+int
+vinumpoll(struct dev_poll_args *ap)
+{
+    ap->a_events = seltrue(ap->a_head.a_dev, ap->a_events);
+    return(0);
+}
+
 /* Local Variables: */
 /* fill-column: 50 */
 /* End: */