return id;
}
-static int decode_snapshot_metadata(uint64_t snap_id, bufferlist *in,
- cls_rbd_snap *snap)
-{
- try {
- bufferlist::iterator iter = in->begin();
- ::decode(*snap, iter);
- } catch (const buffer::error &err) {
- CLS_ERR("error decoding snapshot metadata for snap_id: %llu", snap_id);
- return -EIO;
- }
-
- snap->id = snap_id;
-
- return 0;
-}
-
-static int read_snapshot_metadata(cls_method_context_t hctx, uint64_t snap_id,
- cls_rbd_snap *snap_meta)
-{
- bufferlist snapbl;
- string snapshot_key;
- key_from_snap_id(snap_id, &snapshot_key);
- int r = cls_cxx_map_get_val(hctx, snapshot_key, &snapbl);
- if (r < 0) {
- CLS_ERR("error reading snapshot metadata: %d", r);
- return r;
- }
-
- return decode_snapshot_metadata(snap_id, &snapbl, snap_meta);
-}
-
template<typename T>
static int read_key(cls_method_context_t hctx, const string &key, T *out)
{
return r;
} else {
cls_rbd_snap snap;
- int r = read_snapshot_metadata(hctx, snap_id, &snap);
+ string snapshot_key;
+ key_from_snap_id(snap_id, &snapshot_key);
+ int r = read_key(hctx, snapshot_key, &snap);
if (r < 0)
return r;
return r;
} else {
cls_rbd_snap snap;
- int r = read_snapshot_metadata(hctx, snap_id, &snap);
+ string snapshot_key;
+ key_from_snap_id(snap_id, &snapshot_key);
+ int r = read_key(hctx, snapshot_key, &snap);
if (r < 0)
return r;
return -EINVAL;
cls_rbd_snap snap;
- int r = read_snapshot_metadata(hctx, snap_id, &snap);
+ string snapshot_key;
+ key_from_snap_id(snap_id, &snapshot_key);
+ int r = read_key(hctx, snapshot_key, &snap);
if (r < 0)
return r;
for (map<string, bufferlist>::iterator it = vals.begin();
it != vals.end(); ++it) {
- snapid_t cur_snap_id = snap_id_from_key(it->first);
cls_rbd_snap old_meta;
- r = decode_snapshot_metadata(cur_snap_id, &it->second, &old_meta);
- if (r < 0)
- return r;
-
+ bufferlist::iterator iter = it->second.begin();
+ try {
+ ::decode(old_meta, iter);
+ } catch (const buffer::error &err) {
+ snapid_t snap_id = snap_id_from_key(it->first);
+ CLS_ERR("error decoding snapshot metadata for snap_id: %llu", snap_id);
+ return -EIO;
+ }
if (snap_meta.name == old_meta.name || snap_meta.id == old_meta.id) {
CLS_LOG(20, "snap_name %s or snap_id %llu matches existing snap %s %llu",
snap_meta.name.c_str(), snap_meta.id.val,