Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Feb 2001 02:05:56 -0800
From:      Alfred Perlstein <bright@wintelcom.net>
To:        grog@freebsd.org
Cc:        current@freebsd.org
Subject:   please test, vinum + devfs
Message-ID:  <20010219020556.K6641@fw.wintelcom.net>

next in thread | raw e-mail | index | archive | help
This gets my vinum config working enough such that I can mount
my pre-devfs configuration, if anyone wants to test/comment please
try this:  (you'll need to recompile src/sbin/vinum as well)


Index: vinum.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/vinum/vinum.c,v
retrieving revision 1.39
diff -u -r1.39 vinum.c
--- vinum.c	2000/10/23 08:35:36	1.39
+++ vinum.c	2001/02/19 09:54:39
@@ -35,8 +35,8 @@
  * otherwise) arising in any way out of the use of this software, even if
  * advised of the possibility of such damage.
  *
- * $Id: vinum.c,v 1.28 1999/10/12 09:41:20 grog Exp grog $
- * $FreeBSD: src/sys/dev/vinum/vinum.c,v 1.39 2000/10/23 08:35:36 phk Exp $
+ * $Id: vinum.c,v 1.39 2000/10/23 08:35:36 phk Exp $
+ * $FreeBSD: src/sys/dev/vinum/vinum.c,v 1.38 2000/02/29 06:07:39 grog Exp $
  */
 
 #define STATIC static					    /* nothing while we're testing XXX */
@@ -53,7 +53,7 @@
 #endif
 #include <dev/vinum/request.h>
 
-STATIC struct cdevsw vinum_cdevsw =
+struct cdevsw vinum_cdevsw =
 {
     vinumopen, vinumclose, physread, physwrite,
     vinumioctl, seltrue, nommap, vinumstrategy,
@@ -68,6 +68,9 @@
 
 struct _vinum_conf vinum_conf;				    /* configuration information */
 
+dev_t vinum_daemon_dev;
+dev_t vinum_super_dev;
+
 /*
  * Called by main() during pseudo-device attachment.  All we need
  * to do is allocate enough space for devices to be configured later, and
@@ -88,6 +91,10 @@
     dqend = NULL;
 
     cdevsw_add(&vinum_cdevsw);				    /* add the cdevsw entry */
+    vinum_daemon_dev = make_dev(&vinum_cdevsw, VINUM_DAEMON_DEV,
+	UID_ROOT, GID_WHEEL, S_IRUSR|S_IWUSR, VINUM_DAEMON_DEV_NAME);               /* daemon device */
+    vinum_super_dev = make_dev(&vinum_cdevsw, VINUM_SUPERDEV,
+	UID_ROOT, GID_WHEEL, S_IRUSR|S_IWUSR, VINUM_SUPERDEV_NAME);               /* daemon device */
 
     /* allocate space: drives... */
     DRIVE = (struct drive *) Malloc(sizeof(struct drive) * INITIAL_DRIVES);
@@ -174,21 +181,33 @@
 	queue_daemon_request(daemonrq_return, (union daemoninfo) 0); /* stop the daemon */
 	tsleep(&vinumclose, PUSER, "vstop", 1);		    /* and wait for it */
     }
-    if (SD != NULL)
+    if (SD != NULL) {
+	for (i = 0; i < vinum_conf.subdisks_allocated; i++) {
+	    struct sd *sd = &vinum_conf.sd[i];
+
+	    if (sd->state != sd_unallocated)
+		free_sd(i);
+	}
 	Free(SD);
+    }
     if (PLEX != NULL) {
 	for (i = 0; i < vinum_conf.plexes_allocated; i++) {
 	    struct plex *plex = &vinum_conf.plex[i];
 
-	    if (plex->state != plex_unallocated) {	    /* we have real data there */
-		if (plex->sdnos)
-		    Free(plex->sdnos);
-	    }
+	    if (plex->state != plex_unallocated)	    /* we have real data there */
+		free_plex(i);
 	}
 	Free(PLEX);
     }
-    if (VOL != NULL)
+    if (VOL != NULL) {
+	for (i = 0; i < vinum_conf.volumes_allocated; i++) {
+	    struct volume *volume = &vinum_conf.volume[i];
+
+	    if (volume->state != volume_unallocated)
+		free_volume(i);
+	}
 	Free(VOL);
+    }
     bzero(&vinum_conf, sizeof(vinum_conf));
 }
 
