[Midnightbsd-cvs] src [9464] trunk/sys/dev/md/md.c: Fix the data corruption on the swap-backed md.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Mar 5 14:40:24 EST 2017


Revision: 9464
          http://svnweb.midnightbsd.org/src/?rev=9464
Author:   laffer1
Date:     2017-03-05 14:40:24 -0500 (Sun, 05 Mar 2017)
Log Message:
-----------
Fix the data corruption on the swap-backed md. Assign the rv variable a
success code if the pager was not asked for the page.

Modified Paths:
--------------
    trunk/sys/dev/md/md.c

Modified: trunk/sys/dev/md/md.c
===================================================================
--- trunk/sys/dev/md/md.c	2017-03-05 19:39:41 UTC (rev 9463)
+++ trunk/sys/dev/md/md.c	2017-03-05 19:40:24 UTC (rev 9464)
@@ -669,7 +669,9 @@
 		sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
 		VM_OBJECT_LOCK(sc->object);
 		if (bp->bio_cmd == BIO_READ) {
-			if (m->valid != VM_PAGE_BITS_ALL)
+			if (m->valid == VM_PAGE_BITS_ALL)
+				rv = VM_PAGER_OK;
+			else
 				rv = vm_pager_get_pages(sc->object, &m, 1, 0);
 			if (rv == VM_PAGER_ERROR) {
 				sf_buf_free(sf);
@@ -691,6 +693,8 @@
 		} else if (bp->bio_cmd == BIO_WRITE) {
 			if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL)
 				rv = vm_pager_get_pages(sc->object, &m, 1, 0);
+			else
+				rv = VM_PAGER_OK;
 			if (rv == VM_PAGER_ERROR) {
 				sf_buf_free(sf);
 				sched_unpin();
@@ -702,6 +706,8 @@
 		} else if (bp->bio_cmd == BIO_DELETE) {
 			if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL)
 				rv = vm_pager_get_pages(sc->object, &m, 1, 0);
+			else
+				rv = VM_PAGER_OK;
 			if (rv == VM_PAGER_ERROR) {
 				sf_buf_free(sf);
 				sched_unpin();



More information about the Midnightbsd-cvs mailing list