]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: writesame do discard on an all-zero buffer
authorGui Hecheng <guihecheng@cmss.chinamobile.com>
Wed, 22 Feb 2017 05:49:54 +0000 (13:49 +0800)
committerGui Hecheng <guihecheng@cmss.chinamobile.com>
Thu, 23 Feb 2017 09:25:22 +0000 (17:25 +0800)
Signed-off-by: Gui Hecheng <guihecheng@cmss.chinamobile.com>
src/librbd/librbd.cc

index 9c7c6182500f0cf6ad6a11c264233e5a7a5c3070..13f1d27f7e56d9a929def6a1a5968181584b7d29 100644 (file)
@@ -1346,6 +1346,13 @@ namespace librbd {
       tracepoint(librbd, writesame_exit, -EINVAL);
       return -EINVAL;
     }
+
+    if (mem_is_zero(bl.c_str(), bl.length())) {
+      int r = ictx->io_work_queue->discard(ofs, len);
+      tracepoint(librbd, writesame_exit, r);
+      return r;
+    }
+
     int r = ictx->io_work_queue->writesame(ofs, len, bufferlist{bl}, op_flags);
     tracepoint(librbd, writesame_exit, r);
     return r;
@@ -1447,6 +1454,13 @@ namespace librbd {
       tracepoint(librbd, aio_writesame_exit, -EINVAL);
       return -EINVAL;
     }
+
+    if (mem_is_zero(bl.c_str(), bl.length())) {
+      ictx->io_work_queue->aio_discard(get_aio_completion(c), off, len);
+      tracepoint(librbd, aio_writesame_exit, 0);
+      return 0;
+    }
+
     ictx->io_work_queue->aio_writesame(get_aio_completion(c), off, len,
                                        bufferlist{bl}, op_flags);
     tracepoint(librbd, aio_writesame_exit, 0);
@@ -2947,6 +2961,12 @@ extern "C" ssize_t rbd_writesame(rbd_image_t image, uint64_t ofs, size_t len,
     return -EINVAL;
   }
 
+  if (mem_is_zero(buf, data_len)) {
+    int r = ictx->io_work_queue->discard(ofs, len);
+    tracepoint(librbd, writesame_exit, r);
+    return r;
+  }
+
   bufferlist bl;
   bl.push_back(create_write_raw(ictx, buf, data_len));
   int r = ictx->io_work_queue->writesame(ofs, len, std::move(bl), op_flags);
@@ -3138,6 +3158,12 @@ extern "C" int rbd_aio_writesame(rbd_image_t image, uint64_t off, size_t len,
     return -EINVAL;
   }
 
+  if (mem_is_zero(buf, data_len)) {
+    ictx->io_work_queue->aio_discard(get_aio_completion(comp), off, len);
+    tracepoint(librbd, aio_writesame_exit, 0);
+    return 0;
+  }
+
   bufferlist bl;
   bl.push_back(create_write_raw(ictx, buf, data_len));
   ictx->io_work_queue->aio_writesame(get_aio_completion(comp), off, len,