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