}
len = clip_io(off, len, file->data.length());
if (bl != NULL && len > 0) {
- bl->substr_of(file->data, off, len);
+ bufferlist bit;
+ bit.substr_of(file->data, off, len);
+ append_clone(bit, bl);
}
return 0;
}
}
}
if (data_bl != NULL && len > 0) {
- data_bl->substr_of(file->data, off, len);
+ bufferlist bit;
+ bit.substr_of(file->data, off, len);
+ append_clone(bit, data_bl);
}
return 0;
}
return write(oid, bl, len, off);
}
+void TestMemIoCtxImpl::append_clone(bufferlist& src, bufferlist* dest) {
+ // deep-copy the src to ensure our memory-based mock RADOS data cannot
+ // be modified by callers
+ if (src.length() > 0) {
+ bufferlist::iterator iter = src.begin();
+ buffer::ptr ptr;
+ iter.copy(src.length(), ptr);
+ dest->append(ptr);
+ }
+}
+
size_t TestMemIoCtxImpl::clip_io(size_t off, size_t len, size_t bl_len) {
if (off >= bl_len) {
len = 0;
TestMemRadosClient *m_client;
TestMemRadosClient::Pool *m_pool;
+ void append_clone(bufferlist& src, bufferlist* dest);
size_t clip_io(size_t off, size_t len, size_t bl_len);
void ensure_minimum_length(size_t len, bufferlist *bl);