svn commit: r361855 - head/sys/vm
Chuck Silvers
chs at FreeBSD.org
Sat Jun 6 00:48:00 UTC 2020
Author: chs
Date: Sat Jun 6 00:47:59 2020
New Revision: 361855
URL: https://svnweb.freebsd.org/changeset/base/361855
Log:
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
Modified:
head/sys/vm/vnode_pager.c
Modified: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c Sat Jun 6 00:40:02 2020 (r361854)
+++ head/sys/vm/vnode_pager.c Sat Jun 6 00:47:59 2020 (r361855)
@@ -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)
More information about the svn-src-all
mailing list