[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Crash in recient snapshot of current.



On 8/25/05, Jason Crawford <jasonrcrawford_(_at_)_gmail_(_dot_)_com> wrote:
> On 8/25/05, Jason Crawford <jasonrcrawford_(_at_)_gmail_(_dot_)_com> wrote:
> > I updated my cvs tree today, and recompiled GENERIC with today's
> > source, and now the system crashes on boot, telling me that it cannot
> > read the disk label, but a GENERIC from two days ago can read the disk
> > label just fine. Here is the working dmesg from GENERIC of two days
> > ago, and dmesg from GENERIC from today with the trace and ps output.
> > Any other information that's needed, please ask, I'm not sure what
> > else to include, but this stuff is always asked for.
> >
> <snip dmesgs>
> A little more info, as I downloaded the August 24 snapshot, to see if
> my source tree had somehow gotten corrupted. I got an error message
> while in the bsd.rd kernel, that both fdisk and disklabel reported:
> DIOCGDINFO: Input/output error
> I'm not sure what that means exactly, but I'm sure that info would
> help in figuring out the problem.
> 
Even more information, I found the exact code that causes the crash.
It is whatever code that was commited between revision 1.86 and 1.87
of sd.c inside /usr/src/sys/scsi that is the culprit. I compiled the
most recient kernel except sd.c being revision 1.86, and it works. I
changed sd.c to revision 1.87 and the system crashes with the error
message reported in my first mail. I really hope that there is a
developer out there who will figure out why this is causing the crash,
because I can't see an obvious reason from the code. Here is the exact
diff for r1.86 to r1.87:

Index: sd.c
===================================================================
RCS file: /cvs/src/sys/scsi/sd.c,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- sd.c        21 Aug 2005 16:25:52 -0000      1.86
+++ sd.c        23 Aug 2005 23:31:04 -0000      1.87
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sd.c,v 1.86 2005/08/21 16:25:52 krw Exp $     */
+/*     $OpenBSD: sd.c,v 1.87 2005/08/23 23:31:04 krw Exp $     */
 /*     $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */

 /*-
@@ -216,10 +216,9 @@
            scsi_autoconf | SCSI_IGNORE_ILLEGAL_REQUEST |
            SCSI_IGNORE_MEDIA_CHANGE | SCSI_SILENT);

-       /* Try to start the unit if it wasn't ready. */
-       if (error == EIO)
-               error = scsi_start(sc_link, SSS_START,
-                   SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE);
+       /* Spin up the unit ready or not. */
+       error = scsi_start(sc_link, SSS_START, scsi_autoconf | SCSI_SILENT |
+           SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE);

        if (error)
                result = SDGP_RESULT_OFFLINE;
@@ -386,11 +385,10 @@
                    (part == RAW_PART && fmt == S_IFCHR) ? SCSI_SILENT : 0 |
                    SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE);

-               /* Try to start the unit if it wasn't ready. */
-               if (error == EIO)
-                       error = scsi_start(sc_link, SSS_START,
-                           SCSI_IGNORE_ILLEGAL_REQUEST |
-                           SCSI_IGNORE_MEDIA_CHANGE);
+               /* Spin up the unit, ready or not. */
+               error = scsi_start(sc_link, SSS_START,
+                   (part == RAW_PART && fmt == S_IFCHR) ? SCSI_SILENT : 0 |
+                   SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE);

                if (error) {
                        if (part == RAW_PART && fmt == S_IFCHR) {