Avoid special case for non-splitting transactions
diff --git a/system/dev/block/block/server.cpp b/system/dev/block/block/server.cpp
index dc9b320..3205c23 100644
--- a/system/dev/block/block/server.cpp
+++ b/system/dev/block/block/server.cpp
@@ -340,18 +340,7 @@
return status;
}
- BlockMessageWrapper wrapper;
const uint32_t max_xfer = info_.max_transfer_size / bsz;
- if ((max_xfer == 0) || (request->length <= max_xfer)) {
- if ((status = BlockMessageWrapper::Create(block_op_size_, iobuf.CopyPointer(), this,
- request, &wrapper)) != ZX_OK) {
- return status;
- }
- InQueueAdd(iobuf->vmo(), request->length, request->vmo_offset,
- request->dev_offset, wrapper.release(), &intake_queue_);
- return ZX_OK;
- }
-
uint32_t len_remaining = request->length;
uint64_t vmo_offset = request->vmo_offset;
uint64_t dev_offset = request->dev_offset;
@@ -361,9 +350,10 @@
//
// Once all of these smaller messages are created, splice
// them into the input queue together.
- BlockMsgQueue sub_txns_queue;
uint32_t sub_txns = fbl::round_up(len_remaining, max_xfer) / max_xfer;
uint32_t sub_txn_idx = 0;
+ BlockMessageWrapper wrapper;
+ BlockMsgQueue sub_txns_queue;
while (sub_txn_idx != sub_txns) {
// We'll be using a new BlockMessageWrapper for each sub-component.
if ((status = BlockMessageWrapper::Create(block_op_size_, iobuf.CopyPointer(), this,
@@ -381,13 +371,14 @@
if (sub_txn_idx != 0) {
wrapper.bop()->command &= ~BLOCK_FL_BARRIER_BEFORE;
}
- InQueueAdd(iobuf->vmo(), length, vmo_offset, dev_offset, wrapper.release(),
- &sub_txns_queue);
+ InQueueAdd(iobuf->vmo(), length, vmo_offset, dev_offset, wrapper.release(), &intake_queue_);
vmo_offset += length;
dev_offset += length;
sub_txn_idx++;
}
- groups_[request->group].CtrAdd(sub_txns - 1);
+ if (sub_txns > 1) {
+ groups_[request->group].CtrAdd(sub_txns - 1);
+ }
ZX_DEBUG_ASSERT(len_remaining == 0);
intake_queue_.splice(intake_queue_.end(), sub_txns_queue);
return ZX_OK;