mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 06:58: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) {
|
while (done < count) {
|
||||||
void *page;
|
void *page;
|
||||||
size_t page_offset, page_remaining;
|
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);
|
err = iovec_iterator_next_page(iovec_iterator, &page_offset, &page_remaining, &page);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -537,6 +534,13 @@ static int rwblocks(nvmenamespace_t *namespace, iovec_iterator_t *iovec_iterator
|
|||||||
|
|
||||||
pmm_release((void *)prp[0]);
|
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)
|
if (err)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -135,6 +135,13 @@ static int vioblk_rw(vioblkdev_t *blkdev, iovec_iterator_t *iovec_iterator, uint
|
|||||||
|
|
||||||
pmm_release(page);
|
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) {
|
if (*statushhdm) {
|
||||||
err = EIO;
|
err = EIO;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user