|
Lines 958-969
zio_read_gang(spa_t *spa, const blkptr_t *bp, const dva_t *dva, void *buf)
Link Here
|
| 958 |
break; |
969 |
break; |
| 959 |
if (!vdev || !vdev->v_read) |
970 |
if (!vdev || !vdev->v_read) |
| 960 |
return (EIO); |
971 |
return (EIO); |
| 961 |
if (vdev->v_read(vdev, bp, &zio_gb, offset, SPA_GANGBLOCKSIZE)) |
972 |
if (vdev->v_read(vdev, NULL, &zio_gb, offset, SPA_GANGBLOCKSIZE)) |
| 962 |
return (EIO); |
973 |
return (EIO); |
| 963 |
|
974 |
|
| 964 |
for (i = 0; i < SPA_GBH_NBLKPTRS; i++) { |
975 |
for (i = 0; i < SPA_GBH_NBLKPTRS; i++) { |
| 965 |
if (zio_read(spa, &zio_gb.zg_blkptr[i], buf)) |
976 |
blkptr_t *gbp = &zio_gb.zg_blkptr[i]; |
|
|
977 |
|
| 978 |
if (BP_IS_HOLE(gbp)) |
| 979 |
continue; |
| 980 |
if (zio_read(spa, gbp, buf)) |
| 966 |
return (EIO); |
981 |
return (EIO); |
|
|
982 |
buf = (char*)buf + BP_GET_PSIZE(gbp); |
| 967 |
} |
983 |
} |
| 968 |
|
984 |
|
| 969 |
return (0); |
985 |
return (0); |
|
Lines 994-1002
zio_read(spa_t *spa, const blkptr_t *bp, void *buf)
Link Here
|
| 994 |
continue; |
1010 |
continue; |
| 995 |
|
1011 |
|
| 996 |
if (DVA_GET_GANG(dva)) { |
1012 |
if (DVA_GET_GANG(dva)) { |
| 997 |
printf("ZFS: gang block detected!\n"); |
|
|
| 998 |
if (zio_read_gang(spa, bp, dva, buf)) |
1013 |
if (zio_read_gang(spa, bp, dva, buf)) |
| 999 |
return (EIO); |
1014 |
continue; |
| 1000 |
} else { |
1015 |
} else { |
| 1001 |
vdevid = DVA_GET_VDEV(dva); |
1016 |
vdevid = DVA_GET_VDEV(dva); |
| 1002 |
offset = DVA_GET_OFFSET(dva); |
1017 |
offset = DVA_GET_OFFSET(dva); |