*BSD News Article 5173


Return to BSD News archive

Newsgroups: comp.unix.bsd
Path: sserve!manuel!munnari.oz.au!sgiblab!sdd.hp.com!usc!newshub.sdsu.edu!ucselx!crash!fpm
From: fpm@crash.cts.com (Frank Maclachlan)
Subject: Bug in 386BSD 0.1 wd driver (w/ fix)
Organization: CTS Network Services (crash, ctsnet), El Cajon, CA
Date: 17 Sep 92 04:38:57 PDT
Message-ID: <1992Sep17.043859.28089@crash>
Followup-To: comp.unix.bsd
Summary: Raw wd device fails to report errors
Keywords: wd,bug,patch
References: <9226116.6625@mulga.cs.mu.OZ.AU>
Lines: 62

----------------------------BUG REPORT------------------------
Name: Frank MacLachlan
Email address: fpm@crash.cts.com
Date: 92/09/16


Hardware info:
    ISA mb w/ OPTi chip set, AMD 386DX/40, 64kb cache & AMI bios
    16 mb ram
    STB SVGA
    Western Digital WD1007V-SE2 ESDI HD/FD controller
    Imprimus 94166-182 182 mb ESDI hard disk


Problem description: 
    I/O errors are not reported when reading/writing from/to the raw
    wd disk device.  I noticed this when using 'dd' to scan a disk
    w/ known bad blocks and couldn't find any.

    The wd driver, '/sys/i386/isa/wd.c', sets the B_ERROR bit in
    bp->b_flags at lines 533 and 553, but fails to put an error code
    into bp->b_error.  Physio() in '/sys/kern/kern__physio.c', which
    manages the raw I/O in this case, ignores the B_ERROR bit in b_flags
    and looks for an error code in b_error.  The user program is fed
    garbage data and no clue that an error occurred.


Problem suspicions:


Solution:
    Apply the following patch to '/sys/i386/isa/wd.c'.  The patch
    assumes that you are patching a virgin wd.c; if not you'll have
    to apply the changes manually.
    

*** wd.c.ORIG	Wed Sep 16 23:32:01 1992
--- wd.c	Wed Sep 16 23:33:35 1992
***************
*** 530,535 ****
--- 530,536 ----
  		}
  #ifdef B_FORMAT
  		if (bp->b_flags & B_FORMAT) {
+ 			bp->b_error = EIO; 
  			bp->b_flags |= B_ERROR;
  			goto done;
  		}
***************
*** 550,555 ****
--- 551,557 ----
  						inb(wdc+wd_error), WDERR_BITS);
  #endif
  				}
+ 				bp->b_error = EIO; 
  				bp->b_flags |= B_ERROR;	/* flag the error */
  			}
  		} else if((du->dk_flags&DKFL_QUIET) == 0) {
----------------------------------------------------------------
UUCP: {hplabs!hp-sdd ucsd nosc}!crash!fpm
ARPA: crash!fpm@nosc.mil
INET: fpm@crash.cts.com