mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
block: properly wind back iovec iterator now
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user