rpms/autofs/devel autofs-5.0.3-add-missing-uris-list-locking.patch, NONE, 1.1 autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch, NONE, 1.1 autofs-5.0.3-wait-submount-expire-complete.patch, NONE, 1.1 autofs.spec, 1.253, 1.254

Ian Kent iankent at fedoraproject.org
Thu Oct 23 03:24:47 UTC 2008


Author: iankent

Update of /cvs/pkgs/rpms/autofs/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv27234

Modified Files:
	autofs.spec 
Added Files:
	autofs-5.0.3-add-missing-uris-list-locking.patch 
	autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch 
	autofs-5.0.3-wait-submount-expire-complete.patch 
Log Message:
* Thu Oct 23 2008 Ian Kent <ikent at redhat.com> - 5.0.3-28
- don't close file handle for rootless direct mounti-mount at mount.
- wait submount expire thread completion when expire successful.
- add inadvertantly ommitted server list locking in LDAP module.


autofs-5.0.3-add-missing-uris-list-locking.patch:

--- NEW FILE autofs-5.0.3-add-missing-uris-list-locking.patch ---
autofs-5.0.3 - add missing uris list locking

From: Ian Kent <raven at themaw.net>

Add inadvertantly ommitted server list locking in LDAP module.
---

 include/lookup_ldap.h |    1 +
 modules/lookup_ldap.c |   39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 1 deletion(-)


