|
Ian Kent |
ca38f0 |
autofs-5.0.6 - fix wait for master source mutex
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
From: Ian Kent <ikent@redhat.com>
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
A previous change that was meant to handle the case where the master map
|
|
Ian Kent |
ca38f0 |
source mutex read lock count was exceeded was incorrectly done for the
|
|
Ian Kent |
ca38f0 |
write lock case instead of the read lock case.
|
|
Ian Kent |
ca38f0 |
---
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
CHANGELOG | 1 +
|
|
Ian Kent |
ca38f0 |
lib/master.c | 30 +++++++++++++++---------------
|
|
Ian Kent |
ca38f0 |
2 files changed, 16 insertions(+), 15 deletions(-)
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
diff --git a/CHANGELOG b/CHANGELOG
|
|
Ian Kent |
ca38f0 |
index 5b988d4..cac450f 100644
|
|
Ian Kent |
ca38f0 |
--- a/CHANGELOG
|
|
Ian Kent |
ca38f0 |
+++ b/CHANGELOG
|
|
Ian Kent |
ca38f0 |
@@ -9,6 +9,7 @@
|
|
Ian Kent |
ca38f0 |
- code analysis fixes part 1.
|
|
Ian Kent |
ca38f0 |
- fix not bind mounting local filesystem.
|
|
Ian Kent |
ca38f0 |
- add "dir" map-type.
|
|
Ian Kent |
ca38f0 |
+- fix wait for master source mutex.
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
28/06/2011 autofs-5.0.6
|
|
Ian Kent |
ca38f0 |
-----------------------
|
|
Ian Kent |
ca38f0 |
diff --git a/lib/master.c b/lib/master.c
|
|
Ian Kent |
ca38f0 |
index 6c89e1d..87d1269 100644
|
|
Ian Kent |
ca38f0 |
--- a/lib/master.c
|
|
Ian Kent |
ca38f0 |
+++ b/lib/master.c
|
|
Ian Kent |
ca38f0 |
@@ -540,38 +540,38 @@ void send_map_update_request(struct autofs_point *ap)
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
void master_source_writelock(struct master_mapent *entry)
|
|
Ian Kent |
ca38f0 |
{
|
|
Ian Kent |
ca38f0 |
- int retries = 5; /* 1 second maximum */
|
|
Ian Kent |
ca38f0 |
int status;
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
- while (retries--) {
|
|
Ian Kent |
ca38f0 |
- status = pthread_rwlock_wrlock(&entry->source_lock);
|
|
Ian Kent |
ca38f0 |
- if (status != EAGAIN)
|
|
Ian Kent |
ca38f0 |
- break;
|
|
Ian Kent |
ca38f0 |
- else {
|
|
Ian Kent |
ca38f0 |
- struct timespec t = { 0, 200000000 };
|
|
Ian Kent |
ca38f0 |
- struct timespec r;
|
|
Ian Kent |
ca38f0 |
- while (nanosleep(&t, &r) == -1 && errno == EINTR)
|
|
Ian Kent |
ca38f0 |
- memcpy(&t, &r, sizeof(struct timespec));
|
|
Ian Kent |
ca38f0 |
- }
|
|
Ian Kent |
ca38f0 |
- }
|
|
Ian Kent |
ca38f0 |
-
|
|
Ian Kent |
ca38f0 |
+ status = pthread_rwlock_wrlock(&entry->source_lock);
|
|
Ian Kent |
ca38f0 |
if (status) {
|
|
Ian Kent |
ca38f0 |
logmsg("master_mapent source write lock failed");
|
|
Ian Kent |
ca38f0 |
fatal(status);
|
|
Ian Kent |
ca38f0 |
}
|
|
Ian Kent |
ca38f0 |
-
|
|
Ian Kent |
ca38f0 |
return;
|
|
Ian Kent |
ca38f0 |
}
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
void master_source_readlock(struct master_mapent *entry)
|
|
Ian Kent |
ca38f0 |
{
|
|
Ian Kent |
ca38f0 |
+ int retries = 5; /* 1 second maximum */
|
|
Ian Kent |
ca38f0 |
int status;
|
|
Ian Kent |
ca38f0 |
|
|
Ian Kent |
ca38f0 |
- status = pthread_rwlock_rdlock(&entry->source_lock);
|
|
Ian Kent |
ca38f0 |
+ while (retries--) {
|
|
Ian Kent |
ca38f0 |
+ status = pthread_rwlock_tryrdlock(&entry->source_lock);
|
|
Ian Kent |
ca38f0 |
+ if (status != EAGAIN && status != EBUSY)
|
|
Ian Kent |
ca38f0 |
+ break;
|
|
Ian Kent |
ca38f0 |
+ else {
|
|
Ian Kent |
ca38f0 |
+ struct timespec t = { 0, 200000000 };
|
|
Ian Kent |
ca38f0 |
+ struct timespec r;
|
|
Ian Kent |
ca38f0 |
+ while (nanosleep(&t, &r) == -1 && errno == EINTR)
|
|
Ian Kent |
ca38f0 |
+ memcpy(&t, &r, sizeof(struct timespec));
|
|
Ian Kent |
ca38f0 |
+ }
|
|
Ian Kent |
ca38f0 |
+ }
|
|
Ian Kent |
ca38f0 |
+
|
|
Ian Kent |
ca38f0 |
if (status) {
|
|
Ian Kent |
ca38f0 |
logmsg("master_mapent source read lock failed");
|
|
Ian Kent |
ca38f0 |
fatal(status);
|
|
Ian Kent |
ca38f0 |
}
|
|
Ian Kent |
ca38f0 |
+
|
|
Ian Kent |
ca38f0 |
return;
|
|
Ian Kent |
ca38f0 |
}
|
|
Ian Kent |
ca38f0 |
|