/* Page fetching state */
int curr_page; /* changes */
int total_pages; /* doesn't change */
+ int pages_left; /* approximate total IO pages */
unsigned long curr_user_address;/* changes */
/* Page queue */
if (ret)
goto out;
sector = dio->next_block_in_bio << (dio->blkbits - 9);
- nr_pages = min(dio->total_pages, BIO_MAX_PAGES);
+ nr_pages = min(dio->pages_left, bio_get_nr_vecs(dio->map_bh.b_bdev));
+ BUG_ON(nr_pages <= 0);
ret = dio_bio_alloc(dio, dio->map_bh.b_bdev, sector, nr_pages);
dio->boundary = 0;
out:
}
}
page_cache_release(page);
+ dio->pages_left--;
out:
return ret;
}
spin_lock_init(&dio.bio_list_lock);
dio.bio_list = NULL;
dio.waiter = NULL;
+ dio.pages_left = 0;
+
+ for (seg = 0; seg < nr_segs; seg++)
+ dio.pages_left += (iov[seg].iov_len / PAGE_SIZE) + 2;
for (seg = 0; seg < nr_segs; seg++) {
user_addr = (unsigned long)iov[seg].iov_base;