diff --git a/core/mmu.cc b/core/mmu.cc
index 920107ec04c4445031474b859bd0842454124e5b..4d7ae9ac57b9e3925b1d5c77cdc0d8a53e54bc44 100644
--- a/core/mmu.cc
+++ b/core/mmu.cc
@@ -1091,12 +1091,12 @@ void* map_anon(const void* addr, size_t size, unsigned flags, unsigned perm)
 
 std::unique_ptr<file_vma> default_file_mmap(file* file, addr_range range, unsigned flags, unsigned perm, off_t offset)
 {
-    return std::unique_ptr<file_vma>(new file_vma(range, perm, file, offset, flags & mmu::mmap_shared, new map_file_page_read(file, offset)));
+    return std::unique_ptr<file_vma>(new file_vma(range, perm, flags, file, offset, new map_file_page_read(file, offset)));
 }
 
 std::unique_ptr<file_vma> map_file_mmap(file* file, addr_range range, unsigned flags, unsigned perm, off_t offset)
 {
-    return std::unique_ptr<file_vma>(new file_vma(range, perm, file, offset, flags & mmu::mmap_shared, new map_file_page_mmap(file, offset)));
+    return std::unique_ptr<file_vma>(new file_vma(range, perm, flags, file, offset, new map_file_page_mmap(file, offset)));
 }
 
 void* map_file(const void* addr, size_t size, unsigned flags, unsigned perm,
@@ -1534,11 +1534,10 @@ ulong map_jvm(unsigned char* jvm_addr, size_t size, size_t align, balloon_ptr b)
     return 0;
 }
 
-file_vma::file_vma(addr_range range, unsigned perm, fileref file, f_offset offset, bool shared, page_allocator* page_ops)
-    : vma(range, perm, mmap_small, !shared, page_ops)
+file_vma::file_vma(addr_range range, unsigned perm, unsigned flags, fileref file, f_offset offset, page_allocator* page_ops)
+    : vma(range, perm, flags | mmap_small, !(flags & mmap_shared), page_ops)
     , _file(file)
     , _offset(offset)
-    , _shared(shared)
 {
     int err = validate_perm(perm);
 
@@ -1596,7 +1595,7 @@ private:
 
 error file_vma::sync(uintptr_t start, uintptr_t end)
 {
-    if (!_shared)
+    if (!has_flags(mmap_shared))
         return make_error(ENOMEM);
     start = std::max(start, _range.start());
     end = std::min(end, _range.end());
@@ -1617,7 +1616,7 @@ int file_vma::validate_perm(unsigned perm)
         return EACCES;
     }
     if (perm & perm_write) {
-        if (_shared && !(_file->f_flags & FWRITE)) {
+        if (has_flags(mmap_shared) && !(_file->f_flags & FWRITE)) {
             return EACCES;
         }
     }
diff --git a/include/osv/mmu.hh b/include/osv/mmu.hh
index 74c93f052bf3684f2981aa2821e611e5797ffbc3..ebe3bdd73431d458665991394ba5f5910ccadde1 100644
--- a/include/osv/mmu.hh
+++ b/include/osv/mmu.hh
@@ -90,7 +90,7 @@ public:
 
 class file_vma : public vma {
 public:
-    file_vma(addr_range range, unsigned perm, fileref file, f_offset offset, bool shared, page_allocator *page_ops);
+    file_vma(addr_range range, unsigned perm, unsigned flags, fileref file, f_offset offset, page_allocator *page_ops);
     ~file_vma();
     virtual void split(uintptr_t edge) override;
     virtual error sync(uintptr_t start, uintptr_t end) override;
@@ -99,7 +99,6 @@ private:
     f_offset offset(uintptr_t addr);
     fileref _file;
     f_offset _offset;
-    bool _shared;
 };
 
 ulong map_jvm(unsigned char* addr, size_t size, size_t align, balloon_ptr b);