summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2013-04-27 21:18:42 +0000
committerchristos <christos@NetBSD.org>2013-04-27 21:18:42 +0000
commit35b6dc7eb70279c4f7600220f38398feeb8fedf5 (patch)
tree53698c65d0d01718b811a6f06ed2721bf006e8d8 /sys/dev/raidframe
parent7e6c0e7c7f773e6ffc31086c465c60d871ffa790 (diff)
allocate devices dynamically.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_engine.c6
-rw-r--r--sys/dev/raidframe/rf_netbsd.h4
-rw-r--r--sys/dev/raidframe/rf_netbsdkintf.c339
-rw-r--r--sys/dev/raidframe/rf_raid.h3
4 files changed, 160 insertions, 192 deletions
diff --git a/sys/dev/raidframe/rf_engine.c b/sys/dev/raidframe/rf_engine.c
index c579e00ccea..e2a566f9a60 100644
--- a/sys/dev/raidframe/rf_engine.c
+++ b/sys/dev/raidframe/rf_engine.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_engine.c,v 1.47 2011/09/07 07:46:45 mbalmer Exp $ */
+/* $NetBSD: rf_engine.c,v 1.48 2013/04/27 21:18:42 christos Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -55,7 +55,7 @@
****************************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_engine.c,v 1.47 2011/09/07 07:46:45 mbalmer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_engine.c,v 1.48 2013/04/27 21:18:42 christos Exp $");
#include <sys/errno.h>
@@ -862,7 +862,7 @@ rf_RaidIOThread(RF_ThreadArg_t arg)
while (!raidPtr->shutdown_raidio) {
/* if there is nothing to do, then snooze. */
if (TAILQ_EMPTY(&(raidPtr->iodone)) &&
- rf_buf_queue_check(raidPtr->raidid)) {
+ rf_buf_queue_check(raidPtr)) {
rf_wait_cond2(raidPtr->iodone_cv, raidPtr->iodone_lock);
}
diff --git a/sys/dev/raidframe/rf_netbsd.h b/sys/dev/raidframe/rf_netbsd.h
index b603ee1ce91..28c339a7dcf 100644
--- a/sys/dev/raidframe/rf_netbsd.h
+++ b/sys/dev/raidframe/rf_netbsd.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsd.h,v 1.29 2008/04/28 20:23:56 martin Exp $ */
+/* $NetBSD: rf_netbsd.h,v 1.30 2013/04/27 21:18:42 christos Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -83,7 +83,7 @@ struct RF_Pools_s {
extern struct RF_Pools_s rf_pools;
void rf_pool_init(struct pool *, size_t, const char *, size_t, size_t);
-int rf_buf_queue_check(int);
+int rf_buf_queue_check(RF_Raid_t *);
/* XXX probably belongs in a different .h file. */
typedef struct RF_AutoConfig_s {
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c
index 34d1bec5bac..d5679b6b5cd 100644
--- a/sys/dev/raidframe/rf_netbsdkintf.c
+++ b/sys/dev/raidframe/rf_netbsdkintf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsdkintf.c,v 1.299 2013/02/18 19:42:54 oster Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.300 2013/04/27 21:18:42 christos Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
***********************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.299 2013/02/18 19:42:54 oster Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.300 2013/04/27 21:18:42 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -159,8 +159,6 @@ int rf_kdebug_level = 0;
#define db1_printf(a) { }
#endif /* DEBUG */
-static RF_Raid_t **raidPtrs; /* global raid device descriptors */
-
#if (RF_INCLUDE_PARITY_DECLUSTERING_DS > 0)
static rf_declare_mutex2(rf_sparet_wait_mutex);
static rf_declare_cond2(rf_sparet_wait_cv);
@@ -179,7 +177,8 @@ static void KernelWakeupFunc(struct buf *);
static void InitBP(struct buf *, struct vnode *, unsigned,
dev_t, RF_SectorNum_t, RF_SectorCount_t, void *, void (*) (struct buf *),
void *, int, struct proc *);
-static void raidinit(RF_Raid_t *);
+struct raid_softc;
+static void raidinit(struct raid_softc *);
void raidattach(int);
static int raid_match(device_t, cfdata_t, void *);
@@ -218,18 +217,17 @@ const struct cdevsw raid_cdevsw = {
static struct dkdriver rf_dkdriver = { raidstrategy, minphys };
-/* XXX Not sure if the following should be replacing the raidPtrs above,
- or if it should be used in conjunction with that...
-*/
-
struct raid_softc {
device_t sc_dev;
+ int sc_unit;
int sc_flags; /* flags */
int sc_cflags; /* configuration flags */
uint64_t sc_size; /* size of the raid device */
char sc_xname[20]; /* XXX external name */
struct disk sc_dkdev; /* generic disk device info */
struct bufq_state *buf_queue; /* used for the device queue */
+ RF_Raid_t sc_r;
+ LIST_ENTRY(raid_softc) sc_link;
};
/* sc_flags */
#define RAIDF_INITED 0x01 /* unit has been initialized */
@@ -240,7 +238,6 @@ struct raid_softc {
#define RAIDF_LOCKED 0x80 /* unit is locked */
#define raidunit(x) DISKUNIT(x)
-int numraid = 0;
extern struct cfdriver raid_cd;
CFATTACH_DECL3_NEW(raid, sizeof(struct raid_softc),
@@ -272,7 +269,6 @@ CFATTACH_DECL3_NEW(raid, sizeof(struct raid_softc),
(MAKEDISKDEV(major((dev)), raidunit((dev)), RAW_PART))
/* declared here, and made public, for the benefit of KVM stuff.. */
-struct raid_softc *raid_softc;
static void raidgetdefaultlabel(RF_Raid_t *, struct raid_softc *,
struct disklabel *);
@@ -304,7 +300,7 @@ int rf_set_rootpartition(RF_Raid_t *, int);
void rf_release_all_vps(RF_ConfigSet_t *);
void rf_cleanup_config_set(RF_ConfigSet_t *);
int rf_have_enough_components(RF_ConfigSet_t *);
-int rf_auto_config_set(RF_ConfigSet_t *, int *);
+struct raid_softc *rf_auto_config_set(RF_ConfigSet_t *);
static void rf_fix_old_label_size(RF_ComponentLabel_t *, uint64_t);
/*
@@ -321,30 +317,68 @@ static bool raidautoconfigdone = false;
struct RF_Pools_s rf_pools;
-void
-raidattach(int num)
-{
- int raidID;
- int i, rc;
+static LIST_HEAD(, raid_softc) raids = LIST_HEAD_INITIALIZER(raids);
+static kmutex_t raid_lock;
- aprint_debug("raidattach: Asked for %d units\n", num);
-
- if (num <= 0) {
+static struct raid_softc *
+raidcreate(int unit) {
+ struct raid_softc *sc = kmem_zalloc(sizeof(*sc), KM_SLEEP);
+ if (sc == NULL) {
#ifdef DIAGNOSTIC
- panic("raidattach: count <= 0");
+ printf("%s: out of memory\n", __func__);
#endif
- return;
+ return NULL;
}
- /* This is where all the initialization stuff gets done. */
-
- numraid = num;
+ sc->sc_unit = unit;
+ sc->sc_r.softc = sc;
+ bufq_alloc(&sc->buf_queue, BUFQ_DISK_DEFAULT_STRAT, BUFQ_SORT_RAWBLOCK);
+ return sc;
+}
- /* Make some space for requested number of units... */
+static void
+raiddestroy(struct raid_softc *sc) {
+ bufq_free(sc->buf_queue);
+ kmem_free(sc, sizeof(*sc));
+}
- RF_Malloc(raidPtrs, num * sizeof(RF_Raid_t *), (RF_Raid_t **));
- if (raidPtrs == NULL) {
- panic("raidPtrs is NULL!!");
+static struct raid_softc *
+raidget(int unit) {
+ struct raid_softc *sc;
+ if (unit < 0) {
+#ifdef DIAGNOSTIC
+ panic("%s: unit %d!", __func__, unit);
+#endif
+ return NULL;
+ }
+ mutex_enter(&raid_lock);
+ LIST_FOREACH(sc, &raids, sc_link) {
+ if (sc->sc_unit == unit) {
+ mutex_exit(&raid_lock);
+ return sc;
+ }
}
+ mutex_exit(&raid_lock);
+ if ((sc = raidcreate(unit)) == NULL)
+ return NULL;
+ mutex_enter(&raid_lock);
+ LIST_INSERT_HEAD(&raids, sc, sc_link);
+ mutex_exit(&raid_lock);
+ return sc;
+}
+
+static void
+raidput(struct raid_softc *sc) {
+ mutex_enter(&raid_lock);
+ LIST_REMOVE(sc, sc_link);
+ mutex_exit(&raid_lock);
+ raiddestroy(sc);
+}
+
+void
+raidattach(int num)
+{
+ mutex_init(&raid_lock, MUTEX_DEFAULT, IPL_NONE);
+ /* This is where all the initialization stuff gets done. */
#if (RF_INCLUDE_PARITY_DECLUSTERING_DS > 0)
rf_init_mutex2(rf_sparet_wait_mutex, IPL_VM);
@@ -354,39 +388,11 @@ raidattach(int num)
rf_sparet_wait_queue = rf_sparet_resp_queue = NULL;
#endif
- for (i = 0; i < num; i++)
- raidPtrs[i] = NULL;
- rc = rf_BootRaidframe();
- if (rc == 0)
+ if (rf_BootRaidframe() == 0)
aprint_verbose("Kernelized RAIDframe activated\n");
else
panic("Serious error booting RAID!!");
- /* put together some datastructures like the CCD device does.. This
- * lets us lock the device and what-not when it gets opened. */
-
- raid_softc = (struct raid_softc *)
- malloc(num * sizeof(struct raid_softc),
- M_RAIDFRAME, M_NOWAIT);
- if (raid_softc == NULL) {
- aprint_error("WARNING: no memory for RAIDframe driver\n");
- return;
- }
-
- memset(raid_softc, 0, num * sizeof(struct raid_softc));
-
- for (raidID = 0; raidID < num; raidID++) {
- bufq_alloc(&raid_softc[raidID].buf_queue, BUFQ_DISK_DEFAULT_STRAT, BUFQ_SORT_RAWBLOCK);
-
- RF_Malloc(raidPtrs[raidID], sizeof(RF_Raid_t),
- (RF_Raid_t *));
- if (raidPtrs[raidID] == NULL) {
- aprint_error("WARNING: raidPtrs[%d] is NULL\n", raidID);
- numraid = raidID;
- return;
- }
- }
-
if (config_cfattach_attach(raid_cd.cd_name, &raid_ca)) {
aprint_error("raidattach: config_cfattach_attach failed?\n");
}
@@ -434,30 +440,29 @@ rf_buildroothack(RF_ConfigSet_t *config_sets)
{
RF_ConfigSet_t *cset;
RF_ConfigSet_t *next_cset;
- int retcode;
- int raidID;
- int rootID;
int col;
int num_root;
char *devname;
+ struct raid_softc *sc, *rsc;
- rootID = 0;
+ sc = rsc = NULL;
num_root = 0;
cset = config_sets;
while (cset != NULL) {
next_cset = cset->next;
if (rf_have_enough_components(cset) &&
- cset->ac->clabel->autoconfigure==1) {
- retcode = rf_auto_config_set(cset,&raidID);
- if (!retcode) {
- aprint_debug("raid%d: configured ok\n", raidID);
+ cset->ac->clabel->autoconfigure == 1) {
+ sc = rf_auto_config_set(cset);
+ if (sc != NULL) {
+ aprint_debug("raid%d: configured ok\n",
+ sc->sc_unit);
if (cset->rootable) {
- rootID = raidID;
+ rsc = sc;
num_root++;
}
} else {
/* The autoconfig didn't work :( */
- aprint_debug("Autoconfig failed with code %d for raid%d\n", retcode, raidID);
+ aprint_debug("Autoconfig failed\n");
rf_release_all_vps(cset);
}
} else {
@@ -479,14 +484,14 @@ rf_buildroothack(RF_ConfigSet_t *config_sets)
/* we found something bootable... */
if (num_root == 1) {
- if (raid_softc[rootID].sc_dkdev.dk_nwedges != 0) {
+ if (rsc->sc_dkdev.dk_nwedges != 0) {
/* XXX: How do we find the real root partition? */
char cname[sizeof(cset->ac->devname)];
snprintf(cname, sizeof(cname), "%s%c",
- device_xname(raid_softc[rootID].sc_dev), 'a');
+ device_xname(rsc->sc_dev), 'a');
booted_device = dkwedge_find_by_wname(cname);
} else
- booted_device = raid_softc[rootID].sc_dev;
+ booted_device = rsc->sc_dev;
} else if (num_root > 1) {
/*
@@ -502,28 +507,31 @@ rf_buildroothack(RF_ConfigSet_t *config_sets)
return;
num_root = 0;
- for (raidID = 0; raidID < numraid; raidID++) {
- if (raidPtrs[raidID]->valid == 0)
+ mutex_enter(&raid_lock);
+ LIST_FOREACH(sc, &raids, sc_link) {
+ RF_Raid_t *r = &sc->sc_r;
+ if (r->valid == 0)
continue;
- if (raidPtrs[raidID]->root_partition == 0)
+ if (r->root_partition == 0)
continue;
- for (col = 0; col < raidPtrs[raidID]->numCol; col++) {
- devname = raidPtrs[raidID]->Disks[col].devname;
+ for (col = 0; col < r->numCol; col++) {
+ devname = r->Disks[col].devname;
devname += sizeof("/dev/") - 1;
if (strncmp(devname, device_xname(booted_device),
strlen(device_xname(booted_device))) != 0)
continue;
aprint_debug("raid%d includes boot device %s\n",
- raidID, devname);
+ sc->sc_unit, devname);
num_root++;
- rootID = raidID;
+ rsc = sc;
}
}
+ mutex_exit(&raid_lock);
if (num_root == 1) {
- booted_device = raid_softc[rootID].sc_dev;
+ booted_device = rsc->sc_dev;
} else {
/* we can't guess.. require the user to answer... */
boothowto |= RB_ASKNAME;
@@ -540,10 +548,8 @@ raidsize(dev_t dev)
int part, unit, omask, size;
unit = raidunit(dev);
- if (unit >= numraid)
- return (-1);
- rs = &raid_softc[unit];
-
+ if ((rs = raidget(unit)) == NULL)
+ return -1;
if ((rs->sc_flags & RAIDF_INITED) == 0)
return (-1);
@@ -579,11 +585,10 @@ raiddump(dev_t dev, daddr_t blkno, void *va, size_t size)
int part, c, sparecol, j, scol, dumpto;
int error = 0;
- if (unit >= numraid)
- return (ENXIO);
+ if ((rs = raidget(unit)) == NULL)
+ return ENXIO;
- rs = &raid_softc[unit];
- raidPtr = raidPtrs[unit];
+ raidPtr = &rs->sc_r;
if ((rs->sc_flags & RAIDF_INITED) == 0)
return ENXIO;
@@ -715,10 +720,8 @@ raidopen(dev_t dev, int flags, int fmt,
int part, pmask;
int error = 0;
- if (unit >= numraid)
- return (ENXIO);
- rs = &raid_softc[unit];
-
+ if ((rs = raidget(unit)) == NULL)
+ return ENXIO;
if ((error = raidlock(rs)) != 0)
return (error);
@@ -776,7 +779,7 @@ raidopen(dev_t dev, int flags, int fmt,
here... If so, we needn't do this, but then need some
other way of keeping track of what's happened.. */
- rf_markalldirty(raidPtrs[unit]);
+ rf_markalldirty(&rs->sc_r);
}
@@ -799,9 +802,8 @@ raidclose(dev_t dev, int flags, int fmt, struct lwp *l)
int error = 0;
int part;
- if (unit >= numraid)
- return (ENXIO);
- rs = &raid_softc[unit];
+ if ((rs = raidget(unit)) == NULL)
+ return ENXIO;
if ((error = raidlock(rs)) != 0)
return (error);
@@ -828,7 +830,7 @@ raidclose(dev_t dev, int flags, int fmt, struct lwp *l)
clean bits if RAIDF_INITED is not set
mark things as clean... */
- rf_update_component_labels(raidPtrs[unit],
+ rf_update_component_labels(&rs->sc_r,
RF_FINAL_COMPONENT_UPDATE);
/* If the kernel is shutting down, it will detach
@@ -844,20 +846,20 @@ raidclose(dev_t dev, int flags, int fmt, struct lwp *l)
void
raidstrategy(struct buf *bp)
{
- unsigned int raidID = raidunit(bp->b_dev);
+ unsigned int unit = raidunit(bp->b_dev);
RF_Raid_t *raidPtr;
- struct raid_softc *rs = &raid_softc[raidID];
int wlabel;
+ struct raid_softc *rs;
- if ((rs->sc_flags & RAIDF_INITED) ==0) {
+ if ((rs = raidget(unit)) == NULL) {
bp->b_error = ENXIO;
goto done;
}
- if (raidID >= numraid || !raidPtrs[raidID]) {
- bp->b_error = ENODEV;
+ if ((rs->sc_flags & RAIDF_INITED) == 0) {
+ bp->b_error = ENXIO;
goto done;
}
- raidPtr = raidPtrs[raidID];
+ raidPtr = &rs->sc_r;
if (!raidPtr->valid) {
bp->b_error = ENODEV;
goto done;
@@ -918,9 +920,8 @@ raidread(dev_t dev, struct uio *uio, int flags)
int unit = raidunit(dev);
struct raid_softc *rs;
- if (unit >= numraid)
- return (ENXIO);
- rs = &raid_softc[unit];
+ if ((rs = raidget(unit)) == NULL)
+ return ENXIO;
if ((rs->sc_flags & RAIDF_INITED) == 0)
return (ENXIO);
@@ -935,9 +936,8 @@ raidwrite(dev_t dev, struct uio *uio, int flags)
int unit = raidunit(dev);
struct raid_softc *rs;
- if (unit >= numraid)
- return (ENXIO);
- rs = &raid_softc[unit];
+ if ((rs = raidget(unit)) == NULL)
+ return ENXIO;
if ((rs->sc_flags & RAIDF_INITED) == 0)
return (ENXIO);
@@ -952,7 +952,7 @@ raid_detach_unlocked(struct raid_softc *rs)
int error;
RF_Raid_t *raidPtr;
- raidPtr = raidPtrs[device_unit(rs->sc_dev)];
+ raidPtr = &rs->sc_r;
/*
* If somebody has a partition mounted, we shouldn't
@@ -1008,10 +1008,9 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
#endif
struct dkwedge_info *dkw;
- if (unit >= numraid)
- return (ENXIO);
- rs = &raid_softc[unit];
- raidPtr = raidPtrs[unit];
+ if ((rs = raidget(unit)) == NULL)
+ return ENXIO;
+ raidPtr = &rs->sc_r;
db1_printf(("raidioctl: %d %d %d %lu\n", (int) dev,
(int) DISKPART(dev), (int) unit, cmd));
@@ -1180,7 +1179,7 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
this RAID device */
raidPtr->openings = RAIDOUTSTANDING;
- raidinit(raidPtr);
+ raidinit(rs);
rf_markalldirty(raidPtr);
}
/* free the buffers. No return code here. */
@@ -1916,15 +1915,14 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
static void
-raidinit(RF_Raid_t *raidPtr)
+raidinit(struct raid_softc *rs)
{
cfdata_t cf;
- struct raid_softc *rs;
int unit;
+ RF_Raid_t *raidPtr = &rs->sc_r;
unit = raidPtr->raidid;
- rs = &raid_softc[unit];
/* XXX should check return code first... */
rs->sc_flags |= RAIDF_INITED;
@@ -2017,15 +2015,12 @@ raidstart(RF_Raid_t *raidPtr)
RF_RaidAddr_t raid_addr;
struct partition *pp;
daddr_t blocknum;
- int unit;
struct raid_softc *rs;
int do_async;
struct buf *bp;
int rc;
- unit = raidPtr->raidid;
- rs = &raid_softc[unit];
-
+ rs = raidPtr->softc;
/* quick check to see if anything has died recently */
rf_lock_mutex2(raidPtr->mutex);
if (raidPtr->numNewFailures > 0) {
@@ -2347,17 +2342,23 @@ static void
raidgetdisklabel(dev_t dev)
{
int unit = raidunit(dev);
- struct raid_softc *rs = &raid_softc[unit];
+ struct raid_softc *rs;
const char *errstring;
- struct disklabel *lp = rs->sc_dkdev.dk_label;
- struct cpu_disklabel *clp = rs->sc_dkdev.dk_cpulabel;
+ struct disklabel *lp;
+ struct cpu_disklabel *clp;
RF_Raid_t *raidPtr;
+ if ((rs = raidget(unit)) == NULL)
+ return;
+
+ lp = rs->sc_dkdev.dk_label;
+ clp = rs->sc_dkdev.dk_cpulabel;
+
db1_printf(("Getting the disklabel...\n"));
memset(clp, 0, sizeof(*clp));
- raidPtr = raidPtrs[unit];
+ raidPtr = &rs->sc_r;
raidgetdefaultlabel(raidPtr, rs, lp);
@@ -3699,34 +3700,26 @@ raid_init_component_label(RF_Raid_t *raidPtr, RF_ComponentLabel_t *clabel)
#endif
}
-int
-rf_auto_config_set(RF_ConfigSet_t *cset, int *unit)
+struct raid_softc *
+rf_auto_config_set(RF_ConfigSet_t *cset)
{
RF_Raid_t *raidPtr;
RF_Config_t *config;
int raidID;
- int retcode;
+ struct raid_softc *sc;
#ifdef DEBUG
printf("RAID autoconfigure\n");
#endif
- retcode = 0;
- *unit = -1;
-
/* 1. Create a config structure */
-
- config = (RF_Config_t *)malloc(sizeof(RF_Config_t),
- M_RAIDFRAME,
- M_NOWAIT);
- if (config==NULL) {
+ config = malloc(sizeof(*config), M_RAIDFRAME, M_NOWAIT|M_ZERO);
+ if (config == NULL) {
printf("Out of mem!?!?\n");
/* XXX do something more intelligent here. */
- return(1);
+ return NULL;
}
- memset(config, 0, sizeof(RF_Config_t));
-
/*
2. Figure out what RAID ID this one is supposed to live at
See if we can get the same RAID dev that it was configured
@@ -3734,39 +3727,13 @@ rf_auto_config_set(RF_ConfigSet_t *cset, int *unit)
*/
raidID = cset->ac->clabel->last_unit;
- if ((raidID < 0) || (raidID >= numraid)) {
- /* let's not wander off into lala land. */
- raidID = numraid - 1;
- }
- if (raidPtrs[raidID]->valid != 0) {
-
- /*
- Nope... Go looking for an alternative...
- Start high so we don't immediately use raid0 if that's
- not taken.
- */
-
- for(raidID = numraid - 1; raidID >= 0; raidID--) {
- if (raidPtrs[raidID]->valid == 0) {
- /* can use this one! */
- break;
- }
- }
- }
-
- if (raidID < 0) {
- /* punt... */
- printf("Unable to auto configure this set!\n");
- printf("(Out of RAID devs!)\n");
- free(config, M_RAIDFRAME);
- return(1);
- }
-
+ for (sc = raidget(raidID); sc->sc_r.valid != 0; sc = raidget(++raidID))
+ continue;
#ifdef DEBUG
printf("Configuring raid%d:\n",raidID);
#endif
- raidPtr = raidPtrs[raidID];
+ raidPtr = &sc->sc_r;
/* XXX all this stuff should be done SOMEWHERE ELSE! */
raidPtr->raidid = raidID;
@@ -3776,38 +3743,38 @@ rf_auto_config_set(RF_ConfigSet_t *cset, int *unit)
rf_create_configuration(cset->ac, config, raidPtr);
/* 4. Do the configuration */
- retcode = rf_Configure(raidPtr, config, cset->ac);
+ if (rf_Configure(raidPtr, config, cset->ac) == 0) {
+ raidinit(sc);
- if (retcode == 0) {
-
- raidinit(raidPtrs[raidID]);
-
- rf_markalldirty(raidPtrs[raidID]);
- raidPtrs[raidID]->autoconfigure = 1; /* XXX do this here? */
+ rf_markalldirty(raidPtr);
+ raidPtr->autoconfigure = 1; /* XXX do this here? */
if (cset->ac->clabel->root_partition==1) {
/* everything configured just fine. Make a note
that this set is eligible to be root. */
cset->rootable = 1;
/* XXX do this here? */
- raidPtrs[raidID]->root_partition = 1;
+ raidPtr->root_partition = 1;
}
+ } else {
+ raidput(sc);
+ sc = NULL;
}
/* 5. Cleanup */
free(config, M_RAIDFRAME);
-
- *unit = raidID;
- return(retcode);
+ return sc;
}
void
rf_disk_unbusy(RF_RaidAccessDesc_t *desc)
{
struct buf *bp;
+ struct raid_softc *rs;
bp = (struct buf *)desc->bp;
- disk_unbusy(&raid_softc[desc->raidPtr->raidid].sc_dkdev,
- (bp->b_bcount - bp->b_resid), (bp->b_flags & B_READ));
+ rs = desc->raidPtr->softc;
+ disk_unbusy(&rs->sc_dkdev, (bp->b_bcount - bp->b_resid),
+ (bp->b_flags & B_READ));
}
void
@@ -3821,7 +3788,7 @@ rf_pool_init(struct pool *p, size_t size, const char *w_chan,
}
/*
- * rf_buf_queue_check(int raidid) -- looks into the buf_queue to see
+ * rf_buf_queue_check(RF_Raid_t raidPtr) -- looks into the buf_queue to see
* if there is IO pending and if that IO could possibly be done for a
* given RAID set. Returns 0 if IO is waiting and can be done, 1
* otherwise.
@@ -3829,10 +3796,10 @@ rf_pool_init(struct pool *p, size_t size, const char *w_chan,
*/
int
-rf_buf_queue_check(int raidid)
+rf_buf_queue_check(RF_Raid_t *raidPtr)
{
- if ((bufq_peek(raid_softc[raidid].buf_queue) != NULL) &&
- raidPtrs[raidid]->openings > 0) {
+ struct raid_softc *rs = raidPtr->softc;
+ if ((bufq_peek(rs->buf_queue) != NULL) && raidPtr->openings > 0) {
/* there is work to do */
return 0;
}
@@ -3874,7 +3841,7 @@ static int
raid_detach(device_t self, int flags)
{
int error;
- struct raid_softc *rs = &raid_softc[device_unit(self)];
+ struct raid_softc *rs = device_private(self);
if ((error = raidlock(rs)) != 0)
return (error);
diff --git a/sys/dev/raidframe/rf_raid.h b/sys/dev/raidframe/rf_raid.h
index 0e2717a5611..685cf38b9e4 100644
--- a/sys/dev/raidframe/rf_raid.h
+++ b/sys/dev/raidframe/rf_raid.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_raid.h,v 1.43 2011/05/11 18:13:12 mrg Exp $ */
+/* $NetBSD: rf_raid.h,v 1.44 2013/04/27 21:18:43 christos Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -260,6 +260,7 @@ struct RF_Raid_s {
RF_DiskId_t **diskids;
int raidid;
+ void *softc;
RF_AccTotals_t acc_totals;
int keep_acc_totals;