]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: ignore -ENOENT during discard
authorJosh Durgin <josh.durgin@inktank.com>
Mon, 10 Sep 2012 20:19:53 +0000 (13:19 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Mon, 10 Sep 2012 20:21:35 +0000 (13:21 -0700)
This is a backport of a3ad98a3eef062e9ed51dd2d1e58c593e12c9703

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/librbd.cc

index 754ac283fb7261646eda09fd5eca302613b0ecd6..569a372acf74e36312baa4a108c52c3c86f1c991 100644 (file)
@@ -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();