View | Details | Raw Unified | Return to bug 244713
Collapse All | Expand All

(-)sys/kern/kern_sendfile.c (-11 / +4 lines)
Lines 325-342 sendfile_swapin(vm_object_t obj, struct sf_io *sfi Link Here
325
		count = min(a + 1, npages - i);
325
		count = min(a + 1, npages - i);
326
326
327
		/*
327
		/*
328
		 * We should not pagein into a valid page, thus we first trim
328
		 * We should not pagein into a valid page because
329
		 * any valid pages off the end of request, and substitute
329
		 * there might be still unfinished write tracked by
330
		 * to bogus_page those, that are in the middle.
330
		 * e.g. a buffer, thus we substitute any valid pages
331
		 * with the bogus one.
331
		 */
332
		 */
332
		for (j = i + count - 1; j > i; j--) {
333
			if (vm_page_is_valid(pa[j], vmoff(j, off) & PAGE_MASK,
334
			    xfsize(j, npages, off, len))) {
335
				count--;
336
				rhpages = 0;
337
			} else
338
				break;
339
		}
340
		for (j = i + 1; j < i + count - 1; j++)
333
		for (j = i + 1; j < i + count - 1; j++)
341
			if (vm_page_is_valid(pa[j], vmoff(j, off) & PAGE_MASK,
334
			if (vm_page_is_valid(pa[j], vmoff(j, off) & PAGE_MASK,
342
			    xfsize(j, npages, off, len))) {
335
			    xfsize(j, npages, off, len))) {
(-)sys/kern/vfs_bio.c (-2 / +8 lines)
Lines 5185-5197 vfs_bio_getpages(struct vnode *vp, vm_page_t *ma, Link Here
5185
	    != 0) ? GB_UNMAPPED : 0;
5185
	    != 0) ? GB_UNMAPPED : 0;
5186
	VM_OBJECT_WLOCK(object);
5186
	VM_OBJECT_WLOCK(object);
5187
again:
5187
again:
5188
	for (i = 0; i < count; i++)
5188
	for (i = 0; i < count; i++) {
5189
		vm_page_busy_downgrade(ma[i]);
5189
		if (ma[i] != bogus_page)
5190
			vm_page_busy_downgrade(ma[i]);
5191
	}
5190
	VM_OBJECT_WUNLOCK(object);
5192
	VM_OBJECT_WUNLOCK(object);
5191
5193
5192
	lbnp = -1;
5194
	lbnp = -1;
5193
	for (i = 0; i < count; i++) {
5195
	for (i = 0; i < count; i++) {
5194
		m = ma[i];
5196
		m = ma[i];
5197
		if (m == bogus_page)
5198
			continue;
5195
5199
5196
		/*
5200
		/*
5197
		 * Pages are shared busy and the object lock is not
5201
		 * Pages are shared busy and the object lock is not
Lines 5259-5264 end_pages: Link Here
5259
	VM_OBJECT_WLOCK(object);
5263
	VM_OBJECT_WLOCK(object);
5260
	redo = false;
5264
	redo = false;
5261
	for (i = 0; i < count; i++) {
5265
	for (i = 0; i < count; i++) {
5266
		if (ma[i] == bogus_page)
5267
			continue;
5262
		vm_page_sunbusy(ma[i]);
5268
		vm_page_sunbusy(ma[i]);
5263
		ma[i] = vm_page_grab(object, ma[i]->pindex, VM_ALLOC_NORMAL);
5269
		ma[i] = vm_page_grab(object, ma[i]->pindex, VM_ALLOC_NORMAL);
5264
5270

Return to bug 244713