From: Jianpeng Ma Date: Thu, 8 Jan 2015 05:50:01 +0000 (+0800) Subject: mon: check min_size range. X-Git-Tag: v0.93~260^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e3678f41e3d2b9c0367dc46a0273a9a62abeabf6;p=ceph.git mon: check min_size range. When set min_size value: A:for replicated pool, the value must be between in 1 and size B:for erasure pool, the value must be between in data_chunk_count) and size(data_chunk_count + code_chunk_count). Signed-off-by: Jianpeng Ma --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 97ed96e9d2b9..6f4ce931ebde 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3872,6 +3872,29 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, ss << "error parsing integer value '" << val << "': " << interr; return -EINVAL; } + + if (p.type != pg_pool_t::TYPE_ERASURE) { + if (n < 1 || n > p.size) { + ss << "pool min_size must be between 1 and " << (int)p.size; + return -EINVAL; + } + } else { + ErasureCodeInterfaceRef erasure_code; + int k; + stringstream tmp; + int err = get_erasure_code(p.erasure_code_profile, &erasure_code, tmp); + if (err == 0) { + k = erasure_code->get_data_chunk_count(); + } else { + ss << __func__ << " get_erasure_code failed: " << tmp; + return err;; + } + + if (n < k || n > p.size) { + ss << "pool min_size must be between " << k << " and " << (int)p.size; + return -EINVAL; + } + } p.min_size = n; } else if (var == "auid") { if (interr.length()) {