diff options
author | alfred <alfred@FreeBSD.org> | 2001-02-20 11:37:04 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2001-02-20 11:37:04 +0000 |
commit | 34c1e918b627c1bbf7db62673e4115a52d254a65 (patch) | |
tree | c3303bdecbfa090f88b766e89baf5250eb9451ea /sys/dev/vinum | |
parent | d6b473bae18b73b9030163daf134be3e41b6bdda (diff) | |
download | FreeBSD-src-34c1e918b627c1bbf7db62673e4115a52d254a65.zip FreeBSD-src-34c1e918b627c1bbf7db62673e4115a52d254a65.tar.gz |
Take a shot at making vinum devfs aware.
Adding make_dev() and destroy_dev() calls in (hopefully) the right
places.
This is done by calling make_dev() in each object constructor and
caching the dev_t's returned from make_dev() in each struct
'subdisk'(sd), 'plex' and 'volume' such that the 'object'_free()
functioncs can call destroy dev.
This change makes a subset of the old /dev/vinum appear under devfs.
Enough nodes appear such that I'm able to mount my striped volume.
There may be more work needed to get vinum configuration working
properly.
Diffstat (limited to 'sys/dev/vinum')
-rw-r--r-- | sys/dev/vinum/vinum.c | 35 | ||||
-rw-r--r-- | sys/dev/vinum/vinumconfig.c | 33 | ||||
-rw-r--r-- | sys/dev/vinum/vinumhdr.h | 1 | ||||
-rw-r--r-- | sys/dev/vinum/vinumvar.h | 7 |
4 files changed, 57 insertions, 19 deletions
diff --git a/sys/dev/vinum/vinum.c b/sys/dev/vinum/vinum.c index b98aabe..ea4f7d2 100644 --- a/sys/dev/vinum/vinum.c +++ b/sys/dev/vinum/vinum.c @@ -53,7 +53,7 @@ extern struct mc malloced[]; #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 @@ STATIC int vinum_modevent(module_t mod, modeventtype_t type, void *unused); 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 @@ vinumattach(void *dummy) 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 @@ free_vinum(int cleardrive) 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 @@ vinum_modevent(module_t mod, modeventtype_t type, void *unused) } } #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; diff --git a/sys/dev/vinum/vinumconfig.c b/sys/dev/vinum/vinumconfig.c index b32607d..60fdbe7 100644 --- a/sys/dev/vinum/vinumconfig.c +++ b/sys/dev/vinum/vinumconfig.c @@ -734,6 +734,7 @@ free_sd(int sdno) 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(int plexno) 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 @@ free_volume(int volno) 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 @@ config_subdisk(int update) 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 @@ config_plex(int update) 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 @@ config_volume(int update) /* 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 @@ remove_sd_entry(int sdno, int force, int recurse) ||(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 @@ remove_sd_entry(int sdno, int force, int recurse) */ 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 */ diff --git a/sys/dev/vinum/vinumhdr.h b/sys/dev/vinum/vinumhdr.h index 2b7d290..d6f6517 100644 --- a/sys/dev/vinum/vinumhdr.h +++ b/sys/dev/vinum/vinumhdr.h @@ -96,3 +96,4 @@ void FFree (void *mem, char *, int); #define Free(x) free ((x)) /* just the address */ #endif +extern struct cdevsw vinum_cdevsw; diff --git a/sys/dev/vinum/vinumvar.h b/sys/dev/vinum/vinumvar.h index d662077..9e61128 100644 --- a/sys/dev/vinum/vinumvar.h +++ b/sys/dev/vinum/vinumvar.h @@ -37,7 +37,7 @@ * 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 $ + * $Id: vinumvar.h,v 1.36 2001/01/14 06:34:57 grog Exp $ * $FreeBSD$ */ @@ -216,7 +216,7 @@ struct devcode { unsigned signbit:1; /* to make 32 bits */ }; -#define VINUM_DIR "/dev/vinum" +#define VINUM_DIR "vinum" /* * These definitions help catch @@ -451,6 +451,7 @@ struct sd { 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 @@ struct plex { 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 @@ struct volume { int plex[MAXPLEX]; /* index of plexes */ char name[MAXVOLNAME]; /* name of volume */ struct disklabel label; /* for DIOCGPART */ + dev_t dev; }; /* |