diff options
| author | thorpej <thorpej@NetBSD.org> | 2002-10-01 18:11:57 +0000 |
|---|---|---|
| committer | thorpej <thorpej@NetBSD.org> | 2002-10-01 18:11:57 +0000 |
| commit | 2b99f7cc3417d58f79f7360d8822dea26c87c2e3 (patch) | |
| tree | a2fecf8fbfe60920bd8fd9d2abee41987657013c /sys/dev/raidframe | |
| parent | f6bcf9642e7344e5bc9562d792214fe06ab6d9b0 (diff) | |
Add a generic config finalization hook, to be called once all real
devices have been discovered. All finalizer routines are iteratively
invoked until all of them report that they have done no work.
Use this hook to fix a latent bug in RAIDframe autoconfiguration of
RAID sets exposed by the rework of SCSI device discovery.
Diffstat (limited to 'sys/dev/raidframe')
| -rw-r--r-- | sys/dev/raidframe/rf_netbsdkintf.c | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c index 2e395aa909b..fc78cd3a047 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.141 2002/09/27 15:37:30 provos Exp $ */ +/* $NetBSD: rf_netbsdkintf.c,v 1.142 2002/10/01 18:11:57 thorpej Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. * All rights reserved. @@ -114,7 +114,7 @@ ***********************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.141 2002/09/27 15:37:30 provos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.142 2002/10/01 18:11:57 thorpej Exp $"); #include <sys/param.h> #include <sys/errno.h> @@ -279,7 +279,8 @@ void rf_ReconThread(struct rf_recon_req *); void rf_RewriteParityThread(RF_Raid_t *raidPtr); void rf_CopybackThread(RF_Raid_t *raidPtr); void rf_ReconstructInPlaceThread(struct rf_recon_req *); -void rf_buildroothack(void *); +int rf_autoconfig(struct device *self); +void rf_buildroothack(RF_ConfigSet_t *); RF_AutoConfig_t *rf_find_raid_components(void); RF_ConfigSet_t *rf_create_auto_sets(RF_AutoConfig_t *); @@ -305,8 +306,6 @@ raidattach(num) { int raidID; int i, rc; - RF_AutoConfig_t *ac_list; /* autoconfig list */ - RF_ConfigSet_t *config_sets; #ifdef DEBUG printf("raidattach: Asked for %d units\n", num); @@ -390,35 +389,47 @@ raidattach(num) raidautoconfig = 1; #endif -if (raidautoconfig) { - /* 1. locate all RAID components on the system */ - -#if DEBUG - printf("Searching for raid components...\n"); -#endif - ac_list = rf_find_raid_components(); + /* + * Register a finalizer which will be used to auto-config RAID + * sets once all real hardware devices have been found. + */ + if (config_finalize_register(NULL, rf_autoconfig) != 0) + printf("WARNING: unable to register RAIDframe finalizer\n"); +} - /* 2. sort them into their respective sets */ +int +rf_autoconfig(struct device *self) +{ + RF_AutoConfig_t *ac_list; + RF_ConfigSet_t *config_sets; - config_sets = rf_create_auto_sets(ac_list); + if (raidautoconfig == 0) + return (0); - /* 3. evaluate each set and configure the valid ones - This gets done in rf_buildroothack() */ + /* XXX This code can only be run once. */ + raidautoconfig = 0; - /* schedule the creation of the thread to do the - "/ on RAID" stuff */ + /* 1. locate all RAID components on the system */ +#ifdef DEBUG + printf("Searching for RAID components...\n"); +#endif + ac_list = rf_find_raid_components(); - kthread_create(rf_buildroothack,config_sets); + /* 2. Sort them into their respective sets. */ + config_sets = rf_create_auto_sets(ac_list); -} + /* + * 3. Evaluate each set andconfigure the valid ones. + * This gets done in rf_buildroothack(). + */ + rf_buildroothack(config_sets); + return (1); } void -rf_buildroothack(arg) - void *arg; +rf_buildroothack(RF_ConfigSet_t *config_sets) { - RF_ConfigSet_t *config_sets = arg; RF_ConfigSet_t *cset; RF_ConfigSet_t *next_cset; int retcode; |
