From c29532a2c4be474425afaa8cb146cf52bf602dea Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 21 Sep 2024 17:07:52 -0300 Subject: [PATCH] block: properly wind back iovec iterator now --- kernel-src/io/block/nvme.c | 10 +++++++--- kernel-src/io/block/vioblk.c | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kernel-src/io/block/nvme.c b/kernel-src/io/block/nvme.c index 86c72083..29c35621 100644 --- a/kernel-src/io/block/nvme.c +++ b/kernel-src/io/block/nvme.c @@ -514,10 +514,7 @@ static int rwblocks(nvmenamespace_t *namespace, iovec_iterator_t *iovec_iterator while (done < count) { void *page; size_t page_offset, page_remaining; - // XXX this takes an entire page from the iovec, though it may not be used fully. - // ATM this does not really matter but it could at one point in the future err = iovec_iterator_next_page(iovec_iterator, &page_offset, &page_remaining, &page); - if (err) break; @@ -537,6 +534,13 @@ static int rwblocks(nvmenamespace_t *namespace, iovec_iterator_t *iovec_iterator pmm_release((void *)prp[0]); + // if we didnt use the whole space in the page, set the iterator back a bit + size_t diff_between_available_and_used = page_remaining - docount * namespace->blocksize; + if (diff_between_available_and_used) { + size_t iterator_offset = iovec_iterator_total_offset(iovec_iterator); + iovec_iterator_set(iovec_iterator, iterator_offset - diff_between_available_and_used); + } + if (err) break; diff --git a/kernel-src/io/block/vioblk.c b/kernel-src/io/block/vioblk.c index aa8502d7..2adb896c 100644 --- a/kernel-src/io/block/vioblk.c +++ b/kernel-src/io/block/vioblk.c @@ -135,6 +135,13 @@ static int vioblk_rw(vioblkdev_t *blkdev, iovec_iterator_t *iovec_iterator, uint pmm_release(page); + // if we didnt use the whole space in the page, set the iterator back a bit + size_t diff_between_available_and_used = page_remaining - docount * 512; + if (diff_between_available_and_used) { + size_t iterator_offset = iovec_iterator_total_offset(iovec_iterator); + iovec_iterator_set(iovec_iterator, iterator_offset - diff_between_available_and_used); + } + if (*statushhdm) { err = EIO; break;