Live CD problems.

Matthew Dillon dillon at apollo.backplane.com
Sun Jul 22 12:37:18 PDT 2007


:Hi,
:
:During boot of the live cd this shows up:
:
:Mounting root from cd9660:cd0c
:ata1: FAILURE - zero length DMA transfer attempted
:acd0: setting up DMA failed
:ata1: FAILURE - zero length DMA transfer attempted
:acd0: setting up DMA failed
:ata1: FAILURE - zero length DMA transfer attempted
:acd0: setting up DMA failed
:ata1: FAILURE - zero length DMA transfer attempted
:acd0: setting up DMA failed
:ata1: FAILURE - zero length DMA transfer attempted
:acd0: setting up DMA failed

    That is definitely not correct.  If you don't mind burning another dead
    CD could you please try this patch?  It will force the system to panic
    when it tries to do a 0-length I/O.  Then get a backtrace from the DDB
    prompt so we can see the call chain that leads up to the problem.

					-Matt

Index: ata-dma.c
===================================================================
RCS file: /cvs/src/sys/dev/disk/nata/ata-dma.c,v
retrieving revision 1.4
diff -u -p -r1.4 ata-dma.c
--- ata-dma.c	5 Jun 2007 18:30:40 -0000	1.4
+++ ata-dma.c	22 Jul 2007 19:32:04 -0000
@@ -227,6 +227,7 @@ 	return EIO;
     }
     if (!count) {
 	device_printf(dev, "FAILURE - zero length DMA transfer attempted\n");
+	panic("zero length DMA transfer");
 	return EIO;
     }
     if (((uintptr_t)data & (ch->dma->alignment - 1)) ||
Index: atapi-cd.c
===================================================================
RCS file: /cvs/src/sys/dev/disk/nata/atapi-cd.c,v
retrieving revision 1.7
diff -u -p -r1.7 atapi-cd.c
--- atapi-cd.c	3 Jun 2007 04:48:29 -0000	1.7
+++ atapi-cd.c	22 Jul 2007 19:35:03 -0000
@@ -785,6 +785,8 @@ 	biodone(bp);
 	return 0;
     }
 
+    KASSERT(bbp->b_bcount != 0, ("acd_strategy: 0-length I/O"));
+
     bp->bio_driver_info = cdev;
     bbp->b_resid = bbp->b_bcount;
 
@@ -842,6 +844,8 @@ 	lba = (bp->bio_offset & 0x00FFFFFFFFFFF
     }
 
     count = bbp->b_bcount / blocksize;
+    KASSERT(count != 0, ("acd_strategy: 0-length I/O %d bytes vs %d blksize",
+		bbp->b_bcount, blocksize));
 
     if (bbp->b_cmd == BUF_CMD_READ) {
 	/* if transfer goes beyond range adjust it to be within limits */





More information about the Bugs mailing list