AioRequest::AioRequest(ImageCtx *ictx, const std::string &oid,
uint64_t image_ofs, size_t len,
librados::snap_t snap_id,
- Context *completion) {
+ Context *completion,
+ bool hide_enoent) {
m_ictx = ictx;
m_ioctx.dup(ictx->data_ctx);
m_ioctx.snap_set_read(snap_id);
m_snap_id = snap_id;
m_completion = completion;
m_parent_completion = NULL;
+ m_hide_enoent = hide_enoent;
}
AioRequest::~AioRequest() {
AbstractWrite::AbstractWrite(ImageCtx *ictx, const std::string &oid,
uint64_t image_ofs, size_t len,
librados::snap_t snap_id, Context *completion,
- bool has_parent, const ::SnapContext &snapc)
- : AioRequest(ictx, oid, image_ofs, len, snap_id, completion)
+ bool has_parent, const ::SnapContext &snapc,
+ bool hide_enoent)
+ : AioRequest(ictx, oid, image_ofs, len, snap_id, completion, hide_enoent)
{
m_state = LIBRBD_AIO_WRITE_FINAL;
m_has_parent = has_parent;
public:
AioRequest();
AioRequest(ImageCtx *ictx, const std::string &oid, uint64_t image_ofs,
- size_t len, librados::snap_t snap_id, Context *completion);
+ size_t len, librados::snap_t snap_id, Context *completion,
+ bool hide_enoent);
virtual ~AioRequest();
uint64_t offset()
void complete(int r)
{
if (should_complete(r)) {
+ if (m_hide_enoent && r == -ENOENT)
+ r = 0;
m_completion->complete(r);
delete this;
}
Context *m_completion;
AioCompletion *m_parent_completion;
ceph::bufferlist m_read_data;
+ bool m_hide_enoent;
};
class AioRead : public AioRequest {
AioRead(ImageCtx *ictx, const std::string &oid, uint64_t image_ofs,
size_t len, librados::snap_t snap_id, bool sparse,
Context *completion)
- : AioRequest(ictx, oid, image_ofs, len, snap_id, completion),
+ : AioRequest(ictx, oid, image_ofs, len, snap_id, completion, false),
m_tried_parent(false), m_sparse(sparse) {
m_ioctx.snap_set_read(m_snap_id);
}
AbstractWrite();
AbstractWrite(ImageCtx *ictx, const std::string &oid, uint64_t image_ofs,
size_t len, librados::snap_t snap_id, Context *completion,
- bool has_parent, const ::SnapContext &snapc);
+ bool has_parent, const ::SnapContext &snapc, bool hide_enoent);
virtual ~AbstractWrite() {}
virtual bool should_complete(int r);
virtual int send();
const ceph::bufferlist &data, const ::SnapContext &snapc,
librados::snap_t snap_id, bool has_parent, Context *completion)
: AbstractWrite(ictx, oid, image_ofs, data.length(), snap_id, completion,
- has_parent, snapc),
+ has_parent, snapc, false),
m_write_data(data) {
guard_write();
m_write.write(m_block_ofs, data);
const ::SnapContext &snapc, librados::snap_t snap_id,
bool has_parent, Context *completion)
: AbstractWrite(ictx, oid, image_ofs, 0, snap_id, completion,
- has_parent, snapc) {
+ has_parent, snapc, true) {
if (has_parent)
m_write.truncate(0);
else
const ::SnapContext &snapc, librados::snap_t snap_id,
bool has_parent, Context *completion)
: AbstractWrite(ictx, oid, image_ofs, 0, snap_id, completion,
- has_parent, snapc) {
+ has_parent, snapc, true) {
guard_write();
m_write.truncate(m_block_ofs);
}
size_t len, const ::SnapContext &snapc, librados::snap_t snap_id,
bool has_parent, Context *completion)
: AbstractWrite(ictx, oid, image_ofs, len, snap_id, completion,
- has_parent, snapc) {
+ has_parent, snapc, true) {
guard_write();
m_write.zero(m_block_ofs, len);
}