@@ -1485,6 +1485,31 @@ vdev_anyraid_mapped(vdev_t *vd, uint64_t offset)
1485
1485
return (result );
1486
1486
}
1487
1487
1488
+ /*
1489
+ * Return the maximum asize for a rebuild zio in the provided range
1490
+ * given the following constraints. An anyraid chunk may not:
1491
+ *
1492
+ * - Exceed the maximum allowed block size (SPA_MAXBLOCKSIZE), or
1493
+ * - Span anyraid tiles
1494
+ */
1495
+ static uint64_t
1496
+ vdev_anyraid_rebuild_asize (vdev_t * vd , uint64_t start , uint64_t asize ,
1497
+ uint64_t max_segment )
1498
+ {
1499
+ vdev_anyraid_t * var = vd -> vdev_tsd ;
1500
+ ASSERT3P (vd -> vdev_ops , = = , & vdev_anyraid_ops );
1501
+
1502
+ uint64_t psize = MIN (P2ROUNDUP (max_segment , 1 << vd -> vdev_ashift ),
1503
+ SPA_MAXBLOCKSIZE );
1504
+
1505
+ if (start / var -> vd_tile_size !=
1506
+ (start + psize ) / var -> vd_tile_size ) {
1507
+ psize = P2ROUNDUP (start , var -> vd_tile_size ) - start ;
1508
+ }
1509
+
1510
+ return (MIN (asize , vdev_psize_to_asize (vd , psize )));
1511
+ }
1512
+
1488
1513
vdev_ops_t vdev_anyraid_ops = {
1489
1514
.vdev_op_init = vdev_anyraid_init ,
1490
1515
.vdev_op_fini = vdev_anyraid_fini ,
@@ -1502,7 +1527,7 @@ vdev_ops_t vdev_anyraid_ops = {
1502
1527
.vdev_op_rele = NULL ,
1503
1528
.vdev_op_remap = NULL ,
1504
1529
.vdev_op_xlate = vdev_anyraid_xlate ,
1505
- .vdev_op_rebuild_asize = NULL , // TODO do we want to support rebuilds?
1530
+ .vdev_op_rebuild_asize = vdev_anyraid_rebuild_asize ,
1506
1531
.vdev_op_metaslab_init = NULL ,
1507
1532
.vdev_op_config_generate = vdev_anyraid_config_generate ,
1508
1533
.vdev_op_nparity = vdev_anyraid_nparity ,
0 commit comments