autofs-5.1.3 - reset master map list on startup retry From: Ian Kent On autofs startup if automount thinks the master map read failed for some reason it retries the read after waiting for a fairly short delay. It should be ok to retry with the entries seen so far but there may be cases where that causes problems so release any existing master map entries before retrying. Signed-off-by: Ian Kent --- CHANGELOG | 1 + daemon/automount.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 6ac29220..c2145c8f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -27,6 +27,7 @@ xx/xx/2017 autofs-5.1.4 - document ghost option in auto.master man page. - only take master map mutex for master map update. - revert fix argc off by one in mount_autofs.c. +- reset master map list on startup retry. 24/05/2017 autofs-5.1.3 ======================= diff --git a/daemon/automount.c b/daemon/automount.c index fcef40b9..9fee67bb 100644 --- a/daemon/automount.c +++ b/daemon/automount.c @@ -2092,6 +2092,27 @@ static void remove_empty_args(char **argv, int *argc) *argc = j; } +static void do_master_list_reset(struct master *master) +{ + struct list_head *head, *p; + + master_mutex_lock(); + + head = &master->mounts; + list_for_each(p, head) { + struct master_mapent *entry; + + entry = list_entry(p, struct master_mapent, list); + + if (!list_empty(&entry->list)) + list_del(&entry->list); + master_free_mapent_sources(entry, 1); + master_free_mapent(entry); + } + + master_mutex_unlock(); +} + static int do_master_read_master(struct master *master, int wait) { sigset_t signalset; @@ -2111,6 +2132,8 @@ static int do_master_read_master(struct master *master, int wait) while (1) { struct timespec t = { retry_wait, 0 }; + do_master_list_reset(master); + age = monotonic_time(NULL); if (master_read_master(master, age, 0)) { ret = 1; @@ -2581,6 +2604,8 @@ int main(int argc, char *argv[]) * Failed to read master map, continue with what * we have anyway. */ + do_master_list_reset(master_list); + age = time(NULL); master_read_master(master_list, age, 1); } }