@@ -236,6 +255,8 @@
 	    }
 	}
 #endif
+	destroy_dev(vinum_daemon_dev);               /* daemon device */
+	destroy_dev(vinum_super_dev);
 	cdevsw_remove(&vinum_cdevsw);
 	log(LOG_INFO, "vinum: unloaded\n");		    /* tell the world */
 	return 0;
Index: vinumconfig.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/vinum/vinumconfig.c,v
retrieving revision 1.38
diff -u -r1.38 vinumconfig.c
--- vinumconfig.c	2001/02/02 07:14:13	1.38
+++ vinumconfig.c	2001/02/19 10:05:10
@@ -734,6 +734,7 @@
 	    sd->sectors);
     if (sd->plexno >= 0)
 	PLEX[sd->plexno].subdisks--;			    /* one less subdisk */
+    destroy_dev(sd->dev);
     bzero(sd, sizeof(struct sd));			    /* and clear it out */
     sd->state = sd_unallocated;
     vinum_conf.subdisks_used--;				    /* one less sd */
@@ -811,6 +812,7 @@
 	Free(plex->sdnos);
     if (plex->lock)
 	Free(plex->lock);
+    destroy_dev(plex->dev);
     bzero(plex, sizeof(struct plex));			    /* and clear it out */
     plex->state = plex_unallocated;
 }
@@ -881,6 +883,7 @@
     struct volume *vol;
 
     vol = &VOL[volno];
+    destroy_dev(vol->dev);
     bzero(vol, sizeof(struct volume));			    /* and clear it out */
     vol->state = volume_unallocated;
 }
@@ -1220,6 +1223,8 @@
     if (sd->sectors < 0)
 	throw_rude_remark(EINVAL, "sd %s has no length spec", sd->name);
 
+    sd->dev = make_dev(&vinum_cdevsw, VINUMRMINOR(VINUM_SD_TYPE, sdno),
+	UID_ROOT, GID_WHEEL, S_IRUSR|S_IWUSR, "vinum/sd/%s", sd->name);
     if (state != sd_unallocated)			    /* we had a specific state to set */
 	sd->state = state;				    /* do it now */
     else if (sd->state == sd_unallocated)		    /* no, nothing set yet, */
@@ -1377,6 +1382,9 @@
     if (plex->organization == plex_disorg)
 	throw_rude_remark(EINVAL, "No plex organization specified");
 
+    plex->dev = make_dev(&vinum_cdevsw, VINUMRMINOR(VINUM_PLEX_TYPE, plexno),
+	UID_ROOT, GID_WHEEL, S_IRUSR|S_IWUSR, "vinum/plex/%s", plex->name);
+
     if ((plex->volno < 0)				    /* we don't have a volume */
     &&(!detached))					    /* and we wouldn't object */
 	plex->volno = current_volume;
@@ -1534,7 +1542,10 @@
     /* Find out how big our volume is */
     for (i = 0; i < vol->plexes; i++)
 	vol->size = max(vol->size, PLEX[vol->plex[i]].length);
+
     vinum_conf.volumes_used++;				    /* one more in use */
+    vol->dev = make_dev(&vinum_cdevsw, VINUMRMINOR(VINUM_VOLUME_TYPE, volno),
+	UID_ROOT, GID_WHEEL, S_IRUSR|S_IWUSR, "vinum/vol/%s", vol->name);
 }
 
 /*
@@ -1686,23 +1697,29 @@
     ||(sd->state == sd_unallocated)) {			    /* or nothing there */
 	ioctl_reply->error = EINVAL;
 	strcpy(ioctl_reply->msg, "No such subdisk");
