summaryrefslogtreecommitdiff
path: root/libdiskfs/peropen-rele.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdiskfs/peropen-rele.c')
-rw-r--r--libdiskfs/peropen-rele.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/libdiskfs/peropen-rele.c b/libdiskfs/peropen-rele.c
index d3f74921..877137bb 100644
--- a/libdiskfs/peropen-rele.c
+++ b/libdiskfs/peropen-rele.c
@@ -22,13 +22,8 @@
void
diskfs_release_peropen (struct peropen *po)
{
- pthread_mutex_lock (&po->np->lock);
-
- if (--po->refcnt)
- {
- pthread_mutex_unlock (&po->np->lock);
- return;
- }
+ if (refcount_deref (&po->refcnt) > 0)
+ return;
if (po->root_parent)
mach_port_deallocate (mach_task_self (), po->root_parent);
@@ -40,10 +35,14 @@ diskfs_release_peropen (struct peropen *po)
mach_port_deallocate (mach_task_self (), po->shadow_root_parent);
if (po->lock_status != LOCK_UN)
- fshelp_acquire_lock (&po->np->userlock, &po->lock_status,
- &po->np->lock, LOCK_UN);
-
- diskfs_nput (po->np);
+ {
+ pthread_mutex_lock (&po->np->lock);
+ fshelp_acquire_lock (&po->np->userlock, &po->lock_status,
+ &po->np->lock, LOCK_UN);
+ diskfs_nput (po->np);
+ }
+ else
+ diskfs_nrele (po->np);
free (po->path);
free (po);