]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge remote-tracking branch 'gh/master' into wip-librados-fadvise
authorSage Weil <sage@redhat.com>
Fri, 12 Dec 2014 21:09:45 +0000 (13:09 -0800)
committerSage Weil <sage@redhat.com>
Fri, 12 Dec 2014 21:09:45 +0000 (13:09 -0800)
Conflicts:
src/test/librbd/test_librbd.cc

1  2 
src/rgw/rgw_rados.cc
src/test/librbd/test_librbd.cc
src/tracing/librbd.tp

Simple merge
index 1ee881a25ca82926df21479e928f7e90a617b4b2,919de2af7448ec6a2ff7386b0e3237557f1777ef..ccbb1885fc604df98b8d814fdcf6e8e314fe3bdb
@@@ -636,8 -650,7 +650,7 @@@ void simple_read_cb(rbd_completion_t cb
    printf("read completion cb called!\n");
  }
  
- void aio_write_test_data(rbd_image_t image, const char *test_data,
-                         uint64_t off, size_t len, uint32_t iohint=0)
 -void aio_write_test_data(rbd_image_t image, const char *test_data, uint64_t off, size_t len, bool *passed)
++void aio_write_test_data(rbd_image_t image, const char *test_data, uint64_t off, size_t len, uint32_t iohint, bool *passed)
  {
    rbd_completion_t comp;
    rbd_aio_create_completion(NULL, (rbd_callback_t) simple_write_cb, &comp);
    ASSERT_EQ(0, r);
    printf("finished write\n");
    rbd_aio_release(comp);
+   *passed = true;
  }
  
- void write_test_data(rbd_image_t image, const char *test_data,
-                     uint64_t off, size_t len, uint32_t iohint=0)
 -void write_test_data(rbd_image_t image, const char *test_data, uint64_t off, size_t len, bool *passed)
++void write_test_data(rbd_image_t image, const char *test_data, uint64_t off, size_t len, uint32_t iohint, bool *passed)
  {
    ssize_t written;
 -  written = rbd_write(image, off, len, test_data);
 +  if (iohint)
 +    written = rbd_write2(image, off, len, test_data, iohint);
 +  else
 +    written = rbd_write(image, off, len, test_data);
    printf("wrote: %d\n", (int) written);
    ASSERT_EQ(len, static_cast<size_t>(written));
+   *passed = true;
  }
  
- void aio_discard_test_data(rbd_image_t image, uint64_t off, uint64_t len)
+ void aio_discard_test_data(rbd_image_t image, uint64_t off, uint64_t len, bool *passed)
  {
    rbd_completion_t comp;
    rbd_aio_create_completion(NULL, (rbd_callback_t) simple_write_cb, &comp);
@@@ -685,10 -694,10 +700,10 @@@ void discard_test_data(rbd_image_t imag
    written = rbd_discard(image, off, len);
    printf("discard: %d~%d = %d\n", (int)off, (int)len, (int)written);
    ASSERT_EQ(len, static_cast<size_t>(written));
+   *passed = true;
  }
  
- void aio_read_test_data(rbd_image_t image, const char *expected,
-                       uint64_t off, size_t len, uint32_t iohint=0)
 -void aio_read_test_data(rbd_image_t image, const char *expected, uint64_t off, size_t len, bool *passed)
++void aio_read_test_data(rbd_image_t image, const char *expected, uint64_t off, size_t len, uint32_t iohint, bool *passed)
  {
    rbd_completion_t comp;
    char *result = (char *)malloc(len + 1);
      ASSERT_EQ(0, memcmp(result, expected, len));
    }
    free(result);
+   *passed = true;
  }
  
- void read_test_data(rbd_image_t image, const char *expected,
-                   uint64_t off, size_t len, uint32_t iohint=0)
 -void read_test_data(rbd_image_t image, const char *expected, uint64_t off, size_t len, bool *passed)
