{\r
call_result_t rc;\r
MOSAL_iobuf_t new_iobuf; // new allocated IOBUF object\r
- MT_virt_addr_t seg_va = va; // current segment start\r
- MT_size_t seg_size = size; // current segment size\r
- MT_size_t rdc = size; // remain data counter - what is rest to lock\r
- MT_size_t delta; // he size of the last not full page of the first segment\r
+ MT_virt_addr_t seg_va; // current segment start\r
+ MT_size_t seg_size; // current segment size\r
+ MT_size_t rdc; // remain data counter - what is rest to lock\r
+ MT_size_t delta; // he size of the last not full page of the first segment\r
MOSAL_iobuf_seg_t iobuf_seg_p; // pointer to current segment object\r
unsigned page_size;\r
\r
MOSAL_dlist_init_head( &new_iobuf->seg_que );\r
new_iobuf->seg_num = 0;\r
\r
+ // Round the seg_va down to a page boundary so that we always get a seg_size\r
+ // that is an integral number of pages.\r
+ delta = va & (PAGE_SIZE - 1);\r
+ seg_va = va - delta;\r
+ // Since we rounded down the seg_va, we need to round up the rdc and size.\r
+ seg_size = rdc = size + delta;\r
+\r
// allocate segments\r
while (rdc > 0) {\r
// map a segment\r