+	return;
     } else if (sd->flags & VF_OPEN) {			    /* we're open */
 	ioctl_reply->error = EBUSY;			    /* no getting around that */
 	return;
     } else if (sd->plexno >= 0) {			    /* we have a plex */
-	if (force) {					    /* do it at any cost */
+	if (!force) {					    /* do it at any cost */
+	    ioctl_reply->error = EBUSY;			    /* can't do that */
+	    return;
+	} else {
 	    struct plex *plex = &PLEX[sd->plexno];	    /* point to our plex */
 	    int mysdno;
 
 	    for (mysdno = 0;				    /* look for ourselves */
 		mysdno < plex->subdisks && &SD[plex->sdnos[mysdno]] != sd;
 		mysdno++);
-	    if (mysdno == plex->subdisks)		    /* didn't find it */
+	    if (mysdno == plex->subdisks) {		    /* didn't find it */
 		log(LOG_ERR,
 		    "Error removing subdisk %s: not found in plex %s\n",
 		    SD[mysdno].name,
 		    plex->name);
-	    else {					    /* remove the subdisk from plex */
+		ioctl_reply->error = EINVAL;
+		return;
+	    } else {					    /* remove the subdisk from plex */
 		if (mysdno < (plex->subdisks - 1))	    /* not the last subdisk */
 		    bcopy(&plex->sdnos[mysdno + 1],
 			&plex->sdnos[mysdno],
@@ -1719,14 +1736,10 @@
 	     */
 	    if (plex->organization != plex_concat)	    /* not concatenated, */
 		set_plex_state(plex->plexno, plex_faulty, setstate_force); /* need to reinitialize */
-	    log(LOG_INFO, "vinum: removing %s\n", sd->name);
-	    free_sd(sdno);
-	} else
-	    ioctl_reply->error = EBUSY;			    /* can't do that */
-    } else {
-	log(LOG_INFO, "vinum: removing %s\n", sd->name);
-	free_sd(sdno);
+	}
     }
+    log(LOG_INFO, "vinum: removing %s\n", sd->name);
+    free_sd(sdno);
 }
 
 /* remove a plex */
Index: vinumhdr.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/vinum/vinumhdr.h,v
retrieving revision 1.22
diff -u -r1.22 vinumhdr.h
--- vinumhdr.h	2001/01/21 19:25:04	1.22
+++ vinumhdr.h	2001/02/18 23:49:36
@@ -36,8 +36,8 @@
 
 /* Header files used by all modules */
 /*
- * $Id: vinumhdr.h,v 1.18 2001/01/04 00:14:14 grog Exp grog $
- * $FreeBSD: src/sys/dev/vinum/vinumhdr.h,v 1.22 2001/01/21 19:25:04 jake Exp $
+ * $Id: vinumhdr.h,v 1.22 2001/01/21 19:25:04 jake Exp $
+ * $FreeBSD: src/sys/dev/vinum/vinumhdr.h,v 1.21 2001/01/10 21:42:06 grog Exp $
  */
 
 #include <sys/param.h>
@@ -96,3 +96,4 @@
 #define Free(x)	   free ((x))				    /* just the address */
 #endif
 
+extern struct cdevsw vinum_cdevsw;
Index: vinumvar.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/vinum/vinumvar.h,v
retrieving revision 1.36
diff -u -r1.36 vinumvar.h
--- vinumvar.h	2001/01/14 06:34:57	1.36
+++ vinumvar.h	2001/02/19 09:43:58
@@ -37,8 +37,8 @@
  * otherwise) arising in any way out of the use of this software, even if
  * advised of the possibility of such damage.
  *
- * $Id: vinumvar.h,v 1.24 2000/03/01 02:34:57 grog Exp grog $
- * $FreeBSD: src/sys/dev/vinum/vinumvar.h,v 1.36 2001/01/14 06:34:57 grog Exp $
+ * $Id: vinumvar.h,v 1.36 2001/01/14 06:34:57 grog Exp $
+ * $FreeBSD$
  */
 
 #include <sys/time.h>
@@ -216,7 +216,7 @@
     unsigned signbit:1;					    /* to make 32 bits */
 };
 
-#define VINUM_DIR   "/dev/vinum"
+#define VINUM_DIR   "vinum"
 
 /*
  * These definitions help catch
@@ -451,6 +451,7 @@
     int init_blocksize;					    /* init block size (bytes) */
     int init_interval;					    /* and time to wait between transfers */
     char name[MAXSDNAME];				    /* name of subdisk */
+    dev_t dev;
 };
 
 /*** Plex definitions ***/
@@ -498,6 +499,7 @@
     u_int64_t multistripe;				    /* requests that needed more than one stripe */
     int sddowncount;					    /* number of subdisks down */
     char name[MAXPLEXNAME];				    /* name of plex */
+    dev_t dev;
 };
 
 /*** Volume definitions ***/
@@ -537,6 +539,7 @@
     int plex[MAXPLEX];					    /* index of plexes */
     char name[MAXVOLNAME];				    /* name of volume */
     struct disklabel label;				    /* for DIOCGPART */
+    dev_t dev;
 };
 
 /*

-- 
-Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
"I have the heart of a child; I keep it in a jar on my desk."


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010219020556.K6641>