1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
From afea5285b0e40b68f97b47f0f0edc471b554fb34 Mon Sep 17 00:00:00 2001
From: Flavio Cruz <flaviocruz@gmail.com>
Date: Sun, 7 Feb 2016 01:33:00 -0500
Subject: [PATCH hurd] 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.
---
libnetfs/io-duplicate.c | 1 +
libnetfs/io-reauthenticate.c | 2 ++
libnetfs/io-restrict-auth.c | 2 ++
libnetfs/make-peropen.c | 2 +-
libnetfs/make-protid.c | 1 -
libnetfs/netfs.h | 2 +-
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 b2c3a3a..263f9e8 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 8ff4182..b2d4a44 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 0c3403d..79b7d09 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 f7be58b..413e914 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 bf18283..995ac1e 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 fbe2c60..3f94ccd 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 c206b43..01af97d 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);
}
--
2.1.4
|