From d3a45067642a4b7dc381321416d8303fe88a721e Mon Sep 17 00:00:00 2001
From: Kirill Smelkov <kirr@nexedi.com>
Date: Wed, 10 Jul 2019 19:42:59 +0300
Subject: [PATCH] .

---
 bigfile/tests/test_virtmem.c | 54 ++++++++++++++++++++++++++++++++++--
 1 file changed, 51 insertions(+), 3 deletions(-)

diff --git a/bigfile/tests/test_virtmem.c b/bigfile/tests/test_virtmem.c
index 62074259..0b9f23ea 100644
--- a/bigfile/tests/test_virtmem.c
+++ b/bigfile/tests/test_virtmem.c
@@ -1181,8 +1181,8 @@ void test_file_access_mmapbase(void)
     RAM *ram;
     BigFileH fh_struct, *fh = &fh_struct;
     VMA vma_struct, *vma = &vma_struct;
-//  Page *page0, *page2, *page3;
-    Page *page0, *page2;
+    VMA vma2_struct, *vma2 = &vma2_struct;
+    Page *page0, *page2, *page3;
     blk_t *b0, *b2;
     size_t PS, PSb;
     int fd, err;
@@ -1366,8 +1366,56 @@ void test_file_access_mmapbase(void)
     CHECK_MRU   (page0, page2);
     CHECK_DIRTY (page0, page2);
 
+    /* dirtying a page in one mapping automatically mmaps dirty page in all
+     * other wcfs mappings */
+    err = fileh_mmap(vma2, fh, 100, 4);
+    ok1(!err);
+
+    ok1(fh->mmaps.next == &vma->same_fileh);
+    ok1(vma->same_fileh.next == &vma2->same_fileh);
+    ok1(vma2->same_fileh.next == &fh->mmaps);
+
+    ok1( M(vma, 0));    CHECK_PAGE  (page0,   100,    PAGE_DIRTY,     2);
+    ok1(!M(vma, 1));    CHECK_NOPAGE(         101                      );
+    ok1( M(vma, 2));    CHECK_PAGE  (page2,   102,    PAGE_DIRTY,     2);
+    ok1(!M(vma, 3));    CHECK_NOPAGE(         103                      );
+
+    ok1( M(vma2, 0));   CHECK_PAGE  (page0,   100,    PAGE_DIRTY,     2);
+    ok1(!M(vma2, 1));   CHECK_NOPAGE(         101                      );
+    ok1( M(vma2, 2));   CHECK_PAGE  (page2,   102,    PAGE_DIRTY,     2);
+    ok1(!M(vma2, 3));   CHECK_NOPAGE(         103                      );
+
+    CHECK_MRU   (page0, page2);
+    CHECK_DIRTY (page0, page2);
+
+    B(vma2, 3*PSb) = 13;    /* write to page[3] via vma2 */
+
+    page3 = pagemap_get(&fh->pagemap, 103);
+    ok1( M(vma, 0));    CHECK_PAGE  (page0,   100,    PAGE_DIRTY,     2);
+    ok1(!M(vma, 1));    CHECK_NOPAGE(         101                      );
+    ok1( M(vma, 2));    CHECK_PAGE  (page2,   102,    PAGE_DIRTY,     2);
+    ok1( M(vma, 3));    CHECK_PAGE  (page3,   103,    PAGE_DIRTY,     2);
+
+    ok1( M(vma2, 0));   CHECK_PAGE  (page0,   100,    PAGE_DIRTY,     2);
+    ok1(!M(vma2, 1));   CHECK_NOPAGE(         101                      );
+    ok1( M(vma2, 2));   CHECK_PAGE  (page2,   102,    PAGE_DIRTY,     2);
+    ok1( M(vma2, 3));   CHECK_PAGE  (page3,   103,    PAGE_DIRTY,     2);
+
+    ok1(B(vma,  3*PSb + 0) ==  13); /* set by write */
+    ok1(B(vma,  3*PSb + 1) == 103);
+    ok1(B(vma,  3*PSb + PSb - 1) == 103);
+
+    ok1(B(vma2, 3*PSb + 0) ==  13); /* set by write */
+    ok1(B(vma2, 3*PSb + 1) == 103);
+    ok1(B(vma2, 3*PSb + PSb - 1) == 103);
+
+    CHECK_MRU   (page3, page0, page2);
+    CHECK_DIRTY (page3, page0, page2);
+
+
+
+
 
-    // XXX fh vs fh2 vs fh.page3 dirty -> page3 appears mapped in fh2 too
 
     // XXX read page0
     // XXX read page3
-- 
2.30.9