summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext2fs/pager.c6
-rw-r--r--ufs/pager.c10
2 files changed, 14 insertions, 2 deletions
diff --git a/ext2fs/pager.c b/ext2fs/pager.c
index 97fdd31b..558c87e4 100644
--- a/ext2fs/pager.c
+++ b/ext2fs/pager.c
@@ -671,8 +671,12 @@ diskfs_get_filemap (struct node *node)
upi->p =
pager_create (upi, pager_bucket, MAY_CACHE, MEMORY_OBJECT_COPY_DELAY);
node->dn->fileinfo = upi;
+ right = pager_get_port (node->dn->fileinfo->p);
+ ports_port_deref (node->dn->fileinfo->p);
}
- right = pager_get_port (node->dn->fileinfo->p);
+ else
+ /* XXX race; see ufs/pager.c here. */
+ right = pager_get_port (node->dn->fileinfo->p);
spin_unlock (&node_to_page_lock);
mach_port_insert_right (mach_task_self (), right, right,
diff --git a/ufs/pager.c b/ufs/pager.c
index 52e77f05..139e5723 100644
--- a/ufs/pager.c
+++ b/ufs/pager.c
@@ -459,8 +459,16 @@ diskfs_get_filemap (struct node *np)
upi->p = pager_create (upi, pager_bucket,
MAY_CACHE, MEMORY_OBJECT_COPY_DELAY);
np->dn->fileinfo = upi;
+ right = pager_get_port (np->dn->fileinfo->p);
+ ports_port_deref (np->dn->fileinfo->p);
}
- right = pager_get_port (np->dn->fileinfo->p);
+ else
+ /* There is a race condition here. If there are no references
+ to NP->dn->fileinfo->p, then the clean routine might be
+ blocked trying to get into node2pagelock, and this call is
+ invalid. XXX */
+ right = pager_get_port (np->dn->fileinfo->p);
+
spin_unlock (&node2pagelock);
mach_port_insert_right (mach_task_self (), right, right,