block: properly wind back iovec iterator now

This commit is contained in:
Matheus
2024-09-21 17:07:52 -03:00
parent 67546178f5
commit c29532a2c4
2 changed files with 14 additions and 3 deletions
+7 -3
View File
@@ -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;
+7
View File
@@ -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;