Ian Kent 5ec16e
autofs-5.0.6 - reinstate singleton mount probe
Ian Kent 5ec16e
Ian Kent 5ec16e
From: Ian Kent <ikent@redhat.com>
Ian Kent 5ec16e
Ian Kent 5ec16e
The change to have the kernel process text based mount options can
Ian Kent 5ec16e
introduce lengthy timeout waits when attempting a mount to a host
Ian Kent 5ec16e
that is not available.
Ian Kent 5ec16e
Ian Kent 5ec16e
To avoid these waits autofs should probe singleton mounts if it
Ian Kent 5ec16e
thinks mount.nfs will pass text options to the kernel (which of
Ian Kent 5ec16e
course implies the kernel supports this).
Ian Kent 5ec16e
---
Ian Kent 5ec16e
Ian Kent 5ec16e
 CHANGELOG            |    1 +
Ian Kent 5ec16e
 daemon/automount.c   |    7 +++++++
Ian Kent 5ec16e
 include/mounts.h     |    1 +
Ian Kent 5ec16e
 modules/replicated.c |   18 ++++++++++++++++--
Ian Kent 5ec16e
 4 files changed, 25 insertions(+), 2 deletions(-)
Ian Kent 5ec16e
Ian Kent 5ec16e
Ian Kent 5ec16e
--- autofs-5.0.6.orig/CHANGELOG
Ian Kent 5ec16e
+++ autofs-5.0.6/CHANGELOG
Ian Kent 5ec16e
@@ -26,6 +26,7 @@
Ian Kent 5ec16e
 - ignore duplicate exports in auto.net.
Ian Kent 5ec16e
 - add kernel verion check function.
Ian Kent 5ec16e
 - add function to check mount.nfs version.
Ian Kent 5ec16e
+- reinstate singleton mount probe.
Ian Kent 5ec16e
 
Ian Kent 5ec16e
 28/06/2011 autofs-5.0.6
Ian Kent 5ec16e
 -----------------------
Ian Kent 5ec16e
--- autofs-5.0.6.orig/daemon/automount.c
Ian Kent 5ec16e
+++ autofs-5.0.6/daemon/automount.c
Ian Kent 5ec16e
@@ -51,6 +51,9 @@ const char *libdir = AUTOFS_LIB_DIR;	/*
Ian Kent 5ec16e
 const char *mapdir = AUTOFS_MAP_DIR;	/* Location of mount maps */
Ian Kent 5ec16e
 const char *confdir = AUTOFS_CONF_DIR;	/* Location of autofs config file */
Ian Kent 5ec16e
 
Ian Kent 5ec16e
+unsigned int nfs_mount_uses_string_options = 0;
Ian Kent 5ec16e
+static struct nfs_mount_vers vers, check = {1, 1, 1};
Ian Kent 5ec16e
+
Ian Kent 5ec16e
 /* autofs fifo name prefix */
Ian Kent 5ec16e
 const char *fifodir = AUTOFS_FIFO_DIR "/autofs.fifo";
Ian Kent 5ec16e
 
Ian Kent 5ec16e
@@ -1273,6 +1276,8 @@ static int do_hup_signal(struct master *
Ian Kent 5ec16e
 	if (status)
Ian Kent 5ec16e
 		fatal(status);
Ian Kent 5ec16e
 
Ian Kent 5ec16e
+	nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check);
Ian Kent 5ec16e
+
Ian Kent 5ec16e
 	master_mutex_lock();
Ian Kent 5ec16e
 	if (master->reading) {
Ian Kent 5ec16e
 		status = pthread_mutex_unlock(&mrc.mutex);
Ian Kent 5ec16e
@@ -1936,6 +1941,8 @@ int main(int argc, char *argv[])
Ian Kent 5ec16e
 
Ian Kent 5ec16e
 	defaults_read_config(0);
Ian Kent 5ec16e
 
Ian Kent 5ec16e
+	nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check);
Ian Kent 5ec16e
+
Ian Kent 5ec16e
 	kpkt_len = get_kpkt_len();
Ian Kent 5ec16e
 	timeout = defaults_get_timeout();
Ian Kent 5ec16e
 	ghost = defaults_get_browse_mode();
Ian Kent 5ec16e
--- autofs-5.0.6.orig/include/mounts.h
Ian Kent 5ec16e
+++ autofs-5.0.6/include/mounts.h
Ian Kent 5ec16e
@@ -95,6 +95,7 @@ struct nfs_mount_vers {
Ian Kent 5ec16e
 	unsigned int fix;
Ian Kent 5ec16e
 };
Ian Kent 5ec16e
 int check_nfs_mount_version(struct nfs_mount_vers *, struct nfs_mount_vers *);
Ian Kent 5ec16e
+extern unsigned int nfs_mount_uses_string_options;
Ian Kent 5ec16e
 
Ian Kent 5ec16e
 unsigned int query_kproto_ver(void);
Ian Kent 5ec16e
 unsigned int get_kver_major(void);
Ian Kent 5ec16e
--- autofs-5.0.6.orig/modules/replicated.c
Ian Kent 5ec16e
+++ autofs-5.0.6/modules/replicated.c
Ian Kent 5ec16e
@@ -901,6 +901,7 @@ int prune_host_list(unsigned logopt, str
Ian Kent 5ec16e
 	unsigned int v2_udp_count, v3_udp_count, v4_udp_count;
Ian Kent 5ec16e
 	unsigned int max_udp_count, max_tcp_count, max_count;
Ian Kent 5ec16e
 	int status;
Ian Kent 5ec16e
+	int kern_vers;
Ian Kent 5ec16e
 
Ian Kent 5ec16e
 	if (!*list)
Ian Kent 5ec16e
 		return 0;
Ian Kent 5ec16e
@@ -920,9 +921,22 @@ int prune_host_list(unsigned logopt, str
Ian Kent 5ec16e
 	 * or a single host entry whose proximity isn't local. If so
Ian Kent 5ec16e
 	 * return immediately as we don't want to add probe latency for
Ian Kent 5ec16e
 	 * the common case of a single filesystem mount request.
Ian Kent 5ec16e
+	 *
Ian Kent 5ec16e
+	 * But, if the kernel understands text nfs mount options then
Ian Kent 5ec16e
+	 * mount.nfs most likely bypasses its probing and lets the kernel
Ian Kent 5ec16e
+	 * do all the work. This can lead to long timeouts for hosts that
Ian Kent 5ec16e
+	 * are not available so check the kernel version and mount.nfs
Ian Kent 5ec16e
+	 * version and probe singleton mounts if the kernel version is
Ian Kent 5ec16e
+	 * greater than 2.6.22 and mount.nfs version is greater than 1.1.1.
Ian Kent 5ec16e
 	 */
Ian Kent 5ec16e
-	if (!this || !this->next)
Ian Kent 5ec16e
-		return 1;
Ian Kent 5ec16e
+	if (nfs_mount_uses_string_options &&
Ian Kent 5ec16e
+	   (kern_vers = linux_version_code()) > KERNEL_VERSION(2, 6, 22)) {
Ian Kent 5ec16e
+		if (!this)
Ian Kent 5ec16e
+			return 1;
Ian Kent 5ec16e
+	} else {
Ian Kent 5ec16e
+		if (!this || !this->next)
Ian Kent 5ec16e
+			return 1;
Ian Kent 5ec16e
+	}
Ian Kent 5ec16e
 
Ian Kent 5ec16e
 	proximity = this->proximity;
Ian Kent 5ec16e
 	while (this) {