summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sendfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_sendfile.c')
-rw-r--r--sys/kern/kern_sendfile.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/kern/kern_sendfile.c b/sys/kern/kern_sendfile.c
index 973e476..aafa697 100644
--- a/sys/kern/kern_sendfile.c
+++ b/sys/kern/kern_sendfile.c
@@ -308,7 +308,7 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, off_t off, off_t len,
int npages, int rhpages, int flags)
{
vm_page_t *pa = sfio->pa;
- int nios;
+ int grabbed, nios;
nios = 0;
flags = (flags & SF_NODISKIO) ? VM_ALLOC_NOWAIT : 0;
@@ -318,14 +318,14 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, off_t off, off_t len,
* only required pages. Readahead pages are dealt with later.
*/
VM_OBJECT_WLOCK(obj);
- for (int i = 0; i < npages; i++) {
- pa[i] = vm_page_grab(obj, OFF_TO_IDX(vmoff(i, off)),
- VM_ALLOC_WIRED | VM_ALLOC_NORMAL | flags);
- if (pa[i] == NULL) {
- npages = i;
- rhpages = 0;
- break;
- }
+
+ grabbed = vm_page_grab_pages(obj, OFF_TO_IDX(off),
+ VM_ALLOC_NORMAL | VM_ALLOC_WIRED | flags, pa, npages);
+ if (grabbed < npages) {
+ for (int i = grabbed; i < npages; i++)
+ pa[i] = NULL;
+ npages = grabbed;
+ rhpages = 0;
}
for (int i = 0; i < npages;) {
OpenPOWER on IntegriCloud