rpms/autofs/F-11 autofs-5.0.4-fix-direct-map-cache-locking.patch, NONE, 1.1 autofs-5.0.4-fix-dont-umount-existing-direct-mount-on-reread.patch, NONE, 1.1 autofs-5.0.4-fix-libxml2-non-thread-safe-calls.patch, NONE, 1.1 autofs.spec, 1.287, 1.288

Ian Kent iankent at fedoraproject.org
Thu Sep 3 08:32:47 UTC 2009


Author: iankent

Update of /cvs/pkgs/rpms/autofs/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv8364

Modified Files:
	autofs.spec 
Added Files:
	autofs-5.0.4-fix-direct-map-cache-locking.patch 
	autofs-5.0.4-fix-dont-umount-existing-direct-mount-on-reread.patch 
	autofs-5.0.4-fix-libxml2-non-thread-safe-calls.patch 
Log Message:
* Thu Sep 3 2009 Ian Kent <ikent at redhat.com> - 1:5.0.4-38
- fix libxml2 non-thread-safe calls.
- fix direct map cache locking.
- fix patch "dont umount existing direct mount on reread" deadlock.


autofs-5.0.4-fix-direct-map-cache-locking.patch:
 CHANGELOG       |    1 +
 daemon/direct.c |    6 ++++++
 2 files changed, 7 insertions(+)

--- NEW FILE autofs-5.0.4-fix-direct-map-cache-locking.patch ---
autofs-5.0.4 - fix direct map cache locking

From: Ian Kent <raven at themaw.net>

Some time during the recent round of updates some locking of the
null map and the direct map entry caches was removed. This patch
adds it back again.
---

 CHANGELOG       |    1 +
 daemon/direct.c |    6 ++++++
 2 files changed, 7 insertions(+), 0 deletions(-)


diff --git a/CHANGELOG b/CHANGELOG
index af7792d..82ebc83 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -60,6 +60,7 @@
 - don't block signals we expect to dump core.
 - fix pthread push order in expire_proc_direct().
 - fix libxml2 non-thread-safe calls.
+- fix direct map cache locking.
 
 4/11/2008 autofs-5.0.4
 -----------------------
diff --git a/daemon/direct.c b/daemon/direct.c
index 0f33d03..0c78627 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -470,6 +470,8 @@ int mount_autofs_direct(struct autofs_point *ap)
 	pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
 	master_source_readlock(ap->entry);
 	nc = ap->entry->master->nc;
+	cache_readlock(nc);
+	pthread_cleanup_push(cache_lock_cleanup, nc);
 	map = ap->entry->maps;
 	while (map) {
 		/*
@@ -482,6 +484,8 @@ int mount_autofs_direct(struct autofs_point *ap)
 		}
 
 		mc = map->mc;
+		cache_readlock(mc);
+		pthread_cleanup_push(cache_lock_cleanup, mc);
 		me = cache_enumerate(mc, NULL);
 		while (me) {
 			ne = cache_lookup_distinct(nc, me->key);
@@ -509,10 +513,12 @@ int mount_autofs_direct(struct autofs_point *ap)
 
 			me = cache_enumerate(mc, me);
 		}
+		pthread_cleanup_pop(1);
 		map = map->next;
 	}
 	pthread_cleanup_pop(1);
 	pthread_cleanup_pop(1);
+	pthread_cleanup_pop(1);
 
 	return 0;
 }

autofs-5.0.4-fix-dont-umount-existing-direct-mount-on-reread.patch:
 CHANGELOG      |    1 +
 daemon/state.c |   10 ++++++++++
 2 files changed, 11 insertions(+)

--- NEW FILE autofs-5.0.4-fix-dont-umount-existing-direct-mount-on-reread.patch ---
autofs-5.0.4 - fix dont umount existing direct mount on reread

From: Ian Kent <raven at themaw.net>

A recent problem where we incorrectly umounted direct mounts on map
re-read, when the map name in the master map has changed, checks for
the stale entry in an old map source and updates the new entry from
information in the the stale entry. But this check can also match
an entry that has been removed from a direct map whose name hasn't
changed which leads to a deadlock when we try and take the cache
write lock on the (alleged) stale cache to update the new entry.
This is because, in this case, the cache we want to lock is in
fact the one we are reading and we already hold a read lock on it.
---

 CHANGELOG      |    1 +
 daemon/state.c |   10 ++++++++++
 2 files changed, 11 insertions(+), 0 deletions(-)


diff --git a/CHANGELOG b/CHANGELOG
index 82ebc83..929a21f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -61,6 +61,7 @@
 - fix pthread push order in expire_proc_direct().
 - fix libxml2 non-thread-safe calls.
 - fix direct map cache locking.
+- fix dont umount existing direct mount on reread.
 
 4/11/2008 autofs-5.0.4
 -----------------------
diff --git a/daemon/state.c b/daemon/state.c
index 84ccba3..71af46a 100644
--- a/daemon/state.c
+++ b/daemon/state.c
@@ -389,6 +389,16 @@ static void do_readmap_mount(struct autofs_point *ap, struct mnt_list *mnts,
 		 * an empty cache awaiting a map re-load.
 		 */
 		valid = lookup_source_valid_mapent(ap, me->key, LKP_DISTINCT);
+		if (valid && valid->mc == me->mc) {
+			/*
+			 * We've found a map entry that has been removed from
+			 * the current cache so there is no need to update it.
+			 * The stale entry will be dealt with when we prune the
+			 * cache later.
+			 */
+			cache_unlock(valid->mc);
+			valid = NULL;
+		}
 		if (valid) {
 			struct mapent_cache *vmc = valid->mc;
 			cache_unlock(vmc);

autofs-5.0.4-fix-libxml2-non-thread-safe-calls.patch:
 CHANGELOG             |    1 +
 daemon/Makefile       |    7 +++++++
 daemon/automount.c    |    7 ++++++-
 modules/lookup_ldap.c |    2 --
 4 files changed, 14 insertions(+), 3 deletions(-)

--- NEW FILE autofs-5.0.4-fix-libxml2-non-thread-safe-calls.patch ---
autofs-5.0.4 - fix libxml2 non-thread-safe calls

From: Ian Kent <raven at themaw.net>

The libxml2 call xmlCleanupParser() is definitely not thread safe.
This patch moves it and the xmlInitParser() call to the location
of the code to workaround the libxml2 incorrect TSD handling so
they are called only at start and at exit.
---

 CHANGELOG             |    1 +
 daemon/Makefile       |    7 +++++++
 daemon/automount.c    |    7 ++++++-
 modules/lookup_ldap.c |    2 --
 4 files changed, 14 insertions(+), 3 deletions(-)


diff --git a/CHANGELOG b/CHANGELOG
index 4491449..af7792d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -59,6 +59,7 @@
 - fix an RPC fd leak.
 - don't block signals we expect to dump core.
 - fix pthread push order in expire_proc_direct().
+- fix libxml2 non-thread-safe calls.
 
 4/11/2008 autofs-5.0.4
 -----------------------
diff --git a/daemon/Makefile b/daemon/Makefile
index 9c2d858..371ec72 100644
--- a/daemon/Makefile
+++ b/daemon/Makefile
@@ -22,6 +22,13 @@ CFLAGS += -DVERSION_STRING=\"$(version)\"
 LDFLAGS += -rdynamic
 LIBS = -ldl
 
+ifeq ($(LDAP), 1)
+  ifeq ($(SASL), 1)
+    CFLAGS += $(XML_FLAGS)
+    LIBS += $(XML_LIBS)
+  endif
+endif
+
 all: automount
 
 automount: $(OBJS) $(AUTOFS_LIB)
diff --git a/daemon/automount.c b/daemon/automount.c
index 6759883..979ecd6 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -40,6 +40,7 @@
 #include "automount.h"
 #ifdef LIBXML2_WORKAROUND
 #include <dlfcn.h>
+#include <libxml/parser.h>
 #endif
 
 const char *program;		/* Initialized with argv[0] */
@@ -2113,6 +2114,8 @@ int main(int argc, char *argv[])
 	void *dh_xml2 = dlopen("libxml2.so", RTLD_NOW);
 	if (!dh_xml2)
 		dh_xml2 = dlopen("libxml2.so.2", RTLD_NOW);
+	if (dh_xml2)
+		xmlInitParser();
 #endif
 #ifdef TIRPC_WORKAROUND
 	void *dh_tirpc = dlopen("libitirpc.so", RTLD_NOW);
@@ -2156,8 +2159,10 @@ int main(int argc, char *argv[])
 		dlclose(dh_tirpc);
 #endif
 #ifdef LIBXML2_WORKAROUND
-	if (dh_xml2)
+	if (dh_xml2) {
+		xmlCleanupParser();
 		dlclose(dh_xml2);
+	}
 #endif
 	close_ioctl_ctl();
 
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
index 8f352d6..2ecf5fe 100644
--- a/modules/lookup_ldap.c
+++ b/modules/lookup_ldap.c
@@ -897,7 +897,6 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
 		return -1;
 	}
 
-	xmlInitParser();
 	doc = xmlParseFile(auth_conf);
 	if (!doc) {
 		error(logopt, MODPREFIX
@@ -1069,7 +1068,6 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
 
 out:
 	xmlFreeDoc(doc);
-	xmlCleanupParser();
 
 	if (fallback)
 		return 0;


Index: autofs.spec
===================================================================
RCS file: /cvs/pkgs/rpms/autofs/F-11/autofs.spec,v
retrieving revision 1.287
retrieving revision 1.288
diff -u -p -r1.287 -r1.288
--- autofs.spec	17 Jul 2009 01:49:31 -0000	1.287
+++ autofs.spec	3 Sep 2009 08:32:46 -0000	1.288
@@ -4,7 +4,7 @@
 Summary: A tool for automatically mounting and unmounting filesystems
 Name: autofs
 Version: 5.0.4
-Release: 36
+Release: 38
 Epoch: 1
 License: GPLv2+
 Group: System Environment/Daemons
@@ -72,6 +72,9 @@ Patch59: autofs-5.0.4-fix-map-type-info-
 Patch60: autofs-5.0.4-fix-rpc-fd-leak.patch
 Patch61: autofs-5.0.4-allow-automount-daemon-to-dump-core.patch
 Patch62: autofs-5.0.4-fix-pthread-push-order-in-expire_proc_direct.patch
+Patch63: autofs-5.0.4-fix-libxml2-non-thread-safe-calls.patch
+Patch64: autofs-5.0.4-fix-direct-map-cache-locking.patch
+Patch65: autofs-5.0.4-fix-dont-umount-existing-direct-mount-on-reread.patch
 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, libxml2-devel, cyrus-sasl-devel, openssl-devel module-init-tools util-linux nfs-utils e2fsprogs libtirpc-devel
 Requires: kernel >= 2.6.17
@@ -175,6 +178,9 @@ echo %{version}-%{release} > .version
 %patch60 -p1
 %patch61 -p1
 %patch62 -p1
+%patch63 -p1
+%patch64 -p1
+%patch65 -p1
 
 %build
 #CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir}
@@ -227,6 +233,11 @@ fi
 %{_libdir}/autofs/
 
 %changelog
+* Thu Sep 3 2009 Ian Kent <ikent at redhat.com> - 1:5.0.4-38
+- fix libxml2 non-thread-safe calls.
+- fix direct map cache locking.
+- fix patch "dont umount existing direct mount on reread" deadlock.
+
 * Fri Jul 17 2009 Ian Kent <ikent at redhat.com> - 1:5.0.4-36
 - fix typo in patch to allow dumping core.
 




More information about the fedora-extras-commits mailing list