Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Nov 1995 09:27:02 +0100 (MET)
From:      J Wunsch <j@uriah.heep.sax.de>
To:        asami@cs.berkeley.edu (Satoshi Asami)
Cc:        current@freebsd.org
Subject:   Re: Panic while reading CDROM with latest -current
Message-ID:  <199511150827.JAA05590@uriah.heep.sax.de>
In-Reply-To: <199511150321.TAA00669@silvia.HIP.Berkeley.EDU> from "Satoshi Asami" at Nov 14, 95 07:21:51 pm

next in thread | previous in thread | raw e-mail | index | archive | help
As Satoshi Asami wrote:
> 
> I got a panic while reading from a CDROM.  A simple command such as
> "dd if=/cdrom/packages/printing/mltex-3.1415.tgz of=/dev/null" will
> cause a panic reliably.
> 
> I moved the CDROM drive from the Adaptec 2940UW to NCR 53c825 today,
> and the panic happened after that.  But then, I haven't been using the
> CDROM for anything else than playing audio CD's for a while, so this
> may just be a coincidence.
> 
> ===
> Fatal trap 12: page fault while in kernel mode
> fault virtual address = 0x242
> fault code            = supervisor read, page not present
> instruction pointer   = 0x8:0x60125000
                              0xf0125000

...i assume.

> code segment          = base 0x0, limit 0xfffff, type 0x1b
>                       = DPL 0, pres 1, def32 1, gran 1
> processor eflags      = interrupt enabled, resume, IOPL=0
> current process       = 28 (dd)
> interrupt mask        = bio
> panic: page fault
> ===
> 
> nm /kernel | sort gives:
> 
> ===
> f0124b44 T _vfs_bio_awrite
> f0124d14 t _getnewbuf
> f0124fc8 T _incore
> f012503c T _inmem

Argl!  This is the incore() panic again.  At least Hellmuth Michaelis
and somebody else who's name i forgot have been reporting this one,
but it only occured for the last (highest ID #) CD drive of a multi-CD
environment for them.  So it's never been tracked down to the bitter
end.

If i look at your configuration:

> 19: ncr0        at pci0:15 # int a irq 9
> 20: sd2 at SCSI bus 1:1:0 (ready)
> 21: sd3 at SCSI bus 1:2:0 (ready)
> 22: sd4 at SCSI bus 1:3:0 (ready)
> 23: sd5 at SCSI bus 1:4:0 (ready)
> 24: sd6 at SCSI bus 1:5:0 (ready)
> 25: cd0 at SCSI bus 1:6:0 (ready) (open)

there's some resemblance to their environment however: the CD is the
highest ID#, only the lower numbered devices are sd ones.  Dunno if
this is an incidence only.

FWIW, the problem happens:

struct buf *
incore(struct vnode * vp, daddr_t blkno)
{
        struct buf *bp;
        struct bufhashhdr *bh;

        int s = splbio();

        bh = BUFHASH(vp, blkno);
        bp = bh->lh_first;
             ^^^^  <<================ here

        /* Search hash chain */
        while (bp != NULL) {
                /* hit */
                if (bp->b_vp == vp && bp->b_lblkno == blkno &&
                    (bp->b_flags & B_INVAL) == 0) {
                        break;
                }
                bp = bp->b_hash.le_next;
        }
        splx(s);
        return (bp);
}

Somehow, BUFHASH() returns a bogus value (but is apparently believed
to always return valid pointers /* CANTHAPPEN */).

-- 
cheers, J"org

joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ -- NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199511150827.JAA05590>