From 326418b9b3742698907fc15dff663f687df9524d Mon Sep 17 00:00:00 2001
From: Braden Kell <bradenkell@google.com>
Date: Tue, 23 Apr 2019 19:03:39 +0000
Subject: [PATCH] [zircon][sdmmc] Fix handling of block operations in SDMMC
 core driver

Block operations should be completed with the same length and offset
as they had when first queued.

Test: lsblk on vim2 shows expected partitions
Change-Id: Idfadd4dae0d9939d49322340b44f2c6fb38cb347
---
 zircon/system/dev/block/sdmmc/sdmmc-block-device.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/zircon/system/dev/block/sdmmc/sdmmc-block-device.cpp b/zircon/system/dev/block/sdmmc/sdmmc-block-device.cpp
index 15ab982bcd7..d8f637a36f6 100644
--- a/zircon/system/dev/block/sdmmc/sdmmc-block-device.cpp
+++ b/zircon/system/dev/block/sdmmc/sdmmc-block-device.cpp
@@ -177,8 +177,8 @@ void SdmmcBlockDevice::DoTxn(BlockOperation* txn) {
     req->blocksize = static_cast<uint16_t>(block_info_.block_size);
 
     // convert offset_vmo and length to bytes
-    txn->operation()->rw.offset_vmo *= block_info_.block_size;
-    txn->operation()->rw.length *= block_info_.block_size;
+    uint64_t offset_vmo = txn->operation()->rw.offset_vmo * block_info_.block_size;
+    uint64_t length = txn->operation()->rw.length * block_info_.block_size;
 
     fzl::VmoMapper mapper;
 
@@ -188,18 +188,18 @@ void SdmmcBlockDevice::DoTxn(BlockOperation* txn) {
         req->virt_buffer = nullptr;
         req->pmt = ZX_HANDLE_INVALID;
         req->dma_vmo = txn->operation()->rw.vmo;
-        req->buf_offset = txn->operation()->rw.offset_vmo;
+        req->buf_offset = offset_vmo;
     } else {
         req->use_dma = false;
-        st = mapper.Map(*zx::unowned_vmo(txn->operation()->rw.vmo), txn->operation()->rw.offset_vmo,
-                        txn->operation()->rw.length, ZX_VM_PERM_READ | ZX_VM_PERM_WRITE);
+        st = mapper.Map(*zx::unowned_vmo(txn->operation()->rw.vmo), offset_vmo, length,
+                        ZX_VM_PERM_READ | ZX_VM_PERM_WRITE);
         if (st != ZX_OK) {
             zxlogf(TRACE, "sdmmc: do_txn vmo map error %d\n", st);
             BlockComplete(txn, st, async_id_);
             return;
         }
         req->virt_buffer = mapper.start();
-        req->virt_size = txn->operation()->rw.length;
+        req->virt_size = length;
     }
 
     st = sdmmc_.host().Request(req);
-- 
GitLab