Subject: Re: kern/36690: KASSERT(delta > 0) in kern_physio
To: None <gnats-bugs@NetBSD.org>
From: Manuel Bouyer <bouyer@antioche.eu.org>
List: netbsd-bugs
Date: 10/01/2007 20:44:13
--ew6BAiZeqk4r7MaW
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Sat, Sep 29, 2007 at 01:45:02PM +0000, Paul Ripke wrote:
> The following reply was made to PR kern/36690; it has been noted by GNATS.
> 
> From: Paul Ripke <stix@stix.id.au>
> To: NetBSD gnats-bugs <gnats-bugs@NetBSD.org>
> Cc: 
> Subject: Re: kern/36690: KASSERT(delta > 0) in kern_physio
> Date: Sat, 29 Sep 2007 23:42:39 +1000
> 
>  This appears to be due to instances like the following:
>  
>  st0: 65536-byte tape record too big for 32768-byte user buffer
>  st0(ahc0:0:6:0):  Check Condition on CDB: 0x08 00 00 80 00 00
>      SENSE KEY:  No Additional Sense
>                  Incorrect Length Indicator Set
>     INFO FIELD:  -32768
>       ASC/ASCQ:  No Additional Sense Information
>  panic: kernel diagnostic assertion "delta > 0" failed: file "/l/netbsd/netbsd-4/src/sys/kern/kern_physio.c", line 441
>  
>  100% reproducible on head of netbsd-4 branch.

Should be fixed in st.c 1.200. Can you please try the attached patch ?

-- 
Manuel Bouyer <bouyer@antioche.eu.org>
     NetBSD: 26 ans d'experience feront toujours la difference
--

--ew6BAiZeqk4r7MaW
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=diff

Index: st.c
===================================================================
RCS file: /cvsroot/src/sys/dev/scsipi/st.c,v
retrieving revision 1.198
retrieving revision 1.200
diff -u -p -u -r1.198 -r1.200
--- st.c	29 Jul 2007 12:50:23 -0000	1.198
+++ st.c	1 Oct 2007 18:43:30 -0000	1.200
@@ -1,4 +1,4 @@
-/*	$NetBSD: st.c,v 1.198 2007/07/29 12:50:23 ad Exp $ */
+/*	$NetBSD: st.c,v 1.200 2007/10/01 18:43:30 bouyer Exp $ */
 
 /*-
  * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: st.c,v 1.198 2007/07/29 12:50:23 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: st.c,v 1.200 2007/10/01 18:43:30 bouyer Exp $");
 
 #include "opt_scsi.h"
 
@@ -1219,6 +1219,7 @@ ststart(struct scsipi_periph *periph)
 					if (st_space(st, 0, SP_FILEMARKS, 0)) {
 						BUFQ_GET(st->buf_queue);
 						bp->b_error = EIO;
+						bp->b_resid = bp->b_bcount;
 						biodone(bp);
 						continue;
 					}
@@ -2234,8 +2235,16 @@ st_interpret_sense(struct scsipi_xfer *x
 				}
 			}
 		}
-		if (bp)
+		if (bp) {
 			bp->b_resid = info;
+			/*
+			 * buggy device ? A SDLT320 can report an info
+			 * field of 0x3de8000 on a Media Error/Write Error
+			 * for this CBD: 0x0a 00 00 80 00 00
+			 */
+			if (bp->b_resid > bp->b_bcount || bp->b_resid < 0)
+				bp->b_resid = bp->b_bcount;
+		}
 	}
 
 #ifndef SCSIPI_DEBUG

--ew6BAiZeqk4r7MaW--