diff --git a/autofs-5.0.5-wait-for-master-map-available-at-start.patch b/autofs-5.0.5-wait-for-master-map-available-at-start.patch index 9e8b954..371a51d 100644 --- a/autofs-5.0.5-wait-for-master-map-available-at-start.patch +++ b/autofs-5.0.5-wait-for-master-map-available-at-start.patch @@ -8,11 +8,11 @@ so we can get a startup map. --- CHANGELOG | 1 + - daemon/automount.c | 22 +++++++++++++++++++++- + daemon/automount.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- daemon/lookup.c | 7 +++++++ - lib/master.c | 4 +++- + lib/master.c | 3 +++ modules/lookup_yp.c | 13 +++++++++---- - 5 files changed, 41 insertions(+), 6 deletions(-) + 5 files changed, 64 insertions(+), 5 deletions(-) --- autofs-5.0.5.orig/CHANGELOG @@ -27,29 +27,52 @@ so we can get a startup map. ----------------------- --- autofs-5.0.5.orig/daemon/automount.c +++ autofs-5.0.5/daemon/automount.c -@@ -1809,6 +1809,21 @@ static int convert_log_priority(char *pr +@@ -1809,6 +1809,44 @@ static int convert_log_priority(char *pr return -1; } -+static int do_master_read_master(struct master *master, time_t age, int readall) ++static int do_master_read_master(struct master *master, time_t age) +{ -+ while (1) { -+ struct timespec t = { 0, 500000000 }; ++ sigset_t signalset; ++ unsigned int max_wait = 180; ++ unsigned int retry_wait = 2; ++ unsigned int elapsed = 0; ++ int ret = 0; + -+ if (master_read_master(master, age, readall)) -+ return 1; ++ sigemptyset(&signalset); ++ sigaddset(&signalset, SIGTERM); ++ sigaddset(&signalset, SIGINT); ++ sigaddset(&signalset, SIGHUP); ++ sigprocmask(SIG_UNBLOCK, &signalset, NULL); ++ ++ while (1) { ++ struct timespec t = { retry_wait, 0 }; ++ ++ if (master_read_master(master, age, 0)) { ++ ret = 1; ++ break; ++ } + + if (nanosleep(&t, NULL) == -1) + break; ++ ++ elapsed += retry_wait; ++ if (elapsed >= max_wait) { ++ logmsg("problem reading master map, " ++ "maximum wait exceeded"); ++ break; ++ } + } + -+ return 0; ++ sigprocmask(SIG_BLOCK, &signalset, NULL); ++ ++ return ret; +} + int main(int argc, char *argv[]) { int res, opt, status; -@@ -2143,7 +2158,12 @@ int main(int argc, char *argv[]) +@@ -2143,7 +2181,12 @@ int main(int argc, char *argv[]) dh_tirpc = dlopen("libitirpc.so.1", RTLD_NOW); #endif @@ -59,7 +82,7 @@ so we can get a startup map. + * a signal is received, in which case exit returning an + * error. + */ -+ if (!do_master_read_master(master_list, age, 0)) { ++ if (!do_master_read_master(master_list, age)) { master_kill(master_list); *pst_stat = 3; res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); @@ -88,12 +111,12 @@ so we can get a startup map. --- autofs-5.0.5.orig/lib/master.c +++ autofs-5.0.5/lib/master.c -@@ -836,7 +836,9 @@ int master_read_master(struct master *ma +@@ -836,7 +836,10 @@ int master_read_master(struct master *ma master_mount_mounts(master, age, readall); else { master->read_fail = 0; -- if (!readall) -+ if (readall) ++ /* HUP signal sets readall == 1 only */ + if (!readall) + return 0; + else master_mount_mounts(master, age, readall); @@ -128,10 +151,10 @@ so we can get a startup map. mapname, yperr_string(err)); - if (err == YPERR_PMAP || err == YPERR_YPSERV) -+ if (err == YPERR_PMAP || err == YPERR_YPSERV) { -+ free(mapname); ++ free(mapname); ++ ++ if (err == YPERR_YPSERV || err == YPERR_DOMAIN) return NSS_STATUS_UNAVAIL; -+ } return NSS_STATUS_NOTFOUND; } diff --git a/autofs.spec b/autofs.spec index 70b8046..adb81bf 100644 --- a/autofs.spec +++ b/autofs.spec @@ -4,7 +4,7 @@ Summary: A tool for automatically mounting and unmounting filesystems Name: autofs Version: 5.0.5 -Release: 32%{?dist} +Release: 33%{?dist} Epoch: 1 License: GPLv2+ Group: System Environment/Daemons @@ -223,6 +223,9 @@ fi %{_libdir}/autofs/ %changelog +* Mon Nov 22 2010 Ian Kent - 1:5.0.5-33.fc15 +- fix wait for master map to be available at start. + * Fri Nov 8 2010 Ian Kent - 1:5.0.5-32.fc15 - always read file maps mount lookup map read fix. - fix direct map not updating on reread.