diff options
author | Miles Bader <miles@gnu.org> | 1995-05-08 13:32:20 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 1995-05-08 13:32:20 +0000 |
commit | 4c51401dcc09332dae33bc0de3dd9fb7c14627f1 (patch) | |
tree | c63119ec86d2c982956ec144d076764999a75d37 | |
parent | a59ba4531f53f13c86243cf0bbb42e919459a1ff (diff) |
(diskfs_lookup): When looping back to try_again: because we're looking up
"..", be sure and trash the mapping we made of the directory's pager --
otherwise the reference to the pager never gets dropped and we can never
free the node.
(diskfs_lookup): ds->type was being compared to LOOKING, which value it can
never have. Compare ds->stat against LOOKING instead.
-rw-r--r-- | ufs/dir.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -95,7 +95,7 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, struct node *np = 0; int retry_dotdot = 0; memory_object_t memobj; - vm_address_t buf; + vm_address_t buf = 0; vm_size_t buflen; int blockaddr; int idx; @@ -124,6 +124,11 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, ds->mapbuf = 0; ds->mapextent = 0; } + if (buf) + { + vm_deallocate (mach_task_self (), buf, buflen); + buf = 0; + } if (ds && (type == CREATE || type == RENAME)) ds->stat = LOOKING; @@ -245,7 +250,7 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, goto out; } - if ((type == CREATE || type == RENAME) && !np && ds && ds->type == LOOKING) + if ((type == CREATE || type == RENAME) && !np && ds && ds->stat == LOOKING) { /* We didn't find any room, so mark ds to extend the dir */ ds->type = CREATE; |