I would test the return code of doPwMount for more than just mounted/not mounted values. If the cdrom is present but cannot be mounted for some reason, we would end up uselessly waiting in the for loop. The RHEL5 variant had kudzu check for the cdrom device, so no problem there. Martin ----- "Ales Kozumplik" <akozumpl@xxxxxxxxxx> wrote: > (migrated fe2eee125069269d32bc2bb3ea6c5722f450b28a from rhel5-branch) > I tested this on fedora 12, the loader is able to fetch kickstart > from > a usb key. > --- > loader/cdinstall.c | 8 ++++++++ > loader/kickstart.c | 8 ++++++++ > loader/method.c | 13 +++++++++++-- > 3 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/loader/cdinstall.c b/loader/cdinstall.c > index d74396e..602798f 100644 > --- a/loader/cdinstall.c > +++ b/loader/cdinstall.c > @@ -490,6 +490,14 @@ int kickstartFromCD(char *kssrc) { > logMessage(INFO, "getting kickstart file from first CDROM"); > > devices = getDevices(DEVICE_CDROM); > + /* usb can take some time to settle, even with the various hacks > we > + * have in place. some systems use portable USB CD-ROM drives, > try to > + * make sure there really isn't one before bailing */ > + for (i = 0; !devices && i < 10; ++i) { > + logMessage(DEBUGLVL, "sleeping to wait for a USB CD-ROM"); > + sleep(2); > + devices = getDevices(DEVICE_CDROM); > + } > if (!devices) { > logMessage(ERROR, "No CDROM devices found!"); > return 1; > diff --git a/loader/kickstart.c b/loader/kickstart.c > index b92c6da..a9f781e 100644 > --- a/loader/kickstart.c > +++ b/loader/kickstart.c > @@ -252,6 +252,14 @@ int kickstartFromRemovable(char *kssrc) { > > logMessage(INFO, "doing kickstart from removable media"); > devices = getDevices(DEVICE_DISK); > + /* usb can take some time to settle, even with the various hacks > we > + * have in place. some systems use portable USB CD-ROM drives, > try to > + * make sure there really isn't one before bailing. */ > + for (i = 0; !devices && i < 10; ++i) { > + logMessage(DEBUGLVL, "sleeping to wait for a USB disk"); > + sleep(2); > + devices = getDevices(DEVICE_DISK); > + } > if (!devices) { > logMessage(ERROR, "no disks"); > return 1; > diff --git a/loader/method.c b/loader/method.c > index ebfe557..5cfc971 100644 > --- a/loader/method.c > +++ b/loader/method.c > @@ -466,12 +466,21 @@ int copyFileAndLoopbackMount(int fd, char * > dest, char * device, char * mntpoint > 3 - file named path not there > */ > int getFileFromBlockDevice(char *device, char *path, char * dest) { > - int rc; > + int rc, s, i; > char file[4096]; > > logMessage(INFO, "getFileFromBlockDevice(%s, %s)", device, > path); > > - if (doPwMount(device, "/tmp/mnt", "auto", "ro", NULL)) { > + /* some USB thumb drives and hard drives are slow to initialize > */ > + /* retry up to 5 times or 31 seconds */ > + rc = doPwMount(device, "/tmp/mnt", "auto", "ro", NULL); > + for (i = 0, s = 1; rc && i < 5; ++i) { > + logMessage(DEBUGLVL, "sleeping to wait for USB storage > devices"); > + sleep(s); > + s = 1 << (i+1); > + rc = doPwMount(device, "/tmp/mnt", "auto", "ro", NULL); > + } > + if (rc) { > logMessage(ERROR, "failed to mount /dev/%s: %m", device); > return 2; > } > -- > 1.6.2.5 > > _______________________________________________ > Anaconda-devel-list mailing list > Anaconda-devel-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/anaconda-devel-list _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list