++void read_test_data(rbd_image_t image, const char *expected, uint64_t off, size_t len, uint32_t iohint, bool *passed)
  {
    ssize_t read;
    char *result = (char *)malloc(len + 1);
@@@ -758,26 -762,26 +774,26 @@@ TEST_F(TestLibRBD, TestIO
    memset(zero_data, 0, sizeof(zero_data));
  
    for (i = 0; i < 5; ++i)
-     write_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
 -    ASSERT_PASSED(write_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
++    ASSERT_PASSED(write_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
  
    for (i = 5; i < 10; ++i)
-     aio_write_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
 -    ASSERT_PASSED(aio_write_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
++    ASSERT_PASSED(aio_write_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
  
    for (i = 0; i < 5; ++i)
-     read_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
 -    ASSERT_PASSED(read_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
++    ASSERT_PASSED(read_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
  
    for (i = 5; i < 10; ++i)
-     aio_read_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
 -    ASSERT_PASSED(aio_read_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
++    ASSERT_PASSED(aio_read_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
  
    // discard 2nd, 4th sections.
-   discard_test_data(image, TEST_IO_SIZE, TEST_IO_SIZE);
-   aio_discard_test_data(image, TEST_IO_SIZE*3, TEST_IO_SIZE);
-   read_test_data(image, test_data,  0, TEST_IO_SIZE);
-   read_test_data(image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE);
-   read_test_data(image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE);
-   read_test_data(image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE);
-   read_test_data(image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE);
+   ASSERT_PASSED(discard_test_data, image, TEST_IO_SIZE, TEST_IO_SIZE);
+   ASSERT_PASSED(aio_discard_test_data, image, TEST_IO_SIZE*3, TEST_IO_SIZE);
 -  ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE);
 -  ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE);
 -  ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE);
 -  ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE);
 -  ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE);
++  ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE, 0);
++  ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE, 0);
++  ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE, 0);
++  ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE, 0);
++  ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE, 0);
    
    rbd_image_info_t info;
    rbd_completion_t comp;
    rados_ioctx_destroy(ioctx);
  }
  
