if (have_rmaps)
rule_name_rmap[name] = i;
}
+ bool rule_valid_for_pool_type(int rule_id, int ptype) const {
+ auto rule_type = get_rule_type(rule_id);
+ switch (ptype) {
+ case CEPH_PG_TYPE_REPLICATED:
+ return rule_type == CRUSH_RULE_TYPE_REPLICATED ||
+ rule_type == CRUSH_RULE_TYPE_MSR_FIRSTN;
+ case CEPH_PG_TYPE_ERASURE:
+ return rule_type == CRUSH_RULE_TYPE_ERASURE ||
+ rule_type == CRUSH_RULE_TYPE_MSR_INDEP;
+ default:
+ ceph_abort_msg("impossible");
+ }
+ }
+
bool is_shadow_item(int id) const {
const char *name = get_item_name(id);
return name && !is_valid_crush_name(name);
return r;
}
- if (osdmap.crush->get_rule_type(crush_rule) != (int)pool_type) {
+ if (!osdmap.crush->rule_valid_for_pool_type(crush_rule, pool_type)) {
*ss << "crush rule " << crush_rule << " type does not match pool";
return -EINVAL;
}
return -EPERM;
}
}
- if (osdmap.crush->get_rule_type(p.get_crush_rule()) != (int)p.type) {
+ if (!osdmap.crush->rule_valid_for_pool_type(p.get_crush_rule(), p.type)) {
ss << "crush rule " << p.get_crush_rule() << " type does not match pool";
return -EINVAL;
}
ss << cpp_strerror(id);
return -ENOENT;
}
- if (osdmap.crush->get_rule_type(id) != (int)p.get_type()) {
+ if (!osdmap.crush->rule_valid_for_pool_type(id, p.get_type())) {
ss << "crush rule " << id << " type does not match pool";
return -EINVAL;
}
<< " but it is not present";
return -EINVAL;
}
- if (newcrush->get_rule_type(ruleno) != (int)pool.get_type()) {
+ if (!newcrush->rule_valid_for_pool_type(ruleno, pool.get_type())) {
*ss << "pool " << i.first << " type does not match rule " << ruleno;
return -EINVAL;
}