diff --git a/core/mmu.cc b/core/mmu.cc
index 7ca53c67c29f23e2a059ad3eeb97110787ae73f9..588521c9127af3fc339001992cc04f3825b1ad35 100644
--- a/core/mmu.cc
+++ b/core/mmu.cc
@@ -1057,15 +1057,18 @@ ulong populate_vma(vma *vma, void *v, size_t size)
 TRACEPOINT(trace_mmu_invalidate, "addr=%p, vaddr=%p", void *, uintptr_t);
 void unmap_address(void *addr, size_t size)
 {
+    size = align_up(size, page_size);
     WITH_LOCK(shared_fs_mutex) {
-        auto buf = shared_fs_maps.equal_range(addr);
-        for (auto it = buf.first; it != buf.second; it++) {
-            auto vaddr = (*it).second;
-            trace_mmu_invalidate(addr, vaddr);
-            operate_range(page_out(), (void *)vaddr, page_size);
+        for (uintptr_t a = reinterpret_cast<uintptr_t>(addr); size; a += page_size, size -= page_size) {
+            addr = reinterpret_cast<void*>(a);
+            auto buf = shared_fs_maps.equal_range(addr);
+            for (auto it = buf.first; it != buf.second; it++) {
+                auto vaddr = (*it).second;
+                trace_mmu_invalidate(addr, vaddr);
+                operate_range(page_out(), (void *)vaddr, page_size);
+            }
+            shared_fs_maps.erase(addr);
         }
-
-        shared_fs_maps.erase(addr);
     }
 }
 
diff --git a/fs/vfs/vfs_fops.cc b/fs/vfs/vfs_fops.cc
index 1e64b9b7bbe318f7add8a481e63a11edc871df21..84c8669332456096bbf9326a26f32b5e8f2a10fa 100644
--- a/fs/vfs/vfs_fops.cc
+++ b/fs/vfs/vfs_fops.cc
@@ -165,7 +165,7 @@ void* vfs_file::get_page(uintptr_t start, uintptr_t off, size_t size)
 	assert(VOP_MAP(vp, fp, data) == 0);
 	vn_unlock(vp);
 
-	mmu::add_mapping(map_data.buffer, start);
+	mmu::add_mapping(io.iov_base + map_data.buf_off, start);
 	return io.iov_base + map_data.buf_off;
 }