FreeBSD: Fix translation from ABD to physical pages.
In hypothetical case of non-linear ABD with single segment, multiple
to page size but not aligned to it, vdev_geom_fill_unmap_cb() could
fill one page less into bio_ma array.
I am not sure it is expoitable, but better to be safe than sorry.
Reported-by: Mark Johnston <markj@FreeBSD.org>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
(cherry picked from commit 5352f85cdd
)
This commit is contained in:
parent
c220771a47
commit
972637dc06
|
@ -1132,8 +1132,12 @@ vdev_geom_fill_unmap_cb(void *buf, size_t len, void *priv)
|
|||
vm_offset_t addr = (vm_offset_t)buf;
|
||||
vm_offset_t end = addr + len;
|
||||
|
||||
if (bp->bio_ma_n == 0)
|
||||
if (bp->bio_ma_n == 0) {
|
||||
bp->bio_ma_offset = addr & PAGE_MASK;
|
||||
addr &= ~PAGE_MASK;
|
||||
} else {
|
||||
ASSERT0(P2PHASE(addr, PAGE_SIZE));
|
||||
}
|
||||
do {
|
||||
bp->bio_ma[bp->bio_ma_n++] =
|
||||
PHYS_TO_VM_PAGE(pmap_kextract(addr));
|
||||
|
|
Loading…
Reference in New Issue