Re: Oops while booting

Manfred Spraul (masp0008@stud.uni-sb.de)
Sat, 9 Jan 1999 14:31:03 +0100


I think that the code in scsi_old_done() is still not correct:
as far as I see, the 3rd call to scsi_reset(SYNC) assumes that
scsi_old_done() is called from ncr53c8xx_reset():

-- scsi_obsolete, lines 613ff
printk("scsi%d channel %d : resetting for second half of retries.\n",
SCpnt->host->host_no, SCpnt->channel);
scsi_reset(SCpnt, SCSI_RESET_SYNCHRONOUS);
break; // <<<<<<<< this will leave the function without REDO
// I think you should remove this break so that the
// code falls-through to REDO.
}
}
--------------

Gerard wrote:
> It seems that numerous scsi low-level
>drivers still use the old scsi code and so may be affected by the problem.
>If the scsi_obsolete stuff is the culprit, then we probably should try
>fixing it instead of still bloating low-level drivers.

I think that Gerard is right:
Many scsi drivers use the old error handling (~ 8 old, 6 new), and I'm sure
that many of them will cause an Oops during scsi_reset. I think that you
should add a protection that disables scsi_old_done() during
scsi_reset(SYNC). At least you should add a printk() that helps to find the
problem.

e.g. add a new flag to SCpnt->flags: "DISABLE_DONE" or
"DONE_COMPATIBILITY_MODE"
set this flag before scsi_reset(SYNC).
reset this flag after scsi_reset(SYNC).
ignore all call to scsi_old_done() if the flag is set. (or printk(..))

if(SCpnt->flags & DISABLE_DONE)
{
printk(KERN_??? "Illegal scsi_old_done() call from driver %s",
SCpnt->host->hostt->name);
return;
}

Regards,
Manfred

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/