Make md/mdconfig do kld.

Submitted by:	dcs
This commit is contained in:
Poul-Henning Kamp 2001-02-24 16:26:41 +00:00
parent d8589bd5cb
commit 57e9624ec9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=72981
2 changed files with 71 additions and 4 deletions

View File

@ -18,12 +18,16 @@
#include <err.h>
#include <sys/ioctl.h>
#include <sys/param.h>
#include <sys/module.h>
#include <sys/linker.h>
#include <sys/mdioctl.h>
struct md_ioctl mdio;
enum {UNSET, ATTACH, DETACH} action = UNSET;
void mdmaybeload(void);
void
usage()
{
@ -139,6 +143,7 @@ main(int argc, char **argv)
}
}
mdmaybeload();
fd = open("/dev/mdctl", O_RDWR, 0);
if (fd < 0)
err(1, "open(/dev/mdctl)");
@ -156,3 +161,34 @@ main(int argc, char **argv)
return (0);
}
void
mdmaybeload(void)
{
struct module_stat mstat;
int fileid, modid;
char *name = "md";
char *cp;
/* scan files in kernel */
mstat.version = sizeof(struct module_stat);
for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) {
/* scan modules in file */
for (modid = kldfirstmod(fileid); modid > 0;
modid = modfnext(modid)) {
if (modstat(modid, &mstat) < 0)
continue;
/* strip bus name if present */
if ((cp = strchr(mstat.name, '/')) != NULL) {
cp++;
} else {
cp = mstat.name;
}
/* already loaded? */
if (!strcmp(name, cp))
return;
}
}
/* not present, we should try to load it */
kldload(name);
}

View File

@ -85,6 +85,8 @@
#include <vm/vm_zone.h>
#include <vm/swap_pager.h>
#define MD_MODVER 1
#ifndef MD_NSECT
#define MD_NSECT (10000 * 2)
#endif
@ -111,8 +113,10 @@ static u_char mfs_root[MD_ROOT_SIZE*1024] = "MFS Filesystem goes here";
static u_char end_mfs_root[] __unused = "MFS Filesystem had better STOP here";
#endif
static int mdrootready;
static int mdunits;
static int mdrootready;
static int mdunits;
static dev_t status_dev = 0;
#define CDEV_MAJOR 95
@ -883,10 +887,37 @@ md_drvinit(void *unused)
mdunits, name, len, ptr);
md_preloaded(ptr, len);
}
make_dev(&mdctl_cdevsw, 0xffff00ff, UID_ROOT, GID_WHEEL, 0600, "mdctl");
status_dev = make_dev(&mdctl_cdevsw, 0xffff00ff, UID_ROOT, GID_WHEEL, 0600, "mdctl");
}
SYSINIT(mddev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR, md_drvinit,NULL)
static int
md_modevent(module_t mod, int type, void *data)
{
switch (type) {
case MOD_LOAD:
md_drvinit(NULL);
break;
case MOD_UNLOAD:
if (!LIST_EMPTY(&md_softc_list))
return EBUSY;
if (status_dev)
destroy_dev(status_dev);
status_dev = 0;
break;
default:
break;
}
return 0;
}
static moduledata_t md_mod = {
"md",
md_modevent,
NULL
};
DECLARE_MODULE(md, md_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+CDEV_MAJOR);
MODULE_VERSION(md, MD_MODVER);
#ifdef MD_ROOT
static void