-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-
-#include "librbd/journal/Utils.h"
-#include "common/dout.h"
-#include "common/errno.h"
-#include "librbd/journal/Types.h"
-
-#define dout_subsys ceph_subsys_rbd
-#undef dout_prefix
-#define dout_prefix *_dout << "librbd::journal::"
-
-namespace librbd {
-namespace journal {
-namespace util {
-
-int C_DecodeTag::decode(bufferlist::iterator *it, TagData *tag_data) {
- try {
- ::decode(*tag_data, *it);
- } catch (const buffer::error &err) {
- return -EBADMSG;
- }
- return 0;
-}
-
-int C_DecodeTag::process(int r) {
- if (r < 0) {
- lderr(cct) << "C_DecodeTag: " << this << " " << __func__ << ": "
- << "failed to allocate tag: " << cpp_strerror(r)
- << dendl;
- return r;
- }
-
- Mutex::Locker locker(*lock);
- *tag_tid = tag.tid;
-
- bufferlist::iterator data_it = tag.data.begin();
- r = decode(&data_it, tag_data);
- if (r < 0) {
- lderr(cct) << "C_DecodeTag: " << this << " " << __func__ << ": "
- << "failed to decode allocated tag" << dendl;
- return r;
- }
-
- ldout(cct, 20) << "C_DecodeTag: " << this << " " << __func__ << ": "
- << "allocated journal tag: "
- << "tid=" << tag.tid << ", "
- << "data=" << *tag_data << dendl;
- return 0;
-}
-
-int C_DecodeTags::process(int r) {
- if (r < 0) {
- lderr(cct) << "C_DecodeTags: " << this << " " << __func__ << ": "
- << "failed to retrieve journal tags: " << cpp_strerror(r)
- << dendl;
- return r;
- }
-
- if (tags.empty()) {
- lderr(cct) << "C_DecodeTags: " << this << " " << __func__ << ": "
- << "no journal tags retrieved" << dendl;
- return -ENOENT;
- }
-
- Mutex::Locker locker(*lock);
- *tag_tid = tags.back().tid;
- bufferlist::iterator data_it = tags.back().data.begin();
- r = C_DecodeTag::decode(&data_it, tag_data);
- if (r < 0) {
- lderr(cct) << "C_DecodeTags: " << this << " " << __func__ << ": "
- << "failed to decode journal tag" << dendl;
- return r;
- }
-
- ldout(cct, 20) << "C_DecodeTags: " << this << " " << __func__ << ": "
- << "most recent journal tag: "
- << "tid=" << *tag_tid << ", "
- << "data=" << *tag_data << dendl;
- return 0;
-}
-
-} // namespace util
-} // namespace journal
-} // namespace librbd