Hi, On 11/10/2009 05:56 PM, Ales Kozumplik wrote:
BZ #460566, if a read from a block device (like USB key) or a cdrom (USB cdrom) fails, sleep to give the device some time to initialize. The patch was proposed by Jeffrey Bastian<jbastian@xxxxxxxxxx>. --- loader2/cdinstall.c | 10 +++++++++- loader2/method.c | 20 ++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/loader2/cdinstall.c b/loader2/cdinstall.c index 3aeb1e1..2694e82 100644 --- a/loader2/cdinstall.c +++ b/loader2/cdinstall.c @@ -438,13 +438,21 @@ void setKickstartCD(struct loaderData_s * loaderData, int argc, char ** argv) { } int kickstartFromCD(char *kssrc) { - int rc, i; + int i = 0, rc; char *p, *kspath; struct device ** devices; logMessage(INFO, "getting kickstart file from first CDROM"); devices = probeDevices(CLASS_CDROM, BUS_UNSPEC, 0); + /* 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 */ + while (!devices&& (i++< 10)) { + sleep(2); + logMessage(DEBUGLVL, "sleeping to wait for a USB CD-ROM"); + devices = probeDevices(CLASS_CDROM, BUS_UNSPEC, 0); + }
logMessage should be above sleep(2)
if (!devices) { logMessage(ERROR, "No CDROM devices found!"); return 1; diff --git a/loader2/method.c b/loader2/method.c index 1905f9f..a874d98 100644 --- a/loader2/method.c +++ b/loader2/method.c @@ -644,8 +644,11 @@ int copyFileAndLoopbackMount(int fd, char * dest, 2 - could not mount device as ext2, vfat, or iso9660 3 - file named path not there */ +#define TRYMOUNT(fs) \ + (doPwMount("/tmp/srcdev", "/tmp/mnt", (fs), IMOUNT_RDONLY, NULL)) + int getFileFromBlockDevice(char *device, char *path, char * dest) { - int rc; + int i = 0, s = 1, rc; char file[4096]; logMessage(INFO, "getFileFromBlockDevice(%s, %s)", device, path); @@ -655,9 +658,16 @@ int getFileFromBlockDevice(char *device, char *path, char * dest) { return 1; } - if (doPwMount("/tmp/srcdev", "/tmp/mnt", "vfat", IMOUNT_RDONLY, NULL)&& - doPwMount("/tmp/srcdev", "/tmp/mnt", "ext2", IMOUNT_RDONLY, NULL)&& - doPwMount("/tmp/srcdev", "/tmp/mnt", "iso9660", IMOUNT_RDONLY, NULL)) { + /* some USB thumb drives and hard drives are slow to initialize */ + /* retry up to 5 times or 31 seconds */ + rc = TRYMOUNT("vfat")&& TRYMOUNT("ext2")&& TRYMOUNT("iso9660"); + while (rc&& (i++< 5)) { + sleep(s); + s<<= 1; + logMessage(DEBUGLVL, "sleeping to wait for USB storage devices"); + rc = TRYMOUNT("vfat")&& TRYMOUNT("ext2")&& TRYMOUNT("iso9660"); + }
Can we make this a for loop please, also I would prefer to see s as: s = 1 << i; But that might just be me :)
+ if (rc) { logMessage(ERROR, "failed to mount /dev/%s: %s", device, strerror(errno)); return 2; @@ -680,6 +690,8 @@ int getFileFromBlockDevice(char *device, char *path, char * dest) { return rc; } +#undef TRYMOUNT + void setMethodFromCmdline(char * arg, struct loaderData_s * ld) { char * c, * dup;
Regards, Hans _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list