ss << "ok";
} else {
errno = 0;
- int who = strtol(m->cmd[0].c_str(), 0, 10);
+ int who = parse_osd_id(m->cmd[0].c_str(), &ss);
m->cmd.erase(m->cmd.begin()); //done with target num now
- if (!errno && who >= 0) {
+ if (who < 0) {
+ r = -EINVAL;
+ } else {
if (osdmap.is_up(who)) {
mon->send_command(osdmap.get_inst(who), m->cmd, paxos->get_version());
r = 0;
ss << "osd." << who << " not up";
r = -ENOENT;
}
- } else ss << "specify osd number or *";
+ }
}
}
else if (m->cmd[1] == "map" && m->cmd.size() == 4) {
r = 0;
ss << " instructed to " << m->cmd[1];
} else {
- long osd = strtol(m->cmd[2].c_str(), 0, 10);
- if (osdmap.is_up(osd)) {
+ long osd = parse_osd_id(m->cmd[2].c_str(), &ss);
+ if (osd < 0) {
+ r = -EINVAL;
+ } else if (osdmap.is_up(osd)) {
mon->try_send_message(new MOSDScrub(osdmap.get_fsid(),
m->cmd[1] == "repair",
m->cmd[1] == "deep-scrub"),
osdmap.get_inst(osd));
r = 0;
ss << "osd." << osd << " instructed to " << m->cmd[1];
- } else
+ } else {
ss << "osd." << osd << " is not up";
+ }
}
}
else if (m->cmd[1] == "lspools") {
else if (m->cmd[1] == "down" && m->cmd.size() >= 3) {
bool any = false;
for (unsigned j = 2; j < m->cmd.size(); j++) {
- long osd = strtol(m->cmd[j].c_str(), 0, 10);
- if (!osdmap.exists(osd)) {
+ long osd = parse_osd_id(m->cmd[j].c_str(), &ss);
+ if (osd < 0) {
+ err = -EINVAL;
+ } else if (!osdmap.exists(osd)) {
ss << "osd." << osd << " does not exist";
} else if (osdmap.is_down(osd)) {
ss << "osd." << osd << " is already down";
else if (m->cmd[1] == "out" && m->cmd.size() >= 3) {
bool any = false;
for (unsigned j = 2; j < m->cmd.size(); j++) {
- long osd = strtol(m->cmd[j].c_str(), 0, 10);
- if (!osdmap.exists(osd)) {
+ long osd = parse_osd_id(m->cmd[j].c_str(), &ss);
+ if (osd < 0) {
+ err = -EINVAL;
+ } else if (!osdmap.exists(osd)) {
ss << "osd." << osd << " does not exist";
} else if (osdmap.is_out(osd)) {
ss << "osd." << osd << " is already out";
else if (m->cmd[1] == "in" && m->cmd.size() >= 3) {
bool any = false;
for (unsigned j = 2; j < m->cmd.size(); j++) {
- long osd = strtol(m->cmd[j].c_str(), 0, 10);
- if (osdmap.is_in(osd)) {
+ long osd = parse_osd_id(m->cmd[j].c_str(), &ss);
+ if (osd < 0) {
+ err = -EINVAL;
+ } else if (osdmap.is_in(osd)) {
ss << "osd." << osd << " is already in";
err = 0;
} else if (!osdmap.exists(osd)) {
}
}
else if (m->cmd[1] == "reweight" && m->cmd.size() == 4) {
- long osd = strtol(m->cmd[2].c_str(), 0, 10);
- float w = strtof(m->cmd[3].c_str(), 0);
- long ww = (int)((float)CEPH_OSD_IN*w);
- if (osdmap.exists(osd)) {
- pending_inc.new_weight[osd] = ww;
- ss << "reweighted osd." << osd << " to " << w << " (" << ios::hex << ww << ios::dec << ")";
- getline(ss, rs);
- paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version()));
- return true;
- }
+ long osd = parse_osd_id(m->cmd[2].c_str(), &ss);
+ if (osd < 0) {
+ err = -EINVAL;
+ } else {
+ float w = strtof(m->cmd[3].c_str(), 0);
+ long ww = (int)((float)CEPH_OSD_IN*w);
+ if (osdmap.exists(osd)) {
+ pending_inc.new_weight[osd] = ww;
+ ss << "reweighted osd." << osd << " to " << w << " (" << ios::hex << ww << ios::dec << ")";
+ getline(ss, rs);
+ paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version()));
+ return true;
+ }
+ }
}
else if (m->cmd[1] == "lost" && m->cmd.size() >= 3) {
- string err;
- int osd = strict_strtol(m->cmd[2].c_str(), 10, &err);
- if (!err.empty()) {
- ss << err;
+ int osd = parse_osd_id(m->cmd[2].c_str(), &ss);
+ if (osd < 0) {
+ err = -EINVAL;
}
else if ((m->cmd.size() < 4) || m->cmd[3] != "--yes-i-really-mean-it") {
ss << "are you SURE? this might mean real, permanent data loss. pass "
else if (m->cmd[1] == "rm" && m->cmd.size() >= 3) {
bool any = false;
for (unsigned j = 2; j < m->cmd.size(); j++) {
- long osd = strtol(m->cmd[j].c_str(), 0, 10);
- if (!osdmap.exists(osd)) {
+ long osd = parse_osd_id(m->cmd[j].c_str(), &ss);
+ if (osd < 0) {
+ err = -EINVAL;
+ } else if (!osdmap.exists(osd)) {
ss << "osd." << osd << " does not exist";
err = 0;
} else if (osdmap.is_up(osd)) {