diff options
| author | Martin Sivak <msivak@redhat.com> | 2009-12-17 16:06:26 +0100 |
|---|---|---|
| committer | Martin Sivak <msivak@redhat.com> | 2010-01-08 17:13:05 +0100 |
| commit | 406bc3cb0b3dff042942b72f26b4304affe30a13 (patch) | |
| tree | e2bdc15f82991d81a7f8dd273eed2a0e412865cd /loader | |
| parent | b951e9d719dcc6ec9d73704ffe2175411e29dfb9 (diff) | |
| download | anaconda-406bc3cb0b3dff042942b72f26b4304affe30a13.tar.gz anaconda-406bc3cb0b3dff042942b72f26b4304affe30a13.tar.xz anaconda-406bc3cb0b3dff042942b72f26b4304affe30a13.zip | |
Use the updated DriverDisc code in loader
- enable dlabel on RHEL by default
- use glib's linked lists to traverse through available DDs
- run depmod if the .rundepmod trigger file is present
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader.c | 45 | ||||
| -rw-r--r-- | loader/loader.h | 2 |
2 files changed, 47 insertions, 0 deletions
diff --git a/loader/loader.c b/loader/loader.c index b30cd6bfc..30259a65a 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -960,6 +960,10 @@ static void parseCmdLineFlags(struct loaderData_s * loaderData, else if (!strcasecmp(argv[i], "dd") || !strcasecmp(argv[i], "driverdisk")) flags |= LOADER_FLAGS_MODDISK; + else if (!strcasecmp(argv[i], "dlabel=on")) + flags |= LOADER_FLAGS_AUTOMODDISK; + else if (!strcasecmp(argv[i], "dlabel=off")) + flags &= ~LOADER_FLAGS_AUTOMODDISK; else if (!strcasecmp(argv[i], "rescue")) flags |= LOADER_FLAGS_RESCUE; else if (!strcasecmp(argv[i], "nopass")) @@ -1785,6 +1789,7 @@ int main(int argc, char ** argv) { struct loaderData_s loaderData; char *path, *fmt; + GSList *dd, *dditer; gchar *cmdLine = NULL, *ksFile = NULL, *virtpcon = NULL; gboolean mediacheck = FALSE; @@ -1882,6 +1887,12 @@ int main(int argc, char ** argv) { openLog(); openlog("loader", 0, LOG_LOCAL0); + + /* XXX if RHEL, enable the AUTODD feature by default, + * but we should come with more general way how to control this */ + if (!strncmp(getProductName(), "Red Hat", 7)) { + flags |= LOADER_FLAGS_AUTOMODDISK; + } memset(&loaderData, 0, sizeof(loaderData)); loaderData.method = -1; @@ -1943,6 +1954,34 @@ int main(int argc, char ** argv) { /* FIXME: this is a bit of a hack */ loaderData.modInfo = modInfo; + /* Setup depmod & modprobe so we can load multiple DDs */ + modprobeDDmode(); + + /* If there is /.rundepmod file present, rerun depmod */ + if (!access("/.rundepmod", R_OK)){ + if (system("depmod -a")) { + /* this is not really fatal error, it might still work, log it */ + logMessage(ERROR, "Error running depmod -a for initrd overlay"); + } + } + + if (FL_AUTOMODDISK(flags)) { + /* Load all autodetected DDs */ + logMessage(INFO, "Trying to detect vendor driver discs"); + dd = findDriverDiskByLabel(); + dditer = dd; + while(dditer) { + if (loadDriverDiskFromPartition(&loaderData, (char*)(dditer->data))) { + logMessage(ERROR, "Automatic driver disk loader failed for %s.", (char*)(dditer->data)); + } + else { + logMessage(INFO, "Automatic driver disk loader succeeded for %s.", (char*)(dditer->data)); + } + dditer = g_slist_next(dditer); + } + g_slist_free(dd); + } + if (FL_MODDISK(flags)) { startNewt(); loadDriverDisks(DEVICE_ANY, &loaderData); @@ -1952,6 +1991,9 @@ int main(int argc, char ** argv) { logMessage(INFO, "found /dd.img, loading drivers"); getDDFromSource(&loaderData, "path:/dd.img"); } + + /* Reset depmod & modprobe to normal mode and get the rest of drivers*/ + modprobeNormalmode(); /* this allows us to do an early load of modules specified on the * command line to allow automating the load order of modules so that @@ -2132,6 +2174,9 @@ int main(int argc, char ** argv) { tmparg++; } + if (FL_AUTOMODDISK(flags)) + *argptr++ = "--dlabel"; + if (FL_NOIPV4(flags)) *argptr++ = "--noipv4"; diff --git a/loader/loader.h b/loader/loader.h index 50ddafe97..80625e194 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -70,6 +70,7 @@ #define LOADER_FLAGS_HAVE_CMSCONF (((uint64_t) 1) << 37) #define LOADER_FLAGS_NOKILL (((uint64_t) 1) << 38) #define LOADER_FLAGS_KICKSTART_SEND_SERIAL (((uint64_t) 1) << 39) +#define LOADER_FLAGS_AUTOMODDISK (((uint64_t) 1) << 40) #define FL_TEXT(a) ((a) & LOADER_FLAGS_TEXT) #define FL_RESCUE(a) ((a) & LOADER_FLAGS_RESCUE) @@ -106,6 +107,7 @@ #define FL_HAVE_CMSCONF(a) ((a) & LOADER_FLAGS_HAVE_CMSCONF) #define FL_NOKILL(a) ((a) & LOADER_FLAGS_NOKILL) #define FL_KICKSTART_SEND_SERIAL(a) ((a) & LOADER_FLAGS_KICKSTART_SEND_SERIAL) +#define FL_AUTOMODDISK(a) ((a) & LOADER_FLAGS_AUTOMODDISK) void startNewt(void); void stopNewt(void); |
