int r;
r = image.snap_list(snaps);
- if (r < 0)
+ if (r < 0) {
+ std::cerr << "rbd: unable to list snapshots" << std::endl;
return r;
+ }
if (!all_snaps) {
snaps.erase(remove_if(snaps.begin(),
tt_str = ctime(&tt);
tt_str = tt_str.substr(0, tt_str.length() - 1);
}
+
+ librbd::snap_namespace_type_t snap_namespace;
+ r = image.snap_get_namespace_type(s->id, &snap_namespace);
+ if (r < 0) {
+ std::cerr << "rbd: unable to retrieve snap namespace" << std::endl;
+ return r;
+ }
+
+ std::string snap_namespace_name = "Unknown";
+ switch (snap_namespace) {
+ case RBD_SNAP_NAMESPACE_TYPE_USER:
+ snap_namespace_name = "user";
+ break;
+ case RBD_SNAP_NAMESPACE_TYPE_GROUP:
+ snap_namespace_name = "group";
+ break;
+ case RBD_SNAP_NAMESPACE_TYPE_TRASH:
+ snap_namespace_name = "trash";
+ break;
+ }
+
+ int get_group_res = -ENOENT;
librbd::snap_group_namespace_t group_snap;
- int get_group_res = image.snap_get_group_namespace(s->id, &group_snap,
- sizeof(group_snap));
+ if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_GROUP) {
+ get_group_res = image.snap_get_group_namespace(s->id, &group_snap,
+ sizeof(group_snap));
+ }
if (f) {
f->open_object_section("snapshot");
f->dump_string("timestamp", tt_str);
if (all_snaps) {
f->open_object_section("namespace");
+ f->dump_string("type", snap_namespace_name);
if (get_group_res == 0) {
std::string pool_name = pool_map[group_snap.group_pool];
f->dump_string("pool", pool_name);
}
f->close_section();
} else {
- std::string namespace_string;
- if (all_snaps && (get_group_res == 0)) {
- ostringstream oss;
- std::string pool_name = pool_map[group_snap.group_pool];
- oss << "group snapshot (" << pool_name << "/" <<
- group_snap.group_name << "@" <<
- group_snap.group_snap_name << ")";
-
- namespace_string = oss.str();
- }
t << s->id << s->name << stringify(prettybyte_t(s->size)) << tt_str;
+
if (all_snaps) {
- t << namespace_string;
+ ostringstream oss;
+ oss << snap_namespace_name;
+
+ if (get_group_res == 0) {
+ std::string pool_name = pool_map[group_snap.group_pool];
+ oss << " (" << pool_name << "/"
+ << group_snap.group_name << "@"
+ << group_snap.group_snap_name << ")";
+ }
+
+ t << oss.str();
}
t << TextTable::endrow;
}