-     write_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE,
-                   LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +TEST_F(TestLibRBD, TestIOWithIOHint)
 +{
 +  rados_ioctx_t ioctx;
 +  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 +
 +  rbd_image_t image;
 +  int order = 0;
 +  std::string name = get_temp_image_name();
 +  uint64_t size = 2 << 20;
 +
 +  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
 +  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 +
 +  char test_data[TEST_IO_SIZE + 1];
 +  char zero_data[TEST_IO_SIZE + 1];
 +  int i;
 +
 +  for (i = 0; i < TEST_IO_SIZE; ++i) {
 +    test_data[i] = (char) (rand() % (126 - 33) + 33);
 +  }
 +  test_data[TEST_IO_SIZE] = '\0';
 +  memset(zero_data, 0, sizeof(zero_data));
 +
 +  for (i = 0; i < 5; ++i)
-     aio_write_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE,
-                       LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
++    ASSERT_PASSED(write_test_data, image, test_data, TEST_IO_SIZE * i,
++                TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +
 +  for (i = 5; i < 10; ++i)
-     read_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE,
-                   LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
++    ASSERT_PASSED(aio_write_test_data, image, test_data, TEST_IO_SIZE * i,
++                TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +
 +  for (i = 0; i < 5; ++i)
-     aio_read_test_data(image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE,
-                       LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL|LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
++    ASSERT_PASSED(read_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE,
++                LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
 +
 +  for (i = 5; i < 10; ++i)
-   discard_test_data(image, TEST_IO_SIZE, TEST_IO_SIZE);
-   aio_discard_test_data(image, TEST_IO_SIZE*3, TEST_IO_SIZE);
-   read_test_data(image, test_data,  0, TEST_IO_SIZE,
-                 LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
-   read_test_data(image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE,
-                 LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
-   read_test_data(image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE,
-                 LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
-   read_test_data(image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE,
-                 LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
-   read_test_data(image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE);
++    ASSERT_PASSED(aio_read_test_data, image, test_data, TEST_IO_SIZE * i,
++                TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL|LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +
 +  // discard 2nd, 4th sections.
++  ASSERT_PASSED(discard_test_data, image, TEST_IO_SIZE, TEST_IO_SIZE);
++  ASSERT_PASSED(aio_discard_test_data, image, TEST_IO_SIZE*3, TEST_IO_SIZE);
++
++  ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE,
++              LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
++  ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE,
++              LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
++  ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE,
++              LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
++  ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE,
++              LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL);
++  ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE, 0);
 +
 +  rbd_image_info_t info;
 +  rbd_completion_t comp;
 +  ASSERT_EQ(0, rbd_stat(image, &info, sizeof(info)));
 +  // can't read or write starting past end
 +  ASSERT_EQ(-EINVAL, rbd_write(image, info.size, 1, test_data));
 +  ASSERT_EQ(-EINVAL, rbd_read(image, info.size, 1, test_data));
 +  // reading through end returns amount up to end
 +  ASSERT_EQ(10, rbd_read2(image, info.size - 10, 100, test_data,
 +                        LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
 +  // writing through end returns amount up to end
 +  ASSERT_EQ(10, rbd_write2(image, info.size - 10, 100, test_data,
 +                          LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
 +
 +  rbd_aio_create_completion(NULL, (rbd_callback_t) simple_read_cb, &comp);
 +  ASSERT_EQ(-EINVAL, rbd_aio_write(image, info.size, 1, test_data, comp));
 +  ASSERT_EQ(-EINVAL, rbd_aio_read2(image, info.size, 1, test_data, comp,
 +                                  LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
 +
 +  ASSERT_EQ(0, rbd_close(image));
 +
 +  rados_ioctx_destroy(ioctx);
 +
 +}
 +
  TEST_F(TestLibRBD, TestEmptyDiscard)
  {
    rados_ioctx_t ioctx;
@@@ -908,7 -835,7 +924,8 @@@ void simple_read_cb_pp(librbd::completi
    cout << "read completion cb called!" << endl;
  }
  
- void aio_write_test_data(librbd::Image& image, const char *test_data, off_t off, int iohint=0)
 -void aio_write_test_data(librbd::Image& image, const char *test_data, off_t off, bool *passed)
++void aio_write_test_data(librbd::Image& image, const char *test_data,
++                       off_t off, uint32_t iohint, bool *passed)
  {
    ceph::bufferlist bl;
    bl.append(test_data, strlen(test_data));
@@@ -935,31 -860,31 +953,34 @@@ void aio_discard_test_data(librbd::Imag
    int r = comp->get_return_value();
    ASSERT_TRUE(r >= 0);
    comp->release();
+   *passed = true;
  }
  
- void write_test_data(librbd::Image& image, const char *test_data, off_t off, int iohint=0)
 -void write_test_data(librbd::Image& image, const char *test_data, off_t off, bool *passed)
++void write_test_data(librbd::Image& image, const char *test_data, off_t off, uint32_t iohint, bool *passed)
  {
    size_t written;
    size_t len = strlen(test_data);
    ceph::bufferlist bl;
    bl.append(test_data, len);
 -  written = image.write(off, len, bl);
 +  if (iohint)
 +    written = image.write2(off, len, bl, iohint);
 +  else
 +    written = image.write(off, len, bl);
    printf("wrote: %u\n", (unsigned int) written);
    ASSERT_EQ(bl.length(), written);
+   *passed = true;
  }
  
- void discard_test_data(librbd::Image& image, off_t off, size_t len)
+ void discard_test_data(librbd::Image& image, off_t off, size_t len, bool *passed)
  {
    size_t written;
    written = image.discard(off, len);
    printf("discard: %u~%u\n", (unsigned)off, (unsigned)len);
    ASSERT_EQ(len, written);
+   *passed = true;
  }
  
- void aio_read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, int iohint=0)
 -void aio_read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, bool *passed)
++void aio_read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, uint32_t iohint, bool *passed)
  {
    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_read_cb_pp);
    ceph::bufferlist bl;
    ASSERT_EQ(0, memcmp(expected, bl.c_str(), TEST_IO_SIZE));
    printf("finished read\n");
    comp->release();
+   *passed = true;
  }
  
- void read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, int iohint=0)
 -void read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, bool *passed)
++void read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, uint32_t iohint, bool *passed)
  {
    int read, total_read = 0;
    size_t len = expected_len;
@@@ -1019,72 -940,31 +1042,73 @@@ TEST_F(TestLibRBD, TestIOPP
      memset(zero_data, 0, sizeof(zero_data));
  
      for (i = 0; i < 5; ++i)
-       write_test_data(image, test_data, strlen(test_data) * i);
 -      ASSERT_PASSED(write_test_data, image, test_data, strlen(test_data) * i);
++      ASSERT_PASSED(write_test_data, image, test_data, strlen(test_data) * i, 0);
      
      for (i = 5; i < 10; ++i)
-       aio_write_test_data(image, test_data, strlen(test_data) * i);
 -      ASSERT_PASSED(aio_write_test_data, image, test_data, strlen(test_data) * i);
++      ASSERT_PASSED(aio_write_test_data, image, test_data, strlen(test_data) * i, 0);
      
      for (i = 0; i < 5; ++i)
-       read_test_data(image, test_data, strlen(test_data) * i, TEST_IO_SIZE);
 -      ASSERT_PASSED(read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE);
++      ASSERT_PASSED(read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE, 0);
      
      for (i = 5; i < 10; ++i)
-       aio_read_test_data(image, test_data, strlen(test_data) * i, TEST_IO_SIZE);
 -      ASSERT_PASSED(aio_read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE);
++      ASSERT_PASSED(aio_read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE, 0);
  
      // discard 2nd, 4th sections.
-     discard_test_data(image, TEST_IO_SIZE, TEST_IO_SIZE);
-     aio_discard_test_data(image, TEST_IO_SIZE*3, TEST_IO_SIZE);
+     ASSERT_PASSED(discard_test_data, image, TEST_IO_SIZE, TEST_IO_SIZE);
+     ASSERT_PASSED(aio_discard_test_data, image, TEST_IO_SIZE*3, TEST_IO_SIZE);
      
-     read_test_data(image, test_data,  0, TEST_IO_SIZE);
-     read_test_data(image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE);
-     read_test_data(image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE);
-     read_test_data(image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE);
-     read_test_data(image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE);
 -    ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE);
 -    ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE);
 -    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE);
 -    ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE);
 -    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE);
++    ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE, 0);
++    ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE, TEST_IO_SIZE, 0);
++    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE, 0);
++    ASSERT_PASSED(read_test_data, image,  zero_data, TEST_IO_SIZE*3, TEST_IO_SIZE, 0);
++    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE, 0);
    }
  
    ioctx.close();
  }
  
