From a2613263d4af462a41683ff56ea246199c47f9ff Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Feb 05 2018 04:32:24 +0000 Subject: - use_hostname_for_mounts shouldn't prevent selection among replicas. - fix monotonic_elapse. - Makefiles.rules: remove 'samples' from SUBDIRS. --- diff --git a/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch b/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch new file mode 100644 index 0000000..e5ef39c --- /dev/null +++ b/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch @@ -0,0 +1,66 @@ +autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS + +From: NeilBrown + +The rules in Makefile make it quite clear that +'samples' is not expected to be part of SUBDIRS. +e.g. + - The rule for "clean" handles both $(SUBDIRS) *and* samples. + - There are separate "install" and "install_samples" targets. + +However SUBDIRS does contain 'samples'. This means that +a simple "make; make install" will over-write your configuration files. + +So remove 'samples' from SUBDIRS. Note that it has been removed in +the past, but then got added back again. + +Signed-off-by: NeilBrown +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + Makefile.rules | 2 +- + autofs.spec | 6 ++++++ + 3 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 313730b1..1e5ec15b 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5 + - account for recent libnsl changes. + - use_hostname_for_mounts shouldn't prevent selection among replicas. + - fix monotonic_elapsed. ++- Makefiles.rules: remove 'samples' from SUBDIRS. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/Makefile.rules b/Makefile.rules +index 2bfa043c..4deab3b9 100644 +--- a/Makefile.rules ++++ b/Makefile.rules +@@ -3,7 +3,7 @@ + # + + # Root directory contents +-SUBDIRS = lib daemon modules man samples ++SUBDIRS = lib daemon modules man + INCDIRS = include + INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ + Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ +diff --git a/autofs.spec b/autofs.spec +index 6da0655d..57d8db46 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -121,6 +121,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs + install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf + install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs + ++install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master ++install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc ++install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net ++install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb ++install -m 644 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf ++ + %clean + [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + diff --git a/autofs-5.1.4-fix-monotonic_elapsed.patch b/autofs-5.1.4-fix-monotonic_elapsed.patch new file mode 100644 index 0000000..17c5a6e --- /dev/null +++ b/autofs-5.1.4-fix-monotonic_elapsed.patch @@ -0,0 +1,49 @@ +autofs-5.1.4 - fix monotonic_elapsed + +From: NeilBrown + +When automount probes multiple hosts to find the one which +responds most quickly, it currently ignores the nanoseconds. +This often makes the cost "0", which makes weights ineffective. + +The cause is that monotonic_elapsed() casts tv_nsec to a +double *after* dividing by 1 billion, rather than before. + +With this change, weights become effective for choosing +between hosts which respond in under one second. + +Signed-off-by: NeilBrown +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/rpc_subs.c | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 104fca90..313730b1 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5 + - add error handling for ext_mount_add(). + - account for recent libnsl changes. + - use_hostname_for_mounts shouldn't prevent selection among replicas. ++- fix monotonic_elapsed. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c +index 73097c9d..60ede9f8 100644 +--- a/lib/rpc_subs.c ++++ b/lib/rpc_subs.c +@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end) + double t1, t2; + + t1 = (double) start.tv_sec + +- (double) (start.tv_nsec/(1000*1000*1000)); ++ ((double) start.tv_nsec/(1000*1000*1000)); + t2 = (double) end.tv_sec + +- (double) (end.tv_nsec/(1000*1000*1000)); ++ ((double) end.tv_nsec/(1000*1000*1000)); + return t2 - t1; + } + diff --git a/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch b/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch new file mode 100644 index 0000000..f398e45 --- /dev/null +++ b/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch @@ -0,0 +1,226 @@ +autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas + +From: NeilBrown + +If several replicas have been specified for a mount point, +and use_hostname_for_mount is set to "yes", the selection +between these replicas is currently disabled and the last in +the list is always chosen. + +There is little point selecting between different addresses +for the one host in this case, but it is still worth +selecting between different hosts, particularly if different +weights have been specified. + +This patch restores the "prune_host_list()" functionality +when use_hostname_for_mount is set, and modifies it slightly +so that only on IP address for any host:/path entry in the +config file is willl be successfully probed. After a +success, further addresses from the same entry are skipped. +This is achieved by tracking an entry number ("ent_num") for +each 'struct host'. + +Signed-off-by: NeilBrown +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + include/replicated.h | 3 ++- + modules/mount_nfs.c | 2 +- + modules/replicated.c | 35 ++++++++++++++++++++--------------- + 4 files changed, 24 insertions(+), 17 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 2d5d5b1f..104fca90 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5 + - fix error return in do_nfs_mount(). + - add error handling for ext_mount_add(). + - account for recent libnsl changes. ++- use_hostname_for_mounts shouldn't prevent selection among replicas. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/include/replicated.h b/include/replicated.h +index 69ab7800..0f482d21 100644 +--- a/include/replicated.h ++++ b/include/replicated.h +@@ -57,6 +57,7 @@ + + struct host { + char *name; ++ int ent_num; + struct sockaddr *addr; + size_t addr_len; + unsigned int rr; +@@ -70,7 +71,7 @@ struct host { + }; + + void seed_random(void); +-struct host *new_host(const char *, struct sockaddr *, size_t, ++struct host *new_host(const char *, int, struct sockaddr *, size_t, + unsigned int, unsigned int, unsigned int); + void free_host_list(struct host **); + int parse_location(unsigned, struct host **, const char *, unsigned int); +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index 77166544..4cf0cd27 100644 +--- a/modules/mount_nfs.c ++++ b/modules/mount_nfs.c +@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + (vers & NFS4_VERS_MASK) != 0 && + !(vers & UDP6_REQUESTED)) { + unsigned int v4_probe_ok = 0; +- struct host *tmp = new_host(hosts->name, ++ struct host *tmp = new_host(hosts->name, 0, + hosts->addr, hosts->addr_len, + hosts->proximity, + hosts->weight, hosts->options); +diff --git a/modules/replicated.c b/modules/replicated.c +index 3ac4c70f..f7b83236 100644 +--- a/modules/replicated.c ++++ b/modules/replicated.c +@@ -83,7 +83,7 @@ void seed_random(void) + return; + } + +-struct host *new_host(const char *name, ++struct host *new_host(const char *name, int ent_num, + struct sockaddr *addr, size_t addr_len, + unsigned int proximity, unsigned int weight, + unsigned int options) +@@ -116,6 +116,7 @@ struct host *new_host(const char *name, + memset(new, 0, sizeof(struct host)); + + new->name = tmp1; ++ new->ent_num = ent_num; + new->addr_len = addr_len; + new->addr = tmp2; + new->proximity = proximity; +@@ -714,7 +715,7 @@ done: + int prune_host_list(unsigned logopt, struct host **list, + unsigned int vers, int port) + { +- struct host *this, *last, *first; ++ struct host *this, *last, *first, *prev; + struct host *new = NULL; + unsigned int proximity, selected_version = 0; + unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count; +@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list, + if (!*list) + return 0; + +- /* If we're using the host name then there's no point probing +- * avialability and respose time. +- */ +- if (defaults_use_hostname_for_mounts()) +- return 1; +- + /* Use closest hosts to choose NFS version */ + + first = *list; +@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list, + + first = last; + this = first; ++ prev = NULL; + while (this) { + struct host *next = this->next; + if (!this->name) { + remove_host(list, this); + add_host(&new, this); ++ } else if (defaults_use_hostname_for_mounts() && prev && ++ prev->ent_num == this->ent_num) { ++ /* When we use the hostname to mount, there is no ++ * point in probing every address it has, just one is ++ * enough. Skip the rest. ++ */ + } else { + status = get_supported_ver_and_cost(logopt, this, + selected_version, port); +@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list, + this->version = selected_version; + remove_host(list, this); + add_host(&new, this); ++ prev = this; + } + } + this = next; +@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list, + } + + static int add_new_host(struct host **list, +- const char *host, unsigned int weight, ++ const char *host, int ent_num, unsigned int weight, + struct addrinfo *host_addr, + unsigned int rr, unsigned int options) + { +@@ -940,7 +943,7 @@ static int add_new_host(struct host **list, + else + return 0; + +- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options); ++ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options); + if (!new) + return 0; + +@@ -953,7 +956,7 @@ static int add_new_host(struct host **list, + return 1; + } + +-static int add_host_addrs(struct host **list, const char *host, ++static int add_host_addrs(struct host **list, const char *host, int ent_num, + unsigned int weight, unsigned int options) + { + struct addrinfo hints, *ni, *this; +@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host, + + this = ni; + while (this) { +- ret = add_new_host(list, host, weight, this, 0, options); ++ ret = add_new_host(list, host, ent_num, weight, this, 0, options); + if (!ret) + break; + this = this->ai_next; +@@ -1027,7 +1030,7 @@ try_name: + rr++; + this = ni; + while (this) { +- ret = add_new_host(list, host, weight, this, rr, options); ++ ret = add_new_host(list, host, ent_num, weight, this, rr, options); + if (!ret) + break; + this = this->ai_next; +@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts, + { + char *str, *p, *delim; + unsigned int empty = 1; ++ int ent_num = 1; + + if (!list) + return 0; +@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts, + } + + if (p != delim) { +- if (!add_host_addrs(hosts, p, weight, options)) { ++ if (!add_host_addrs(hosts, p, ent_num, weight, options)) { + if (empty) { + p = next; + continue; +@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts, + *delim = '\0'; + next = delim + 1; + +- if (!add_host_addrs(hosts, p, weight, options)) { ++ if (!add_host_addrs(hosts, p, ent_num, weight, options)) { + p = next; + continue; + } +@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts, + return 0; + } + ++ ent_num++; + p = next; + } + diff --git a/autofs.spec b/autofs.spec index 38cee3b..36bf57f 100644 --- a/autofs.spec +++ b/autofs.spec @@ -23,6 +23,9 @@ Patch7: autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch Patch8: autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch Patch9: autofs-5.1.4-add-error-handling-for-ext_mount_add.patch Patch10: autofs-5.1.4-account-for-libnsl-changes.patch +Patch11: autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch +Patch12: autofs-5.1.4-fix-monotonic_elapsed.patch +Patch13: autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -94,6 +97,9 @@ echo %{version}-%{release} > .version %patch8 -p1 %patch9 -p1 %patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 %build LDFLAGS=-Wl,-z,now @@ -129,6 +135,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT%{_initrddir}/autofs install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs +install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master +install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc +install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net +install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb +install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf + %clean rm -rf $RPM_BUILD_ROOT @@ -190,6 +202,9 @@ fi * Mon Feb 5 2018 Ian Kent - 1:5.1.4-7 - add error handling for ext_mount_add(). - account for recent libnsl changes. +- use_hostname_for_mounts shouldn't prevent selection among replicas. +- fix monotonic_elapse. +- Makefiles.rules: remove 'samples' from SUBDIRS. * Thu Feb 1 2018 Ian Kent - 1:5.1.4-6 - dont use array for path when not necessary.