diff options
Diffstat (limited to 'rumpdisk')
-rw-r--r-- | rumpdisk/block-rump.c | 34 | ||||
-rw-r--r-- | rumpdisk/main.c | 10 |
2 files changed, 22 insertions, 22 deletions
diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c index 9c6fa10c..398289fb 100644 --- a/rumpdisk/block-rump.c +++ b/rumpdisk/block-rump.c @@ -149,6 +149,7 @@ rumpdisk_device_init (void) || ! device_open (device_master, D_READ, "hd2", &device)) { fprintf(stderr, "Kernel is already driving an IDE device, skipping probing disks\n"); + fflush(stderr); disabled = 1; return; } @@ -160,6 +161,7 @@ rumpdisk_device_init (void) || ! device_open (device_master, D_READ, "sd3", &device)) { fprintf(stderr, "Kernel is already driving a SATA device, skipping probing disks\n"); + fflush(stderr); disabled = 1; return; } @@ -193,19 +195,12 @@ rumpdisk_device_dealloc (void *d) } static void -rumpdisk_device_shutdown (mach_port_t dosync_handle) +rumpdisk_device_sync (void) { - struct block_data *bd = block_head; - if (disabled) return; - while (bd) - { - rumpdisk_device_close((void *)bd); - bd = bd->next; - } - rump_sys_reboot (0, NULL); + rump_sys_sync (); } static io_return_t @@ -293,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; @@ -312,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; @@ -324,22 +322,24 @@ 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; + + /* Ensure physical allocation. */ + memset (buf, 0, npages * pagesize); 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; } } @@ -417,7 +417,7 @@ static struct machdev_device_emulation_ops rump_block_emulation_ops = { NULL, NULL, NULL, - rumpdisk_device_shutdown + rumpdisk_device_sync }; void diff --git a/rumpdisk/main.c b/rumpdisk/main.c index c5f44fb7..bafe0250 100644 --- a/rumpdisk/main.c +++ b/rumpdisk/main.c @@ -36,7 +36,7 @@ mach_port_t bootstrap_resume_task = MACH_PORT_NULL; static const struct argp_option options[] = { {"host-priv-port", 'h', "PORT", 0, "Host private port PORT"}, {"device-master-port",'d', "PORT", 0, "Device master port PORT"}, - {"filesystem-task", 'f', "TASK", 0, "Filesystem task TASK"}, + {"next-task", 'N', "TASK", 0, "Next bootstrap task TASK"}, {0} }; @@ -51,7 +51,7 @@ parse_opt (int key, char *arg, struct argp_state *state) { int host_priv; int dev_master; - int fs_task; + int next_task; } *values = state->hook; switch (key) @@ -62,8 +62,8 @@ parse_opt (int key, char *arg, struct argp_state *state) case 'd': values->dev_master = atoi(arg); break; - case 'f': - values->fs_task = atoi(arg); + case 'N': + values->next_task = atoi(arg); break; case ARGP_KEY_INIT: @@ -79,7 +79,7 @@ parse_opt (int key, char *arg, struct argp_state *state) /* All options parsed successfully */ _hurd_host_priv = values->host_priv; _hurd_device_master = values->dev_master; - bootstrap_resume_task = values->fs_task; + bootstrap_resume_task = values->next_task; break; default: |