From 242c7259ac93da849901338ff5ad4bba247580c7 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Thu, 24 Feb 2022 23:40:55 -0500 Subject: [PATCH] Disk: Proper error reporting for EOF --- disk/diskreaddriver.cpp | 5 +++-- disk/diskwritedriver.cpp | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/disk/diskreaddriver.cpp b/disk/diskreaddriver.cpp index 10efa00..4a253e6 100644 --- a/disk/diskreaddriver.cpp +++ b/disk/diskreaddriver.cpp @@ -40,11 +40,12 @@ optional ReadDriver::readLogicalDisk(Communication& com, device_eventh useAlignedReadBuffer ? alignedReadBuffer.data() : (into + intoOffset), idealBlockSize, timeout); timeout -= std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start); - if(!readAmount.has_value() || *readAmount == 0) { + if(!readAmount.has_value() || *readAmount < curAmt) { if(timeout < std::chrono::milliseconds::zero()) report(APIEvent::Type::Timeout, APIEvent::Severity::Error); else - report(blocksProcessed ? APIEvent::Type::EOFReached : APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::Error); + report((blocksProcessed || readAmount.value_or(0u) != 0u) ? APIEvent::Type::EOFReached : + APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::Error); break; } diff --git a/disk/diskwritedriver.cpp b/disk/diskwritedriver.cpp index 1cfc182..1eac0d3 100644 --- a/disk/diskwritedriver.cpp +++ b/disk/diskwritedriver.cpp @@ -40,17 +40,17 @@ optional WriteDriver::writeLogicalDisk(Communication& com, device_even curAmt = static_cast(amountLeft); auto start = std::chrono::high_resolution_clock::now(); - auto amount = readDriver.readLogicalDisk(com, report, currentBlock * idealBlockSize, atomicBuffer.data(), - idealBlockSize, timeout); + const auto reportFromRead = [&report, &blocksProcessed](APIEvent::Type t, APIEvent::Severity s) { + if(t == APIEvent::Type::ParameterOutOfRange && blocksProcessed) + t = APIEvent::Type::EOFReached; + report(t, s); + }; + auto amount = readDriver.readLogicalDisk(com, reportFromRead, currentBlock * idealBlockSize, + atomicBuffer.data(), idealBlockSize, timeout); timeout -= std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start); - if(amount != idealBlockSize) { - if(timeout < std::chrono::milliseconds::zero()) - report(APIEvent::Type::Timeout, APIEvent::Severity::Error); - else - report(blocksProcessed ? APIEvent::Type::EOFReached : APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::Error); - break; - } + if(amount != idealBlockSize) + break; // readLogicalDisk reports its own errors const bool useAlignedWriteBuffer = (posWithinCurrentBlock != 0 || curAmt != idealBlockSize); if(useAlignedWriteBuffer) { @@ -70,11 +70,12 @@ optional WriteDriver::writeLogicalDisk(Communication& com, device_even continue; } - if(!amount.has_value() || *amount == 0) { + if(!amount.has_value() || *amount < curAmt) { if(timeout < std::chrono::milliseconds::zero()) report(APIEvent::Type::Timeout, APIEvent::Severity::Error); else - report(blocksProcessed ? APIEvent::Type::EOFReached : APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::Error); + report((blocksProcessed || amount.value_or(0u) != 0u) ? APIEvent::Type::EOFReached : + APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::Error); break; }