diff options
Diffstat (limited to 'libnetfs')
-rw-r--r-- | libnetfs/io-duplicate.c | 1 | ||||
-rw-r--r-- | libnetfs/io-reauthenticate.c | 2 | ||||
-rw-r--r-- | libnetfs/io-restrict-auth.c | 2 | ||||
-rw-r--r-- | libnetfs/make-peropen.c | 2 | ||||
-rw-r--r-- | libnetfs/make-protid.c | 1 | ||||
-rw-r--r-- | libnetfs/netfs.h | 2 | ||||
-rw-r--r-- | libnetfs/release-peropen.c | 38 |
7 files changed, 25 insertions, 23 deletions
diff --git a/libnetfs/io-duplicate.c b/libnetfs/io-duplicate.c index b2c3a3a1..263f9e81 100644 --- a/libnetfs/io-duplicate.c +++ b/libnetfs/io-duplicate.c @@ -34,6 +34,7 @@ netfs_S_io_duplicate (struct protid *user, if (err) return err; + refcount_ref (&user->po->refcnt); pthread_mutex_lock (&user->po->np->lock); newpi = netfs_make_protid (user->po, clone); *newport = ports_get_right (newpi); diff --git a/libnetfs/io-reauthenticate.c b/libnetfs/io-reauthenticate.c index 8ff4182b..b2d4a440 100644 --- a/libnetfs/io-reauthenticate.c +++ b/libnetfs/io-reauthenticate.c @@ -34,12 +34,14 @@ netfs_S_io_reauthenticate (struct protid *user, mach_port_t rend_port) /* This routine must carefully ignore EINTR because we are a simpleroutine, so callers won't know to restart. */ + refcount_ref (&user->po->refcnt); pthread_mutex_lock (&user->po->np->lock); do newpi = netfs_make_protid (user->po, 0); while (! newpi && errno == EINTR); if (! newpi) { + refcount_deref (&user->po->refcnt); pthread_mutex_unlock (&user->po->np->lock); return errno; } diff --git a/libnetfs/io-restrict-auth.c b/libnetfs/io-restrict-auth.c index 0c3403d8..79b7d095 100644 --- a/libnetfs/io-restrict-auth.c +++ b/libnetfs/io-restrict-auth.c @@ -43,6 +43,7 @@ netfs_S_io_restrict_auth (struct protid *user, return err; pthread_mutex_lock (&user->po->np->lock); + refcount_ref (&user->po->refcnt); newpi = netfs_make_protid (user->po, new_user); if (newpi) { @@ -52,6 +53,7 @@ netfs_S_io_restrict_auth (struct protid *user, } else { + refcount_deref (&user->po->refcnt); pthread_mutex_unlock (&user->po->np->lock); iohelp_free_iouser (new_user); err = ENOMEM; diff --git a/libnetfs/make-peropen.c b/libnetfs/make-peropen.c index f7be58b1..413e9140 100644 --- a/libnetfs/make-peropen.c +++ b/libnetfs/make-peropen.c @@ -31,7 +31,7 @@ netfs_make_peropen (struct node *np, int flags, struct peropen *context) po->filepointer = 0; po->lock_status = LOCK_UN; - po->refcnt = 0; + refcount_init (&po->refcnt, 1); po->openstat = flags; po->np = np; po->path = NULL; diff --git a/libnetfs/make-protid.c b/libnetfs/make-protid.c index bf18283c..995ac1ea 100644 --- a/libnetfs/make-protid.c +++ b/libnetfs/make-protid.c @@ -36,7 +36,6 @@ netfs_make_protid (struct peropen *po, struct iouser *cred) if (errno) return 0; - po->refcnt++; pi->po = po; pi->user = cred; pi->shared_object = MACH_PORT_NULL; diff --git a/libnetfs/netfs.h b/libnetfs/netfs.h index fbe2c60d..3f94ccd3 100644 --- a/libnetfs/netfs.h +++ b/libnetfs/netfs.h @@ -51,7 +51,7 @@ struct peropen { loff_t filepointer; int lock_status; - int refcnt; + refcount_t refcnt; int openstat; struct node *np; diff --git a/libnetfs/release-peropen.c b/libnetfs/release-peropen.c index c206b438..01af97dd 100644 --- a/libnetfs/release-peropen.c +++ b/libnetfs/release-peropen.c @@ -24,29 +24,27 @@ void netfs_release_peropen (struct peropen *po) { + if (refcount_deref (&po->refcnt) > 0) + return; + pthread_mutex_lock (&po->np->lock); - if (--po->refcnt) - pthread_mutex_unlock (&po->np->lock); - else - { - if (po->root_parent) - mach_port_deallocate (mach_task_self (), po->root_parent); + if (po->root_parent) + mach_port_deallocate (mach_task_self (), po->root_parent); - if (po->shadow_root && po->shadow_root != po->np) - { - pthread_mutex_lock (&po->shadow_root->lock); - netfs_nput (po->shadow_root); - } - if (po->shadow_root_parent) - mach_port_deallocate (mach_task_self (), po->shadow_root_parent); + if (po->shadow_root && po->shadow_root != po->np) + { + pthread_mutex_lock (&po->shadow_root->lock); + netfs_nput (po->shadow_root); + } + if (po->shadow_root_parent) + 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); + if (po->lock_status != LOCK_UN) + fshelp_acquire_lock (&po->np->userlock, &po->lock_status, + &po->np->lock, LOCK_UN); - netfs_nput (po->np); + netfs_nput (po->np); - free (po->path); - free (po); - } + free (po->path); + free (po); } |