summaryrefslogtreecommitdiff
path: root/libnetfs
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2016-02-07 01:33:00 -0500
committerJustus Winter <4winter@informatik.uni-hamburg.de>2016-02-07 15:42:23 +0100
commitafea5285b0e40b68f97b47f0f0edc471b554fb34 (patch)
treed050d0e9738372db680d1d4036c63bd7d6de6cfb /libnetfs
parent35ae0168bbdae2eb7029262f49d394046a67860f (diff)
Use refcount_t for peropen reference counting in libnetfs.
* libnetfs/netfs.h: Use refcount_t. * libnetfs/make-peropen.c: Initialize to 1 with refcount_init just like in libdiskfs. * libnetfs/make-protid.c: Don't increment the count here. Do it like libdiskfs. * libnetfs/io-duplicate.c: Add refcount_ref since netfs_make_protid no longer increments the refcount. * libnetfs/io-reauthenticate.c: Likewise. * libnetfs/io-restrict-auth.c: Likewise. * libnetfs/release-peropen.c: Dereference without locking.
Diffstat (limited to 'libnetfs')
-rw-r--r--libnetfs/io-duplicate.c1
-rw-r--r--libnetfs/io-reauthenticate.c2
-rw-r--r--libnetfs/io-restrict-auth.c2
-rw-r--r--libnetfs/make-peropen.c2
-rw-r--r--libnetfs/make-protid.c1
-rw-r--r--libnetfs/netfs.h2
-rw-r--r--libnetfs/release-peropen.c38
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);
}