106
106
#include <sys/zio.h>
107
107
#include <sys/zil.h>
108
108
#include <sys/zil_impl.h>
109
+ #include <sys/vdev_anyraid.h>
109
110
#include <sys/vdev_draid.h>
110
111
#include <sys/vdev_impl.h>
111
112
#include <sys/vdev_file.h>
@@ -278,6 +279,7 @@ extern uint64_t raidz_expand_max_reflow_bytes;
278
279
extern uint_t raidz_expand_pause_point ;
279
280
extern boolean_t ddt_prune_artificial_age ;
280
281
extern boolean_t ddt_dump_prune_histogram ;
282
+ extern uint64_t zfs_anyraid_min_tile_size ;
281
283
282
284
283
285
static ztest_shared_opts_t * ztest_shared_opts ;
@@ -673,10 +675,12 @@ fatal(int do_perror, const char *message, ...)
673
675
fatal_msg = buf ; /* to ease debugging */
674
676
675
677
out :
676
- if (ztest_dump_core )
678
+ if (ztest_dump_core ) {
677
679
abort ();
678
- else
680
+ } else {
681
+ // NOTE: Not safe if we've called kernel_fini already
679
682
dump_debug_buffer ();
683
+ }
680
684
681
685
exit (3 );
682
686
}
@@ -769,7 +773,7 @@ static ztest_option_t option_table[] = {
769
773
DEFAULT_RAID_CHILDREN , NULL },
770
774
{ 'R' , "raid-parity" , "INTEGER" , "Raid parity" ,
771
775
DEFAULT_RAID_PARITY , NULL },
772
- { 'K' , "raid-kind" , "raidz|eraidz|draid|random" , "Raid kind" ,
776
+ { 'K' , "raid-kind" , "raidz|eraidz|draid|anyraid| random" , "Raid kind" ,
773
777
NO_DEFAULT , "random" },
774
778
{ 'D' , "draid-data" , "INTEGER" , "Number of draid data drives" ,
775
779
DEFAULT_DRAID_DATA , NULL },
@@ -1119,7 +1123,7 @@ process_options(int argc, char **argv)
1119
1123
}
1120
1124
1121
1125
if (strcmp (raid_kind , "random" ) == 0 ) {
1122
- switch (ztest_random (3 )) {
1126
+ switch (ztest_random (4 )) {
1123
1127
case 0 :
1124
1128
raid_kind = "raidz" ;
1125
1129
break ;
@@ -1129,6 +1133,9 @@ process_options(int argc, char **argv)
1129
1133
case 2 :
1130
1134
raid_kind = "draid" ;
1131
1135
break ;
1136
+ case 3 :
1137
+ raid_kind = "anyraid" ;
1138
+ break ;
1132
1139
}
1133
1140
1134
1141
if (ztest_opts .zo_verbose >= 3 )
@@ -1180,11 +1187,25 @@ process_options(int argc, char **argv)
1180
1187
zo -> zo_raid_parity = MIN (zo -> zo_raid_parity ,
1181
1188
zo -> zo_raid_children - 1 );
1182
1189
1183
- } else /* using raidz */ {
1184
- ASSERT0 (strcmp (raid_kind , "raidz" ));
1190
+ } else if (strcmp (raid_kind , "raidz" ) == 0 ) {
1191
+ zo -> zo_raid_parity = MIN (zo -> zo_raid_parity ,
1192
+ zo -> zo_raid_children - 1 );
1193
+ } else if (strcmp (raid_kind , "anyraid" ) == 0 ) {
1194
+ uint64_t min_devsize ;
1195
+
1196
+ /* With fewer disks use 1G, otherwise 512M is OK */
1197
+ min_devsize = (ztest_opts .zo_raid_children < 16 ) ?
1198
+ (1ULL << 30 ) : (512ULL << 20 );
1199
+ if (zo -> zo_vdev_size < min_devsize )
1200
+ zo -> zo_vdev_size = min_devsize ;
1185
1201
1186
1202
zo -> zo_raid_parity = MIN (zo -> zo_raid_parity ,
1187
1203
zo -> zo_raid_children - 1 );
1204
+
1205
+ (void ) strlcpy (zo -> zo_raid_type , VDEV_TYPE_ANYRAID ,
1206
+ sizeof (zo -> zo_raid_type ));
1207
+ } else {
1208
+ fatal (B_FALSE , "invalid raid kind %s" , raid_kind );
1188
1209
}
1189
1210
1190
1211
zo -> zo_vdevtime =
@@ -1375,6 +1396,9 @@ make_vdev_raid(const char *path, const char *aux, const char *pool, size_t size,
1375
1396
fnvlist_add_uint64 (raid , ZPOOL_CONFIG_DRAID_NDATA , ndata );
1376
1397
fnvlist_add_uint64 (raid , ZPOOL_CONFIG_DRAID_NSPARES , nspares );
1377
1398
fnvlist_add_uint64 (raid , ZPOOL_CONFIG_DRAID_NGROUPS , ngroups );
1399
+ } else if (strcmp (ztest_opts .zo_raid_type , VDEV_TYPE_ANYRAID ) == 0 ) {
1400
+ fnvlist_add_uint8 (raid , ZPOOL_CONFIG_ANYRAID_PARITY_TYPE ,
1401
+ VAP_MIRROR );
1378
1402
}
1379
1403
1380
1404
for (c = 0 ; c < r ; c ++ )
@@ -3165,7 +3189,8 @@ ztest_spa_upgrade(ztest_ds_t *zd, uint64_t id)
3165
3189
return ;
3166
3190
3167
3191
/* dRAID added after feature flags, skip upgrade test. */
3168
- if (strcmp (ztest_opts .zo_raid_type , VDEV_TYPE_DRAID ) == 0 )
3192
+ if (strcmp (ztest_opts .zo_raid_type , VDEV_TYPE_DRAID ) == 0 ||
3193
+ strcmp (ztest_opts .zo_raid_type , VDEV_TYPE_ANYRAID ) == 0 )
3169
3194
return ;
3170
3195
3171
3196
mutex_enter (& ztest_vdev_lock );
@@ -3789,28 +3814,47 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
3789
3814
if (ztest_opts .zo_raid_children > 1 ) {
3790
3815
if (strcmp (oldvd -> vdev_ops -> vdev_op_type , "raidz" ) == 0 )
3791
3816
ASSERT3P (oldvd -> vdev_ops , = = , & vdev_raidz_ops );
3817
+ else if (strcmp (oldvd -> vdev_ops -> vdev_op_type , "anyraid" ) == 0 )
3818
+ ASSERT3P (oldvd -> vdev_ops , = = , & vdev_anyraid_ops );
3792
3819
else
3793
3820
ASSERT3P (oldvd -> vdev_ops , = = , & vdev_draid_ops );
3794
3821
oldvd = oldvd -> vdev_child [leaf % raidz_children ];
3795
3822
}
3796
3823
3824
+ if (!replacing && oldvd -> vdev_parent -> vdev_ops == & vdev_anyraid_ops ) {
3825
+ oldvd = oldvd -> vdev_parent ;
3826
+ }
3827
+
3797
3828
/*
3798
3829
* If we're already doing an attach or replace, oldvd may be a
3799
- * mirror vdev -- in which case, pick a random child.
3830
+ * mirror vdev -- in which case, pick a random child. For anyraid vdevs,
3831
+ * attachment occurs at the parent level.
3800
3832
*/
3801
- while (oldvd -> vdev_children != 0 ) {
3833
+ while (oldvd -> vdev_children != 0 && oldvd -> vdev_ops !=
3834
+ & vdev_anyraid_ops ) {
3802
3835
oldvd_has_siblings = B_TRUE ;
3803
3836
ASSERT3U (oldvd -> vdev_children , >=, 2 );
3804
3837
oldvd = oldvd -> vdev_child [ztest_random (oldvd -> vdev_children )];
3805
3838
}
3806
3839
3807
3840
oldguid = oldvd -> vdev_guid ;
3808
- oldsize = vdev_get_min_asize (oldvd );
3841
+ if (oldvd -> vdev_ops != & vdev_anyraid_ops )
3842
+ oldsize = vdev_get_min_asize (oldvd );
3843
+ else
3844
+ oldsize = oldvd -> vdev_child [
3845
+ ztest_random (oldvd -> vdev_children )]-> vdev_asize ;
3809
3846
oldvd_is_log = oldvd -> vdev_top -> vdev_islog ;
3810
3847
oldvd_is_special =
3811
3848
oldvd -> vdev_top -> vdev_alloc_bias == VDEV_BIAS_SPECIAL ||
3812
3849
oldvd -> vdev_top -> vdev_alloc_bias == VDEV_BIAS_DEDUP ;
3813
- (void ) strlcpy (oldpath , oldvd -> vdev_path , MAXPATHLEN );
3850
+ if (oldvd -> vdev_path == NULL ) {
3851
+ ASSERT3P (oldvd -> vdev_ops , = = , & vdev_anyraid_ops );
3852
+ snprintf (oldpath , MAXPATHLEN , "%s-%llu" ,
3853
+ oldvd -> vdev_ops -> vdev_op_type ,
3854
+ (u_longlong_t )oldvd -> vdev_id );
3855
+ } else {
3856
+ (void ) strlcpy (oldpath , oldvd -> vdev_path , MAXPATHLEN );
3857
+ }
3814
3858
pvd = oldvd -> vdev_parent ;
3815
3859
pguid = pvd -> vdev_guid ;
3816
3860
@@ -3819,7 +3863,8 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
3819
3863
* to the detach the pool is scrubbed in order to prevent creating
3820
3864
* unrepairable blocks as a result of the data corruption injection.
3821
3865
*/
3822
- if (oldvd_has_siblings && ztest_random (2 ) == 0 ) {
3866
+ if (oldvd_has_siblings && oldvd -> vdev_ops != & vdev_anyraid_ops &&
3867
+ ztest_random (2 ) == 0 ) {
3823
3868
spa_config_exit (spa , SCL_ALL , FTAG );
3824
3869
3825
3870
error = ztest_scrub_impl (spa );
@@ -3883,7 +3928,9 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
3883
3928
* If newvd is a distributed spare and it's being attached to a
3884
3929
* dRAID which is not its parent it should fail with ENOTSUP.
3885
3930
*/
3886
- if (pvd -> vdev_ops != & vdev_mirror_ops &&
3931
+ if (oldvd -> vdev_ops == & vdev_anyraid_ops )
3932
+ expected_error = 0 ;
3933
+ else if (pvd -> vdev_ops != & vdev_mirror_ops &&
3887
3934
pvd -> vdev_ops != & vdev_root_ops && (!replacing ||
3888
3935
pvd -> vdev_ops == & vdev_replacing_ops ||
3889
3936
pvd -> vdev_ops == & vdev_spare_ops ))
@@ -3895,7 +3942,9 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
3895
3942
expected_error = replacing ? 0 : EBUSY ;
3896
3943
else if (vdev_lookup_by_path (rvd , newpath ) != NULL )
3897
3944
expected_error = EBUSY ;
3898
- else if (!newvd_is_dspare && newsize < oldsize )
3945
+ else if (newsize < oldsize && !(newvd_is_dspare ||
3946
+ (pvd -> vdev_ops == & vdev_anyraid_ops &&
3947
+ newsize < pvd -> vdev_ops -> vdev_op_min_asize (pvd , oldvd ))))
3899
3948
expected_error = EOVERFLOW ;
3900
3949
else if (ashift > oldvd -> vdev_top -> vdev_ashift )
3901
3950
expected_error = EDOM ;
@@ -3916,8 +3965,9 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id)
3916
3965
* When supported select either a healing or sequential resilver.
3917
3966
*/
3918
3967
boolean_t rebuilding = B_FALSE ;
3919
- if (pvd -> vdev_ops == & vdev_mirror_ops ||
3920
- pvd -> vdev_ops == & vdev_root_ops ) {
3968
+ if (oldvd -> vdev_ops != & vdev_anyraid_ops &&
3969
+ (pvd -> vdev_ops == & vdev_mirror_ops ||
3970
+ pvd -> vdev_ops == & vdev_root_ops )) {
3921
3971
rebuilding = !!ztest_random (2 );
3922
3972
}
3923
3973
@@ -8994,6 +9044,9 @@ main(int argc, char **argv)
8994
9044
metaslab_df_alloc_threshold =
8995
9045
zs -> zs_metaslab_df_alloc_threshold ;
8996
9046
9047
+ zfs_anyraid_min_tile_size = MIN (zfs_anyraid_min_tile_size ,
9048
+ ztest_opts .zo_vdev_size / 8 );
9049
+
8997
9050
if (zs -> zs_do_init )
8998
9051
ztest_run_init ();
8999
9052
else
0 commit comments