Date: Tue, 30 Aug 2005 14:31:35 GMT From: Lev Levinson <llevinson@inbox.ru> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/85481: reading from fd0 when floppy disk is write-protected Message-ID: <200508301431.j7UEVZBi031335@www.freebsd.org> Resent-Message-ID: <200508301440.j7UEeIZR045591@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 85481 >Category: misc >Synopsis: reading from fd0 when floppy disk is write-protected >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Aug 30 14:40:18 GMT 2005 >Closed-Date: >Last-Modified: >Originator: Lev Levinson >Release: 5.4-RELEASE >Organization: >Environment: FreeBSD 5.4-RELEASE FreeBSD 5.4-RELEASE #0: Sun May 8 10:21:06 UTC 2005 root@harlow.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 >Description: Reading n x 512 byte blocks from /dev/fd0 result in "Input/output error" when n IS NOT DIVISOR of 36 and floppy disk is write-protected. for example, dd if=/dev/fd0 of=/dev/null bs=512 dd if=/dev/fd0 of=/dev/null bs=1024 # 2x512 dd if=/dev/fd0 of=/dev/null bs=1536 # 3x512 dd if=/dev/fd0 of=/dev/null bs=2048 # 4x512 dd if=/dev/fd0 of=/dev/null bs=3072 # 6x512 dd if=/dev/fd0 of=/dev/null bs=4608 # 9x512 works well, but dd if=/dev/fd0 of=/dev/null bs=2560 # 5x512 dd if=/dev/fd0 of=/dev/null bs=3584 # 7x512 dd if=/dev/fd0 of=/dev/null bs=4096 # 8x512 dd if=/dev/fd0 of=/dev/null bs=5120 # 10x512 reports input-output error. tar reads file with 20 x 512 byte blocks, and tar -xzf /dev/fd0 no works if disk is write-protected. but tar -xzf /dev/fd0 -b 36 works. >How-To-Repeat: 1 Boot and login as root 2 Insert write protected floppy disk. 3 dd if=/dev/fd0 of=/dev/null bs=4096 (or bs = n x 512, where n is not divisor of 36 - number of sectors per floppy track) >Fix: In function fdc_worker (src/sys/dev/fdc/fdc.c:746) i found this line: if (bp != NULL && (fdc->retry >= retries || (fd->flags & FDOPT_NORETRY))) { In this line, option (BUT NOT FLAG!!!) FDOPT_NORETRY AND-ed against field fd->flags (BUT NOT fd->options). Option FDOPT_NORETRY has same value as a flag FD_WP (write protected). Thus, instead "need more reads" we have "Disk is write-protected" in condition. For fix this bug, code mast be like this: if (bp != NULL && (fdc->retry >= retries || (fd->options & FDOPT_NORETRY))) { >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508301431.j7UEVZBi031335>