Don't mark pages as valid if reading the contents from disk fails.
Instead, just skip marking pages valid if the read fails. Future attempts to access such pages will notice that they are not marked valid and try to read them from disk again. Reviewed by: kib, markj Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D25138
This commit is contained in:
parent
7674d489fc
commit
bd7d64f548
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=361855
@ -1150,28 +1150,30 @@ vnode_pager_generic_getpages_done(struct buf *bp)
|
||||
if (mt == bogus_page)
|
||||
continue;
|
||||
|
||||
if (nextoff <= object->un_pager.vnp.vnp_size) {
|
||||
/*
|
||||
* Read filled up entire page.
|
||||
*/
|
||||
vm_page_valid(mt);
|
||||
KASSERT(mt->dirty == 0,
|
||||
("%s: page %p is dirty", __func__, mt));
|
||||
KASSERT(!pmap_page_is_mapped(mt),
|
||||
("%s: page %p is mapped", __func__, mt));
|
||||
} else {
|
||||
/*
|
||||
* Read did not fill up entire page.
|
||||
*
|
||||
* Currently we do not set the entire page valid,
|
||||
* we just try to clear the piece that we couldn't
|
||||
* read.
|
||||
*/
|
||||
vm_page_set_valid_range(mt, 0,
|
||||
object->un_pager.vnp.vnp_size - tfoff);
|
||||
KASSERT((mt->dirty & vm_page_bits(0,
|
||||
object->un_pager.vnp.vnp_size - tfoff)) == 0,
|
||||
("%s: page %p is dirty", __func__, mt));
|
||||
if (error == 0) {
|
||||
if (nextoff <= object->un_pager.vnp.vnp_size) {
|
||||
/*
|
||||
* Read filled up entire page.
|
||||
*/
|
||||
vm_page_valid(mt);
|
||||
KASSERT(mt->dirty == 0,
|
||||
("%s: page %p is dirty", __func__, mt));
|
||||
KASSERT(!pmap_page_is_mapped(mt),
|
||||
("%s: page %p is mapped", __func__, mt));
|
||||
} else {
|
||||
/*
|
||||
* Read did not fill up entire page.
|
||||
*
|
||||
* Currently we do not set the entire page
|
||||
* valid, we just try to clear the piece that
|
||||
* we couldn't read.
|
||||
*/
|
||||
vm_page_set_valid_range(mt, 0,
|
||||
object->un_pager.vnp.vnp_size - tfoff);
|
||||
KASSERT((mt->dirty & vm_page_bits(0,
|
||||
object->un_pager.vnp.vnp_size - tfoff)) ==
|
||||
0, ("%s: page %p is dirty", __func__, mt));
|
||||
}
|
||||
}
|
||||
|
||||
if (i < bp->b_pgbefore || i >= bp->b_npages - bp->b_pgafter)
|
||||
|
Loading…
Reference in New Issue
Block a user