for (int i=0; i<numrep; i++)
out[i] = rawout[i];
}
+
+ bool check_crush_rule(int ruleset, int type, int size, ostream& ss) {
+
+ assert(crush);
+
+ __u32 i;
+ for (i = 0; i < crush->max_rules; i++) {
+ if (crush->rules[i] &&
+ crush->rules[i]->mask.ruleset == ruleset &&
+ crush->rules[i]->mask.type == type) {
+
+ if (crush->rules[i]->mask.min_size <= size &&
+ crush->rules[i]->mask.max_size >= size) {
+ return true;
+ } else if (size < crush->rules[i]->mask.min_size) {
+ ss << "pool size is smaller than the crush rule min size";
+ return false;
+ } else {
+ ss << "pool size is bigger than the crush rule max size";
+ return false;
+ }
+ }
+ }
+
+ return false;
+ }
int read_from_file(const char *fn) {
bufferlist bl;
dout(10) << " prepare_pool_size returns " << r << dendl;
return r;
}
- const int64_t minsize = osdmap.crush->get_rule_mask_min_size(crush_ruleset);
- if ((int64_t)size < minsize) {
- *ss << "pool size " << size << " is smaller than crush ruleset name "
- << crush_ruleset_name << " min size " << minsize;
- return -EINVAL;
- }
- const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(crush_ruleset);
- if ((int64_t)size > maxsize) {
- *ss << "pool size " << size << " is bigger than crush ruleset name "
- << crush_ruleset_name << " max size " << maxsize;
+
+ if (!osdmap.crush->check_crush_rule(crush_ruleset, pool_type, size, *ss)) {
return -EINVAL;
}
+
uint32_t stripe_width = 0;
r = prepare_pool_stripe_width(pool_type, erasure_code_profile, &stripe_width, ss);
if (r) {
ss << "crush ruleset " << n << " does not exist";
return -ENOENT;
}
- const int64_t poolsize = p.get_size();
- const int64_t minsize = osdmap.crush->get_rule_mask_min_size(n);
- if (poolsize < minsize) {
- ss << "pool size " << poolsize << " is smaller than crush ruleset "
- << n << " min size " << minsize;
- return -EINVAL;
- }
- const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(n);
- if (poolsize > maxsize) {
- ss << "pool size " << poolsize << " is bigger than crush ruleset "
- << n << " max size " << maxsize;
+
+ if (!osdmap.crush->check_crush_rule(n, p.get_type(), p.get_size(), ss)) {
return -EINVAL;
}
p.crush_ruleset = n;