diff --git a/sys/dev/vinum/vinumutil.c b/sys/dev/vinum/vinumutil.c index 0b5ef0f4968e..22d8be8431dd 100644 --- a/sys/dev/vinum/vinumutil.c +++ b/sys/dev/vinum/vinumutil.c @@ -33,7 +33,7 @@ * otherwise) arising in any way out of the use of this software, even if * advised of the possibility of such damage. * - * $Id: util.c,v 1.3 1998/12/28 04:56:24 peter Exp $ + * $Id: vinumutil.c,v 1.10 1999/01/02 00:39:04 grog Exp grog $ */ /* This file contains utility routines used both in kernel and user context */ @@ -100,6 +100,9 @@ plex_org(enum plexorg org) return "striped"; break; + case plex_raid5: /* RAID5 plex */ + return "raid5"; + break; default: sprintf(numeric_state, "Invalid org %d", (int) org); @@ -212,3 +215,66 @@ sizespec(char *spec) /* NOTREACHED */ return -1; } + +/* Extract the volume number from a device number. + * Perform no checking. */ +int +Volno(dev_t dev) +{ + int x = (int) dev; + return (x & MASK(VINUM_VOL_WIDTH)) >> VINUM_VOL_SHIFT; +} + +/* Extract a plex number from a device number. + * Don't check the major number, but check the + * type. Return -1 for invalid types. */ +int +Plexno(dev_t dev) +{ + int x = (int) dev; + + switch (DEVTYPE(dev)) { + case VINUM_VOLUME_TYPE: + case VINUM_DRIVE_TYPE: + case VINUM_SUPERDEV_TYPE: + case VINUM_RAWSD_TYPE: + return -1; + + case VINUM_PLEX_TYPE: + case VINUM_SD_TYPE: + return VOL[Volno(x)].plex[(x >> VINUM_PLEX_SHIFT) & (MASK(VINUM_PLEX_WIDTH))]; + + case VINUM_RAWPLEX_TYPE: + return ((x & MASK(VINUM_VOL_WIDTH)) >> VINUM_VOL_SHIFT) /* low order 8 bits */ + |((x >> VINUM_RAWPLEX_SHIFT) + & (MASK(VINUM_RAWPLEX_WIDTH) + << (VINUM_VOL_SHIFT + VINUM_VOL_WIDTH))); /* upper 12 bits */ + } + return 0; /* compiler paranoia */ +} + +/* Extract a subdisk number from a device number. + * Don't check the major number, but check the + * type. Return -1 for invalid types. */ +int +Sdno(dev_t dev) +{ + int x = (int) dev; + + switch (DEVTYPE(dev)) { + case VINUM_VOLUME_TYPE: + case VINUM_DRIVE_TYPE: + case VINUM_SUPERDEV_TYPE: + case VINUM_PLEX_TYPE: + case VINUM_RAWPLEX_TYPE: + return -1; + + case VINUM_SD_TYPE: + return PLEX[Plexno(x)].sdnos[(x >> VINUM_SD_SHIFT) & (MASK(VINUM_SD_WIDTH))]; + + case VINUM_RAWSD_TYPE: + return ((x & MASK(VINUM_VOL_WIDTH)) >> VINUM_VOL_SHIFT) /* low order 8 bits */ + |((x >> VINUM_RAWPLEX_SHIFT) & (MASK(VINUM_RAWPLEX_WIDTH) << (VINUM_VOL_SHIFT + VINUM_VOL_WIDTH))); /* upper 12 bits */ + } + return -1; /* compiler paranoia */ +}