int do_list_children(librados::IoCtx &io_ctx, librbd::Image &image,
bool all_flag, Formatter *f)
{
- std::vector<librbd::child_info_t> children;
+ std::vector<librbd::linked_image_spec_t> children;
librbd::RBD rbd;
- int r = image.list_children2(&children);
+ int r = image.list_children3(&children);
if (r < 0)
return r;
if (f)
f->open_array_section("children");
- for (std::vector<librbd::child_info_t>::iterator it = children.begin();
- it != children.end(); ++it) {
- bool trash = it->trash;
+ for (auto& child : children) {
+ bool trash = child.trash;
if (f) {
if (all_flag) {
f->open_object_section("child");
- f->dump_string("pool", it->pool_name);
- f->dump_string("image", it->image_name);
- f->dump_string("id", it->image_id);
- f->dump_bool("trash", it->trash);
+ f->dump_string("pool", child.pool_name);
+ f->dump_string("pool_namespace", child.pool_namespace);
+ f->dump_string("image", child.image_name);
+ f->dump_string("id", child.image_id);
+ f->dump_bool("trash", child.trash);
f->close_section();
} else if (!trash) {
f->open_object_section("child");
- f->dump_string("pool", it->pool_name);
- f->dump_string("image", it->image_name);
+ f->dump_string("pool", child.pool_name);
+ f->dump_string("pool_namespace", child.pool_namespace);
+ f->dump_string("image", child.image_name);
f->close_section();
}
- } else {
- if (all_flag) {
- std::cout << it->pool_name << "/" << it->image_name;
- if (trash)
- std::cout << " (trash " << it->image_id << ")";
- std::cout << std::endl;
- } else if (!trash) {
- std::cout << it->pool_name << "/" << it->image_name << std::endl;
+ } else if (all_flag || !trash) {
+ std::cout << child.pool_name << "/";
+ if (!child.pool_namespace.empty()) {
+ std::cout << child.pool_namespace << "/";
+ }
+ std::cout << child.image_name;
+ if (trash) {
+ std::cout << " (trash " << child.image_id << ")";
}
+ std::cout << std::endl;
}
}
}
// parent info, if present
- std::string parent_pool, parent_name, parent_id, parent_snapname;
- if ((image.parent_info2(&parent_pool, &parent_name, &parent_id,
- &parent_snapname) == 0) &&
- parent_name.length() > 0) {
-
- librbd::trash_image_info_t trash_image_info;
- librbd::RBD rbd;
- r = rbd.trash_get(io_ctx, parent_id.c_str(), &trash_image_info);
- bool trash_image_info_valid = (r == 0);
-
+ librbd::linked_image_spec_t parent_image_spec;
+ librbd::snap_spec_t parent_snap_spec;
+ if ((image.get_parent(&parent_image_spec, &parent_snap_spec) == 0) &&
+ (parent_image_spec.image_name.length() > 0)) {
if (f) {
f->open_object_section("parent");
- f->dump_string("pool", parent_pool);
- f->dump_string("image", parent_name);
- f->dump_string("snapshot", parent_snapname);
- if (trash_image_info_valid) {
- f->dump_string("trash", parent_id);
- }
+ f->dump_string("pool", parent_image_spec.pool_name);
+ f->dump_string("pool_namespace", parent_image_spec.pool_namespace);
+ f->dump_string("image", parent_image_spec.image_name);
+ f->dump_string("id", parent_image_spec.image_id);
+ f->dump_string("snapshot", parent_snap_spec.name);
+ f->dump_bool("trash", parent_image_spec.trash);
if ((features & RBD_FEATURE_MIGRATING) != 0) {
f->dump_bool("migration_source", true);
}
f->dump_unsigned("overlap", overlap);
f->close_section();
} else {
- std::cout << "\tparent: " << parent_pool << "/" << parent_name
- << (parent_snapname.empty() ? "" : "@") << parent_snapname;
- if (trash_image_info_valid) {
- std::cout << " (trash " << parent_id << ")";
+ std::cout << "\tparent: " << parent_image_spec.pool_name << "/";
+ if (!parent_image_spec.pool_namespace.empty()) {
+ std::cout << parent_image_spec.pool_namespace << "/";
+ }
+ std::cout << parent_image_spec.image_name << "@"
+ << parent_snap_spec.name;
+ if (parent_image_spec.trash) {
+ std::cout << " (trash " << parent_image_spec.image_id << ")";
}
if ((features & RBD_FEATURE_MIGRATING) != 0) {
std::cout << " (migration source)";
{
int r = 0;
librbd::image_info_t info;
- std::string pool, image, snap, parent;
+ std::string parent;
// handle second-nth trips through loop
- r = w->img.parent_info(&pool, &image, &snap);
- if (r < 0 && r != -ENOENT)
+ librbd::linked_image_spec_t parent_image_spec;
+ librbd::snap_spec_t parent_snap_spec;
+ r = w->img.get_parent(&parent_image_spec, &parent_snap_spec);
+ if (r < 0 && r != -ENOENT) {
return r;
+ }
+
bool has_parent = false;
if (r != -ENOENT) {
- parent = pool + "/" + image + "@" + snap;
+ parent = parent_image_spec.pool_name + "/";
+ if (!parent_image_spec.pool_namespace.empty()) {
+ parent += parent_image_spec.pool_namespace + "/";
+ }
+ parent += parent_image_spec.image_name + "@" + parent_snap_spec.name;
has_parent = true;
}
f->dump_unsigned("size", info.size);
if (has_parent) {
f->open_object_section("parent");
- f->dump_string("pool", pool);
- f->dump_string("image", image);
- f->dump_string("snapshot", snap);
+ f->dump_string("pool", parent_image_spec.pool_name);
+ f->dump_string("pool_namespace", parent_image_spec.pool_namespace);
+ f->dump_string("image", parent_image_spec.image_name);
+ f->dump_string("snapshot", parent_snap_spec.name);
f->close_section();
}
f->dump_int("format", old_format ? 1 : 2);
r = w->img.snap_is_protected(s->name.c_str(), &is_protected);
if (r < 0)
return r;
- if (w->img.parent_info(&pool, &image, &snap) >= 0) {
- parent = pool + "/" + image + "@" + snap;
+ if (w->img.get_parent(&parent_image_spec, &parent_snap_spec) >= 0) {
+ parent = parent_image_spec.pool_name + "/";
+ if (!parent_image_spec.pool_namespace.empty()) {
+ parent += parent_image_spec.pool_namespace + "/";
+ }
+ parent += parent_image_spec.image_name + "@" + parent_snap_spec.name;
has_parent = true;
}
if (f) {
f->dump_unsigned("size", s->size);
if (has_parent) {
f->open_object_section("parent");
- f->dump_string("pool", pool);
- f->dump_string("image", image);
- f->dump_string("snapshot", snap);
+ f->dump_string("pool", parent_image_spec.pool_name);
+ f->dump_string("pool_namespace", parent_image_spec.pool_namespace);
+ f->dump_string("image", parent_image_spec.image_name);
+ f->dump_string("snapshot", parent_snap_spec.name);
f->close_section();
}
f->dump_int("format", old_format ? 1 : 2);
int do_list(const std::string &pool_name, const std::string& namespace_name,
bool lflag, int threads, Formatter *f) {
std::vector<WorkerEntry*> workers;
- std::vector<std::string> names;
+ std::vector<librbd::image_spec_t> images;
librados::Rados rados;
librbd::RBD rbd;
librados::IoCtx ioctx;
utils::disable_cache();
- r = rbd.list(ioctx, names);
+ r = rbd.list2(ioctx, &images);
if (r < 0)
return r;
if (!lflag) {
if (f)
f->open_array_section("images");
- for (std::vector<std::string>::const_iterator i = names.begin();
- i != names.end(); ++i) {
+ for (auto& image : images) {
if (f)
- f->dump_string("name", *i);
+ f->dump_string("name", image.name);
else
- std::cout << *i << std::endl;
+ std::cout << image.name << std::endl;
}
if (f) {
f->close_section();
tbl.define_column("LOCK", TextTable::LEFT, TextTable::LEFT);
}
- for (int left = 0; left < std::min(threads, (int)names.size()); left++) {
+ for (size_t left = 0; left < std::min<size_t>(threads, images.size());
+ left++) {
workers.push_back(new WorkerEntry());
}
- auto i = names.begin();
+ auto i = images.begin();
while (true) {
size_t workers_idle = 0;
for (auto comp : workers) {
comp->completion = nullptr;
// we want it to fall through in this case
case STATE_IDLE:
- if (i == names.end()) {
+ if (i == images.end()) {
workers_idle++;
continue;
}
- comp->name = *i;
+ comp->name = i->name;
comp->completion = new librbd::RBD::AioCompletion(nullptr, nullptr);
- r = rbd.aio_open_read_only(ioctx, comp->img, i->c_str(), NULL, comp->completion);
+ r = rbd.aio_open_read_only(ioctx, comp->img, i->name.c_str(), nullptr,
+ comp->completion);
i++;
comp->state = STATE_OPENED;
break;
comp->completion->release();
if (r < 0) {
if (r != -ENOENT) {
- std::cerr << "rbd: error opening " << *i << ": " << cpp_strerror(r)
- << std::endl;
+ std::cerr << "rbd: error opening " << i->name << ": "
+ << cpp_strerror(r) << std::endl;
}
// in any event, continue to next image
comp->state = STATE_IDLE;
}
r = list_process_image(&rados, comp, lflag, f, tbl);
if (r < 0) {
- std::cerr << "rbd: error processing image " << comp->name << ": " << cpp_strerror(r)
- << std::endl;
+ std::cerr << "rbd: error processing image " << comp->name << ": "
+ << cpp_strerror(r) << std::endl;
}
comp->completion = new librbd::RBD::AioCompletion(nullptr, nullptr);
r = comp->img.aio_close(comp->completion);
if (f) {
f->close_section();
f->flush(std::cout);
- } else if (!names.empty()) {
+ } else if (!images.empty()) {
std::cout << tbl;
}