start_writer();
}
-void FileJournal::wrap_read_bl(off64_t& pos, int64_t olen, bufferlist& bl)
+void FileJournal::wrap_read_bl(
+ off64_t pos,
+ int64_t olen,
+ bufferlist* bl,
+ off64_t *out_pos
+ )
{
while (olen > 0) {
while (pos >= header.max_size)
<< r << dendl;
ceph_abort();
}
- bl.push_back(bp);
+ bl->push_back(bp);
pos += len;
olen -= len;
}
if (pos >= header.max_size)
pos = pos + get_top() - header.max_size;
+ if (out_pos)
+ *out_pos = pos;
}
bool FileJournal::read_entry(bufferlist& bl, uint64_t& seq)
// header
entry_header_t *h;
bufferlist hbl;
- wrap_read_bl(pos, sizeof(*h), hbl);
+ wrap_read_bl(pos, sizeof(*h), &hbl, &pos);
h = (entry_header_t *)hbl.c_str();
if (!h->check_magic(read_pos, header.get_fsid64())) {
pos += h->pre_pad;
bl.clear();
- wrap_read_bl(pos, h->len, bl);
+ wrap_read_bl(pos, h->len, &bl, &pos);
if (h->post_pad)
pos += h->post_pad;
// footer
entry_header_t *f;
bufferlist fbl;
- wrap_read_bl(pos, sizeof(*f), fbl);
+ wrap_read_bl(pos, sizeof(*f), &fbl, &pos);
f = (entry_header_t *)fbl.c_str();
if (memcmp(f, h, sizeof(*f))) {
dout(2) << "read_entry " << read_pos << " : bad footer magic, partial entry, end of journal" << dendl;
void align_bl(off64_t pos, bufferlist& bl);
int write_bl(off64_t& pos, bufferlist& bl);
- void wrap_read_bl(off64_t& pos, int64_t len, bufferlist& bl);
+
+ /// read len from journal starting at in_pos and wrapping up to len
+ void wrap_read_bl(
+ off64_t in_pos, ///< [in] start position
+ int64_t len, ///< [in] length to read
+ bufferlist* bl, ///< [out] result
+ off64_t *out_pos ///< [out] next position to read, will be wrapped
+ );
class Writer : public Thread {
FileJournal *journal;