Gilles Espinasse
2008-Jun-08 17:50 UTC
[klibc] Unable to cat raw /dev/fd0 more than one time
Trying to be not long, on x86 I have 3 floppies images boot, root-1, root-2 Booting from boot image with no problem, I try reading root-1 and root-2 image in raw format. Reading root-1 and root-2 is made from boot init script, using klibc-1.5.9 or klibc-1.5.10 with debian insmod patch, and a vanilia linux-2.6.24.7 root-1 and 2 images are smaller than 1440 kB and are made the same way with cd $(FLOPPY_ROOT_DIR) && find . | cpio -o -H newc | gzip -9 > \ /$(INSTALLER_DIR)/images/$(SNAME)-$(VERSION)-root-1.img ... cd $(FLOPPY_ROOT_DIR) && find . | cpio -o -H newc | gzip -9 > \ /$(INSTALLER_DIR)/images/$(SNAME)-$(VERSION)-root-2.img Problem happen reading from a classical floppy (not tested usb). /dev/fd0 node is created with mknod reading before /sys/block/fd0/dev information Tested on 2 differents machines, one PII and one 486 laptop, they behave the same When init run those actions are made echo "Insert the root-1.img floppy and press Enter" read ANSWER mount -t tmpfs tmpfs /initramfs echo -n "Loading root-1 initramfs ... " cd /initramfs && cat /dev/fd0 | zcat -d | cpio -i echo "Insert the root-2.img floppy and press Enter" read ANSWER echo -n "Loading root-2 initramfs ... " cd /initramfs && cat /dev/fd0 | zcat -d | cpio -i Reading is fine for root-1 Loading root-1 initramfs ... zcat: stdin: decompression OK, trailing garbage ignored But when reading root-2, with same instruction, it always fail _unless_ the floppy is not changed. Error message is "Loading root-2 initramfs ... floppy0: disk absent or changed during operation end_request: I/O error, dev fd0, sector 0 buffer I/O error on device fd0, logical block 0 floppy0: disk absent or changed during operation end_request: I/O error, dev fd0, sector 8 buffer I/O error on device fd0, logical block 1 floppy0: disk absent or changed during operation end_request: I/O error, dev fd0, sector 16 buffer I/O error on device fd0, logical block 2 floppy0: disk absent or changed during operation end_request: I/O error, dev fd0, sector 24 buffer I/O error on device fd0, logical block 3 floppy0: disk absent or changed during operation end_request: I/O error, dev fd0, sector 0 buffer I/O error on device fd0, logical block 0 /dev/fd0: invalid lenght zcat: stdin: unexpected end of file cpio: premature end of file" If I do _not_ change the floppy when asked for root-2, reading same floppy work (but this my problem with wrong files) Anytime root-1 is replaced, next cat /dev/fd0 will next fail with any content on floppy. Under glibc-2.7 using same kernel, that work. "floppy0: disk absent or changed during operation" message come from 2.6.24 floppy module code. Gilles
H. Peter Anvin
2008-Jun-08 22:55 UTC
[klibc] Unable to cat raw /dev/fd0 more than one time
Gilles Espinasse wrote:> > When init run those actions are made > echo "Insert the root-1.img floppy and press Enter" > read ANSWER > mount -t tmpfs tmpfs /initramfs > echo -n "Loading root-1 initramfs ... " > cd /initramfs && cat /dev/fd0 | zcat -d | cpio -i > echo "Insert the root-2.img floppy and press Enter" > read ANSWER > echo -n "Loading root-2 initramfs ... " > cd /initramfs && cat /dev/fd0 | zcat -d | cpio -i >Well, for one thing you're command here is somewhat daft; you have a redundant "cat", and "zcat -d" (which is a tautology). This is probably the source of your problem: "cat" won't know that the floppy is done, so it won't close the file. zcat < /dev/fd0 | cpio -i ... would be better. -hpa