-       write_test_data(image, test_data, strlen(test_data) * i, LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +TEST_F(TestLibRBD, TestIOPPWithIOHint)
 +{
 +  librados::IoCtx ioctx;
 +  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
 +
 +  {
 +    librbd::RBD rbd;
 +    librbd::Image image;
 +    int order = 0;
 +    std::string name = get_temp_image_name();
 +    uint64_t size = 2 << 20;
 +
 +    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
 +    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
 +
 +    char test_data[TEST_IO_SIZE + 1];
 +    int i;
 +
 +    for (i = 0; i < TEST_IO_SIZE; ++i) {
 +      test_data[i] = (char) (rand() % (126 - 33) + 33);
 +    }
 +
 +    for (i = 0; i < 5; ++i)
-       aio_write_test_data(image, test_data, strlen(test_data) * i,
-                         LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
++      ASSERT_PASSED(write_test_data, image, test_data, strlen(test_data) * i,
++                  LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +
 +    for (i = 5; i < 10; ++i)
-     read_test_data(image, test_data, strlen(test_data), TEST_IO_SIZE,
-                     LIBRADOS_OP_FLAG_FADVISE_RANDOM);
++      ASSERT_PASSED(aio_write_test_data, image, test_data, strlen(test_data) * i,
++                  LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +
-       aio_read_test_data(image, test_data, strlen(test_data) * i, TEST_IO_SIZE,
-                       LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL|LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
++    ASSERT_PASSED(read_test_data, image, test_data, strlen(test_data),
++                TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_RANDOM);
 +
 +    for (i = 5; i < 10; ++i)
++      ASSERT_PASSED(aio_read_test_data, image, test_data, strlen(test_data) * i,
++                  TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL|LIBRADOS_OP_FLAG_FADVISE_DONTNEED);
 +  }
 +
 +  ioctx.close();
 +}
 +
 +
  
  TEST_F(TestLibRBD, TestIOToSnapshot)
  {
    ASSERT_EQ(0, test_ls_snaps(image, 0));
    ASSERT_EQ(0, rbd_snap_create(image, "orig"));
    ASSERT_EQ(1, test_ls_snaps(image, 1, "orig", isize));
-   read_test_data(image, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image, orig_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
  
    printf("write test data!\n");
-   write_test_data(image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(write_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(write_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
    ASSERT_EQ(0, rbd_snap_create(image, "written"));
    ASSERT_EQ(2, test_ls_snaps(image, 2, "orig", isize, "written", isize));
  
-   read_test_data(image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
  
    rbd_snap_set(image, "orig");
-   read_test_data(image, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image, orig_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
  
    rbd_snap_set(image, "written");
-   read_test_data(image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
  
    rbd_snap_set(image, "orig");
  
    ASSERT_LT(r, 0);
    cout << cpp_strerror(-r) << std::endl;
  
-   read_test_data(image, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image, orig_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
    rbd_snap_set(image, "written");
-   read_test_data(image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
  
    r = rbd_snap_rollback(image, "orig");
    ASSERT_EQ(r, -EROFS);
    r = rbd_snap_rollback(image, "orig");
    ASSERT_EQ(r, 0);
  
-   write_test_data(image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(write_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(write_test_data, image, test_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
  
    rbd_flush(image);
  
    printf("opening testimg@orig\n");
    ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image_at_snap, "orig"));
-   read_test_data(image_at_snap, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
 -  ASSERT_PASSED(read_test_data, image_at_snap, orig_data, 0, TEST_IO_TO_SNAP_SIZE);
++  ASSERT_PASSED(read_test_data, image_at_snap, orig_data, 0, TEST_IO_TO_SNAP_SIZE, 0);
    r = rbd_write(image_at_snap, 0, TEST_IO_TO_SNAP_SIZE, test_data);
    printf("write to snapshot returned %d\n", r);
    ASSERT_LT(r, 0);
@@@ -1228,12 -1108,12 +1252,12 @@@ TEST_F(TestLibRBD, TestClone
    printf("made and opened clone \"child\"\n");
  
    // check read
-   read_test_data(child, data, 0, strlen(data));
 -  ASSERT_PASSED(read_test_data, child, data, 0, strlen(data));
++  ASSERT_PASSED(read_test_data, child, data, 0, strlen(data), 0);
  
    // check write
    ASSERT_EQ((ssize_t)strlen(data), rbd_write(child, 20, strlen(data), data));
-   read_test_data(child, data, 20, strlen(data));
-   read_test_data(child, data, 0, strlen(data));
 -  ASSERT_PASSED(read_test_data, child, data, 20, strlen(data));
 -  ASSERT_PASSED(read_test_data, child, data, 0, strlen(data));
++  ASSERT_PASSED(read_test_data, child, data, 20, strlen(data), 0);
++  ASSERT_PASSED(read_test_data, child, data, 0, strlen(data), 0);
  
    // check attributes
    ASSERT_EQ(0, rbd_stat(parent, &pinfo, sizeof(pinfo)));
Simple merge