summaryrefslogtreecommitdiff
path: root/rumpdisk
diff options
context:
space:
mode:
Diffstat (limited to 'rumpdisk')
-rw-r--r--rumpdisk/block-rump.c34
-rw-r--r--rumpdisk/main.c10
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: