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