[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH][RHEL5.4] sleep for N seconds before getting ks file (#460566)



At least 3 customers have reported issues with reading the kickstart file from a USB device (hard drive, flash thumb drive, and CD-ROM). It appears the problem is simply some devices are slow to initialize after loading the usb-storage.ko driver, and anaconda doesn't wait long enough before trying to read from them. See
  https://bugzilla.redhat.com/show_bug.cgi?id=460566

The attached patch adds a kssleep=N command line option to sleep for N seconds before attempting to read the kickstart file.

This was reported earlier for Fedora 8 in bug 452865, however, the code has changed quite drastically between RHEL5 and Fedora 8, so a RHEL 5 solution will not apply to Fedora and vice-versa.

The problem is easy to duplicate -- just put the kickstart file on a USB device -- but it requires hardware that exhibits the problem. We've duplicated it on an IBM x3650, and it's also been reported on an IBM BladeCenter HS21 and a Sun Fire X4450.

Jeff Bastian



--- anaconda-11.1.2.178.ORIG/loader2/loader.c	2009-05-26 09:59:56.000000000 -0500
+++ anaconda-11.1.2.178/loader2/loader.c	2009-05-26 17:48:49.000000000 -0500
@@ -114,6 +114,7 @@ uint64_t flags = LOADER_FLAGS_SELINUX | 
 
 int num_link_checks = 5;
 int post_link_sleep = 0;
+int kickstart_sleep = 0;
 
 static struct installMethod installMethods[] = {
     { N_("Local CDROM"), "cdrom", 0, CLASS_CDROM, mountCdromImage },
@@ -802,6 +803,8 @@ static void parseCmdLineFlags(struct loa
             num_link_checks = atoi(argv[i] + 10);
         else if (!strncasecmp(argv[i], "nicdelay=", 9))
             post_link_sleep = atoi(argv[i] + 9);
+        else if (!strncasecmp(argv[i], "kssleep=", 8))
+            kickstart_sleep = atoi(argv[i] + 8);
         else if (!strncasecmp(argv[i], "dhcptimeout=", 12))
             loaderData->dhcpTimeout = atoi(argv[i] + 12);
         else if (!strncasecmp(argv[i], "selinux=0", 9))
@@ -1657,8 +1660,15 @@ int main(int argc, char ** argv) {
     if (loaderData.ksFile || ksFile) {
         logMessage(INFO, "getting kickstart file");
 
-        if (!ksFile)
+        if (!ksFile) {
+            if (kickstart_sleep > 0) {
+                logMessage(DEBUGLVL, "sleeping %d seconds before "
+                                     "getting kickstart file",
+                                     kickstart_sleep);
+                sleep(kickstart_sleep);
+            }
             getKickstartFile(&loaderData);
+        }
         if (FL_KICKSTART(flags) && 
             (ksReadCommands((ksFile)?ksFile:loaderData.ksFile)!=LOADER_ERROR)) {
             runKickstart(&loaderData);

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]