]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BlockDevice: make pread() safe
authorSage Weil <sage@redhat.com>
Wed, 6 Jan 2016 17:57:12 +0000 (12:57 -0500)
committerSage Weil <sage@redhat.com>
Fri, 8 Jan 2016 18:10:19 +0000 (13:10 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlockDevice.cc

index 13607ad2b84c4492aae5b46eca96ad1bbdfac6ab..33370bf49505253afb9a226ddedf07b222a53977 100644 (file)
@@ -496,14 +496,21 @@ int BlockDevice::read_buffered(uint64_t off, uint64_t len, char *buf)
   assert(off < size);
   assert(off + len <= size);
 
-  int r = ::pread(fd_buffered, buf, len, off);
-  if (r < 0) {
-    r = -errno;
-    goto out;
+  int r = 0;
+  char *t = buf;
+  uint64_t left = len;
+  while (left > 0) {
+    r = ::pread(fd_buffered, t, left, off);
+    if (r < 0) {
+      r = -errno;
+      goto out;
+    }
+    off += r;
+    t += r;
+    left -= r;
   }
-  assert(r == len);
 
-  dout(40) << "data: ";
+  dout(40) << __func__ << " data: ";
   bufferlist bl;
   bl.append(buf, len);
   bl.hexdump(*_dout);