diff --git a/raid/module.c b/raid/module.c index 9a8da20e..7043838d 100644 --- a/raid/module.c +++ b/raid/module.c @@ -80,8 +80,12 @@ void raid_gen(int nd, int np, size_t size, void **v) /* enforce limit on number of failures */ BUG_ON(np < 1); - BUG_ON(np > RAID_PARITY_MAX); + if (raid_mode_active == RAID_MODE_VANDERMONDE_RAID) + BUG_ON(np > 3); + else + BUG_ON(np > RAID_PARITY_MAX); + BUG_ON(raid_gen_ptr[np - 1] == 0); raid_gen_ptr[np - 1](nd, size, v); } @@ -104,7 +108,10 @@ void raid_rec(int nr, int *ir, int nd, int np, size_t size, void **v) /* enforce limit on number of failures */ BUG_ON(nr > np); - BUG_ON(np > RAID_PARITY_MAX); + if (raid_mode_active == RAID_MODE_VANDERMONDE_RAID) + BUG_ON(np > 3); + else + BUG_ON(np > RAID_PARITY_MAX); /* enforce order in index vector */ BUG_ON(nr >= 2 && ir[0] >= ir[1]); @@ -183,9 +190,17 @@ void raid_data(int nr, int *id, int *ip, int nd, size_t size, void **v) BUG_ON(nr >= 5 && ip[3] >= ip[4]); BUG_ON(nr >= 6 && ip[4] >= ip[5]); + /* enforce limit on index vector for parity */ + if (raid_mode_active == RAID_MODE_VANDERMONDE_RAID) + BUG_ON(nr > 0 && ip[nr - 1] >= 3); + else + BUG_ON(nr > 0 && ip[nr - 1] >= RAID_PARITY_MAX); + /* if failed data is present */ - if (nr != 0) - raid_rec_algo[nr - 1].rec(nr, id, ip, nd, size, v); + if (nr != 0) { + BUG_ON(raid_rec_ptr[nr - 1] == 0); + raid_rec_ptr[nr - 1](nr, id, ip, nd, size, v); + } } const char * raid_gen_tag(int na)