--- autofs-5.0.3.orig/include/lookup_ldap.h
+++ autofs-5.0.3/include/lookup_ldap.h
@@ -54,6 +54,7 @@ struct lookup_context {
  	 * sdns is the list of basdns to check, done in the order
  	 * given in configuration.
  	 */
+	pthread_mutex_t uris_mutex;
 	struct list_head *uri;
 	char *cur_host;
 	struct ldap_searchdn *sdns;
--- autofs-5.0.3.orig/modules/lookup_ldap.c
+++ autofs-5.0.3/modules/lookup_ldap.c
@@ -122,6 +122,22 @@ int ldap_parse_page_control(LDAP *ldap, 
 }
 #endif /* HAVE_LDAP_PARSE_PAGE_CONTROL */
 
+static void uris_mutex_lock(struct lookup_context *ctxt)
+{
+	int status = pthread_mutex_lock(&ctxt->uris_mutex);
+	if (status)
+		fatal(status);
+	return;
+}
+
+static void uris_mutex_unlock(struct lookup_context *ctxt)
+{
+	int status = pthread_mutex_unlock(&ctxt->uris_mutex);
+	if (status)
+		fatal(status);
+	return;
+}
+
 int bind_ldap_anonymous(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt)
 {
 	int rv;
@@ -627,16 +643,20 @@ static LDAP *find_server(unsigned logopt
 	LIST_HEAD(tmp);
 
 	/* Try each uri in list, add connect fails to tmp list */
+	uris_mutex_lock(ctxt);
 	p = ctxt->uri->next;
 	while(p != ctxt->uri) {
 		this = list_entry(p, struct ldap_uri, list);
-		p = p->next;
+		uris_mutex_unlock(ctxt);
 		debug(logopt, "trying server %s", this->uri);
 		ldap = connect_to_server(logopt, this->uri, ctxt);
 		if (ldap) {
 			info(logopt, "connected to uri %s", this->uri);
+			uris_mutex_lock(ctxt);
 			break;
 		}
+		uris_mutex_lock(ctxt);
+		p = p->next;
 		list_del_init(&this->list);
 		list_add_tail(&this->list, &tmp);
 	}
@@ -648,6 +668,7 @@ static LDAP *find_server(unsigned logopt
 	list_splice(ctxt->uri, &tmp);
 	INIT_LIST_HEAD(ctxt->uri);
 	list_splice(&tmp, ctxt->uri);
+	uris_mutex_unlock(ctxt);
 
 	return ldap;
 }
@@ -662,14 +683,18 @@ static LDAP *do_reconnect(unsigned logop
 		return ldap;
 	}
 
+	uris_mutex_lock(ctxt);
 	this = list_entry(ctxt->uri->next, struct ldap_uri, list);
+	uris_mutex_unlock(ctxt);
 	ldap = do_connect(logopt, this->uri, ctxt);
 	if (ldap)
 		return ldap;
 
 	/* Failed to connect, put at end of list */
+	uris_mutex_lock(ctxt);
 	list_del_init(&this->list);
 	list_add_tail(&this->list, ctxt->uri);
+	uris_mutex_unlock(ctxt);
 
 #ifdef WITH_SASL
 	autofs_sasl_dispose(ctxt);
@@ -1203,6 +1228,8 @@ done:
 
 static void free_context(struct lookup_context *ctxt)
 {
+	int ret;
+
 	if (ctxt->schema) {
 		free(ctxt->schema->map_class);
 		free(ctxt->schema->map_attr);
@@ -1235,6 +1262,9 @@ static void free_context(struct lookup_c
 		free(ctxt->base);
 	if (ctxt->uri)
 		defaults_free_uris(ctxt->uri);
+	ret = pthread_mutex_destroy(&ctxt->uris_mutex);
+	if (ret)
+		fatal(ret);
 	if (ctxt->sdns)
 		defaults_free_searchdns(ctxt->sdns);
 	free(ctxt);
@@ -1286,6 +1316,13 @@ int lookup_init(const char *mapfmt, int 
 	}
 	memset(ctxt, 0, sizeof(struct lookup_context));
 
+	ret = pthread_mutex_init(&ctxt->uris_mutex, NULL);
+	if (ret) {
+		error(LOGOPT_ANY, MODPREFIX "failed to init uris mutex");
+		free(ctxt);
+		return 1;
+	}
+
 	/* If a map type isn't explicitly given, parse it like sun entries. */
 	if (mapfmt == NULL)
 		mapfmt = MAPFMT_DEFAULT;

autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch:

--- NEW FILE autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch ---
autofs-5.0.3 - don't close direct root

From: Ian Kent <raven at themaw.net>

For direct mount multi-mounts with no real mount at their base we
need to leave the file handle open so they will be expired. This
patch corrects the check done at mount completion to do this so
they will be expired.
---

 daemon/direct.c |   13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)


--- autofs-5.0.3.orig/daemon/direct.c
+++ autofs-5.0.3/daemon/direct.c
@@ -1311,8 +1311,17 @@ static void *do_mount_direct(void *arg)
 		    !master_find_submount(ap, mt.name)))
 			close_fd = 1;
 		cache_writelock(mt.mc);
-		if (!close_fd && (me = cache_lookup_distinct(mt.mc, mt.name)))
-			me->ioctlfd = mt.ioctlfd;
+		if ((me = cache_lookup_distinct(mt.mc, mt.name))) {
+			/*
+			 * Careful here, we need to leave the file handle open
+			 * for direct mount multi-mounts with no real mount at
+			 * their base so they will be expired.
+			 */
+			if (close_fd && me == me->multi)
+				close_fd = 0;
+			if (!close_fd)
+				me->ioctlfd = mt.ioctlfd;
+		}
 		send_ready(ap->logopt, mt.ioctlfd, mt.wait_queue_token);
 		cache_unlock(mt.mc);
 		if (close_fd)

autofs-5.0.3-wait-submount-expire-complete.patch:

--- NEW FILE autofs-5.0.3-wait-submount-expire-complete.patch ---
autofs-5.0.3 - wait submount expire complete

From: Ian Kent <raven at themaw.net>

When expiring a submount expires away and proceeds to shutdown we
can reach the end of the expire of the parent before the submount
goes away. This can cause an incomplete expire during shutdown in
some cases so, for the case the submount goes to state ST_SHUTDOWN,
we need to wait until the submount either goes away or fails to
shutdown before continuing.
---

 lib/master.c |   23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)


--- autofs-5.0.3.orig/lib/master.c
+++ autofs-5.0.3/lib/master.c
@@ -870,6 +870,29 @@ int master_notify_submount(struct autofs
 
 		st_wait_task(this, state, 0);
 
+		/*
+		 * If our submount gets to state ST_SHUTDOWN we need to
+		 * wait until it goes away or changes to ST_READY.
+		 */
+		mounts_mutex_lock(ap);
+		st_mutex_lock();
+		while ((this = __master_find_submount(ap, path))) {
+			struct timespec t = { 0, 300000000 };
+			struct timespec r;
+
+			if (this->state != ST_SHUTDOWN)
+				break;
+
+			st_mutex_unlock();
+			mounts_mutex_unlock(ap);
+			while (nanosleep(&t, &r) == -1 && errno == EINTR)
+				memcpy(&t, &r, sizeof(struct timespec));
+			mounts_mutex_lock(ap);
+			st_mutex_lock();
+		}
+		st_mutex_unlock();
+		mounts_mutex_unlock(ap);
+
 		return ret;
 
 	}


Index: autofs.spec
===================================================================
RCS file: /cvs/pkgs/rpms/autofs/devel/autofs.spec,v
retrieving revision 1.253
retrieving revision 1.254
diff -u -r1.253 -r1.254
--- autofs.spec	10 Oct 2008 08:55:18 -0000	1.253
+++ autofs.spec	23 Oct 2008 03:24:17 -0000	1.254
@@ -4,7 +4,7 @@
 Summary: A tool for automatically mounting and unmounting filesystems
 Name: autofs
 Version: 5.0.3
-Release: 26
+Release: 28
 Epoch: 1
 License: GPLv2+
 Group: System Environment/Daemons
@@ -62,6 +62,9 @@
 Patch50: autofs-5.0.3-map-type-in-map-name-fix.patch
 Patch51: autofs-5.0.3-dont-readmap-on-hup-for-new-mount.patch
 Patch52: autofs-5.0.3-nisplus-partial-and-free.patch
+Patch53: autofs-5.0.3-fix-rootless-direct-multi-mount-expire.patch
+Patch54: autofs-5.0.3-wait-submount-expire-complete.patch
+Patch55: autofs-5.0.3-add-missing-uris-list-locking.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
 Requires: kernel >= 2.6.17
@@ -155,6 +158,9 @@
 %patch50 -p1
 %patch51 -p1
 %patch52 -p1
+%patch53 -p1
+%patch54 -p1
+%patch55 -p1
 
 %build
 #CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir}
@@ -207,6 +213,11 @@
 %{_libdir}/autofs/
 
 %changelog
+* Thu Oct 23 2008 Ian Kent <ikent at redhat.com> - 5.0.3-28
+- don't close file handle for rootless direct mounti-mount at mount.
+- wait submount expire thread completion when expire successful.
+- add inadvertantly ommitted server list locking in LDAP module.
+
 * Fri Oct 10 2008 Ian Kent <ikent at redhat.com> - 5.0.3-26
 - add map-type-in-map-name fix patch to sync with upstream and RHEL.
 - don't readmap on HUP for new mount.




More information about the scm-commits mailing list