svn commit: r208610 - head/sys/boot/zfs

Andriy Gapon avg at FreeBSD.org
Fri May 28 07:34:20 UTC 2010


Author: avg
Date: Fri May 28 07:34:20 2010
New Revision: 208610
URL: http://svn.freebsd.org/changeset/base/208610

Log:
  boot/zfs: fix gang block reading code
  
  - use correct size (512) while reading a gang block
  - skip holes while reading child blocks
  - advance buffer pointer while reading child blocks
  
  PR:		144214
  MFC after:	10 days

Modified:
  head/sys/boot/zfs/zfsimpl.c

Modified: head/sys/boot/zfs/zfsimpl.c
==============================================================================
--- head/sys/boot/zfs/zfsimpl.c	Fri May 28 06:49:57 2010	(r208609)
+++ head/sys/boot/zfs/zfsimpl.c	Fri May 28 07:34:20 2010	(r208610)
@@ -958,12 +958,17 @@ zio_read_gang(spa_t *spa, const blkptr_t
 			break;
 	if (!vdev || !vdev->v_read)
 		return (EIO);
-	if (vdev->v_read(vdev, bp, &zio_gb, offset, SPA_GANGBLOCKSIZE))
+	if (vdev->v_read(vdev, NULL, &zio_gb, offset, SPA_GANGBLOCKSIZE))
 		return (EIO);
 
 	for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
-		if (zio_read(spa, &zio_gb.zg_blkptr[i], buf))
+		blkptr_t *gbp = &zio_gb.zg_blkptr[i];
+
+		if (BP_IS_HOLE(gbp))
+			continue;
+		if (zio_read(spa, gbp, buf))
 			return (EIO);
+		buf = (char*)buf + BP_GET_PSIZE(gbp);
 	}
  
 	return (0);
@@ -994,9 +999,8 @@ zio_read(spa_t *spa, const blkptr_t *bp,
 			continue;
 
 		if (DVA_GET_GANG(dva)) {
-			printf("ZFS: gang block detected!\n");
 			if (zio_read_gang(spa, bp, dva, buf))
-				return (EIO); 
+				continue;
 		} else {
 			vdevid = DVA_GET_VDEV(dva);
 			offset = DVA_GET_OFFSET(dva);


More information about the svn-src-head mailing list