commit 755419de31af8510a8c0eca07348516acd918e6b
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Sun Aug 22 01:30:16 2021 +0200

    rumpdisk: Add missing deallocation in device_write
    
    * rumpdisk/block-rump.c (rumpdisk_device_write): Call vm_deallocate
    after writing the data.

commit cd10e825fe4b5458c0deaa300449e0cd872570ef
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Sun Aug 22 01:32:05 2021 +0200

    rumpdisk: Simplify allocating data for device_read
    
    * rumpdisk/block-rump.c (rumpdisk_device_read): Use
      vm_allocate/vm_deallocate instead of mmap/munmap.

diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c
index 80cdc350..2c083cb2 100644
--- a/rumpdisk/block-rump.c
+++ b/rumpdisk/block-rump.c
@@ -288,6 +288,8 @@ rumpdisk_device_write (void *d, mach_port_t reply_port,
     return D_INVALID_OPERATION;
 
   written = rump_sys_pwrite (bd->rump_fd, (const void *)data, (size_t)count, (off_t)bn * bd->block_size);
+  vm_deallocate (mach_task_self (), (vm_address_t) data, count);
+
   if (written < 0)
     {
       *bytes_written = 0;
@@ -309,10 +309,11 @@ rumpdisk_device_read (void *d, mach_port_t reply_port,
 		      unsigned *bytes_read)
 {
   struct block_data *bd = d;
-  char *buf;
+  vm_address_t buf;
   int pagesize = sysconf (_SC_PAGE_SIZE);
   int npages = (count + pagesize - 1) / pagesize;
   ssize_t err;
+  kern_return_t ret;
 
   if ((bd->mode & D_READ) == 0)
     return D_INVALID_OPERATION;
@@ -321,22 +322,21 @@ rumpdisk_device_read (void *d, mach_port_t reply_port,
     return D_SUCCESS;
 
   *data = 0;
-  buf = mmap (NULL, npages * pagesize, PROT_READ | PROT_WRITE,
-	      MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
-  if (buf == MAP_FAILED)
-    return errno;
+  ret = vm_allocate (mach_task_self (), &buf, npages * pagesize, TRUE);
+  if (ret != KERN_SUCCESS)
+    return ENOMEM;
 
   err = rump_sys_pread (bd->rump_fd, (void *)buf, (size_t)count, (off_t)bn * bd->block_size);
   if (err < 0)
     {
       *bytes_read = 0;
-      munmap (buf, npages * pagesize);
+      vm_deallocate (mach_task_self (), buf, npages * pagesize);
       return EIO;
     }
   else
     {
       *bytes_read = err;
-      *data = buf;
+      *data = (void*) buf;
       return D_SUCCESS;
     }
 }
