DragonFly bugs List (threaded) for 2007-07
DragonFly BSD
DragonFly bugs List (threaded) for 2007-07
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: ccd on NATA problem - ata0: FAILURE - oversized DMA transfer attempt 73728 > 65536


From: YONETANI Tomokazu <qhwt+dfly@xxxxxxxxxx>
Date: Mon, 9 Jul 2007 21:27:07 +0900

On Mon, Jul 09, 2007 at 01:37:32PM +0900, YONETANI Tomokazu wrote:
> After having updated to HEAD yesterday, I started seeing DMA errors
> accessing filesystems on ccd devices:
>   ata0: FAILURE - oversized DMA transfer attempt 73728 > 65536

IIUC, in old-ATA, ad_strategy took care of transfer sizes larger than
the maximum I/O size of the device, but not in NATA (I guess GEOM layer
is handling it, right?).  Adjusting si_iosize_max (initially faked to
be 131072 when attached) in ccdinit() seems to work around this problem.

Cheers.

Index: ccd.c
===================================================================
RCS file: /home/source/dragonfly/cvs/src/sys/dev/disk/ccd/ccd.c,v
retrieving revision 1.48
diff -u -r1.48 ccd.c
--- ccd.c	19 Jun 2007 19:09:46 -0000	1.48
+++ ccd.c	9 Jul 2007 11:29:55 -0000
@@ -381,6 +381,7 @@
 	u_int64_t size;
 	u_int64_t minsize;
 	int maxsecsize;
+	int maxiosize;
 	struct partinfo dpart;
 	struct ccdgeom *ccg = &cs->sc_geom;
 	char tmppath[MAXPATHLEN];
@@ -405,6 +406,7 @@
 	 */
 	maxsecsize = 0;
 	minsize = 0;
+	maxiosize = cs->sc_dev->si_iosize_max;
 	for (ix = 0; ix < cs->sc_nccdisks; ix++) {
 		vp = ccd->ccd_vpp[ix];
 		ci = &cs->sc_cinfo[ix];
@@ -427,6 +429,8 @@
 		bcopy(tmppath, ci->ci_path, ci->ci_pathlen);
 
 		ci->ci_dev = vn_todev(vp);
+		if (maxiosize > ci->ci_dev->si_iosize_max)
+			maxiosize = ci->ci_dev->si_iosize_max;
 
 		/*
 		 * Get partition information for the component.
@@ -574,6 +578,11 @@
 	cs->sc_flags |= CCDF_INITED;
 	cs->sc_cflags = ccd->ccd_flags;	/* So we can find out later... */
 	cs->sc_unit = ccd->ccd_unit;
+	if (bootverbose) {
+		kprintf("%s: ccd%d: si_iosize_max %d -> %d\n", __func__,
+			ccd->ccd_unit, cs->sc_dev->si_iosize_max, maxiosize);
+	}
+	cs->sc_dev->si_iosize_max = maxiosize;
 	return (0);
 fail:
 	while (ci > cs->sc_cinfo) {



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