]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/os/bluestore/KernelDevice.cc
update sources to 12.2.7
[ceph.git] / ceph / src / os / bluestore / KernelDevice.cc
index ec4cc8bb0f844b2ea6cee09c3cc600bee855591b..6c2d5ec1bf16fd719b85df6c1508ee124ac23031 100644 (file)
@@ -338,6 +338,15 @@ void KernelDevice::_aio_stop()
   }
 }
 
+static bool is_expected_ioerr(const int r)
+{
+  // https://lxr.missinglinkelectronics.com/linux+v4.15/block/blk-core.c#L135
+  return (r == -EOPNOTSUPP || r == -ETIMEDOUT || r == -ENOSPC ||
+         r == -ENOLINK || r == -EREMOTEIO || r == -EBADE ||
+         r == -ENODATA || r == -EILSEQ || r == -ENOMEM ||
+         r == -EAGAIN || r == -EREMCHG || r == -EIO);
+}
+
 void KernelDevice::_aio_thread()
 {
   dout(10) << __func__ << " start" << dendl;
@@ -372,11 +381,15 @@ void KernelDevice::_aio_thread()
 
        long r = aio[i]->get_return_value();
         if (r < 0) {
-          derr << __func__ << " got " << cpp_strerror(r) << dendl;
-          if (ioc->allow_eio && r == -EIO) {
-            ioc->set_return_value(r);
+          derr << __func__ << " got r=" << r << " (" << cpp_strerror(r) << ")"
+              << dendl;
+          if (ioc->allow_eio && is_expected_ioerr(r)) {
+            derr << __func__ << " translating the error to EIO for upper layer"
+                << dendl;
+            ioc->set_return_value(-EIO);
           } else {
-            assert(0 == "got unexpected error from io_getevents");
+            assert(0 == "got unexpected error from aio_t::get_return_value. "
+                       "This may suggest HW issue. Please check your dmesg!");
           }
         } else if (aio[i]->length != (uint64_t)r) {
           derr << "aio to " << aio[i]->offset << "~" << aio[i]->length