From 97d8a734ce937ce2a683c7c36f5b72395c6456c2 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Mon, 10 Sep 2012 13:19:53 -0700 Subject: [PATCH] librbd: ignore -ENOENT during discard This is a backport of a3ad98a3eef062e9ed51dd2d1e58c593e12c9703 Signed-off-by: Josh Durgin --- src/librbd.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/librbd.cc b/src/librbd.cc index 754ac283fb726..569a372acf74e 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -1819,7 +1819,7 @@ int discard(ImageCtx *ictx, uint64_t off, uint64_t len) else write_op.zero(block_ofs, write_len); r = ictx->data_ctx.operate(oid, &write_op); - if (r < 0) + if (r < 0 && r != -ENOENT) return r; total_write += write_len; left -= write_len; @@ -1942,6 +1942,16 @@ void rados_cb(rados_completion_t c, void *arg) delete block_completion; } +void rados_discard_cb(rados_completion_t c, void *arg) +{ + AioBlockCompletion *block_completion = (AioBlockCompletion *)arg; + int r = rados_aio_get_return_value(c); + if (r == -ENOENT) + r = 0; + block_completion->finish(r); + delete block_completion; +} + int check_io(ImageCtx *ictx, uint64_t off, uint64_t len) { ictx->lock.Lock(); @@ -2107,7 +2117,7 @@ int aio_discard(ImageCtx *ictx, uint64_t off, uint64_t len, AioCompletion *c) c->add_block_completion(block_completion); librados::AioCompletion *rados_completion = - Rados::aio_create_completion(block_completion, NULL, rados_cb); + Rados::aio_create_completion(block_completion, NULL, rados_discard_cb); r = ictx->data_ctx.aio_operate(oid, rados_completion, &block_completion->write_op); rados_completion->release(); -- 2.39.5