summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--storeio/pager.c64
1 files changed, 34 insertions, 30 deletions
diff --git a/storeio/pager.c b/storeio/pager.c
index d6bdc43e..8cafa176 100644
--- a/storeio/pager.c
+++ b/storeio/pager.c
@@ -214,46 +214,50 @@ dev_stop_paging (struct dev *dev, int nosync)
/* Returns in MEMOBJ the port for a memory object backed by the storage on
DEV. Returns 0 or the error code if an error occurred. */
error_t
-dev_get_memory_object (struct dev *dev, memory_object_t *memobj)
+dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj)
{
- int created = 0;
- error_t err = 0;
+ error_t err = store_map (dev->store, prot, memobj);
- init_dev_paging ();
-
- mutex_lock (&dev->pager_lock);
-
- if (dev->pager == NULL)
+ if (err == EOPNOTSUPP)
{
- dev->pager =
- pager_create ((struct user_pager_info *)dev, pager_port_bucket,
- 1, MEMORY_OBJECT_COPY_DELAY);
- created = 1;
- }
+ int created = 0;
- if (dev->pager == NULL)
- err = ENODEV; /* XXX ??? */
- else
- {
- *memobj = pager_get_port (dev->pager);
+ init_dev_paging ();
+
+ mutex_lock (&dev->pager_lock);
- if (*memobj == MACH_PORT_NULL)
- /* Pager is currently being destroyed, try again. */
+ if (dev->pager == NULL)
{
- dev->pager = 0;
- mutex_unlock (&dev->pager_lock);
- return dev_get_memory_object (dev, memobj);
+ dev->pager =
+ pager_create ((struct user_pager_info *)dev, pager_port_bucket,
+ 1, MEMORY_OBJECT_COPY_DELAY);
+ created = 1;
}
+
+ if (dev->pager == NULL)
+ err = ENODEV; /* XXX ??? */
else
- err =
- mach_port_insert_right (mach_task_self (),
- *memobj, *memobj, MACH_MSG_TYPE_MAKE_SEND);
- }
+ {
+ *memobj = pager_get_port (dev->pager);
+
+ if (*memobj == MACH_PORT_NULL)
+ /* Pager is currently being destroyed, try again. */
+ {
+ dev->pager = 0;
+ mutex_unlock (&dev->pager_lock);
+ return dev_get_memory_object (dev, prot, memobj);
+ }
+ else
+ err =
+ mach_port_insert_right (mach_task_self (),
+ *memobj, *memobj, MACH_MSG_TYPE_MAKE_SEND);
+ }
- if (created)
- ports_port_deref (dev->pager);
+ if (created)
+ ports_port_deref (dev->pager);
- mutex_unlock (&dev->pager_lock);
+ mutex_unlock (&dev->pager_lock);
+ }
return err;
}