autofs-5.1.7 - fix amd section mounts map reload From: Ian Kent Master map section mounts (amd format mounts) get umounted on reload. Signed-off-by: Ian Kent --- CHANGELOG | 1 daemon/master.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 1 deletion(-) --- autofs-5.1.4.orig/CHANGELOG +++ autofs-5.1.4/CHANGELOG @@ -66,6 +66,7 @@ - refactor lookup_prune_one_cache() a bit. - cater for empty mounts list in mnts_get_expire_list(). - add ext_mount_hash_mutex lock helpers. +- fix amd section mounts map reload. xx/xx/2018 autofs-5.1.5 - fix flag file permission. --- autofs-5.1.4.orig/daemon/master.c +++ autofs-5.1.4/daemon/master.c @@ -882,6 +882,83 @@ struct master *master_new(const char *na return master; } +static void master_update_amd_mount_section_mount(struct master *master, + const char *path, time_t age) +{ + unsigned int m_logopt = master->logopt; + struct master_mapent *entry; + struct map_source *source; + unsigned int loglevel; + unsigned int logopt; + unsigned int flags; + time_t timeout; + char *map; + char *opts; + + entry = master_find_mapent(master, path); + if (!entry) + return; + + map = conf_amd_get_map_name(path); + if (!map) + return; + + /* amd top level mounts have only one map */ + source = entry->maps; + if (strcmp(source->name, map) != 0) { + struct map_source *new; + char *type; + char *argv[2]; + + type = conf_amd_get_map_type(path); + argv[0] = map; + argv[1] = NULL; + + new = master_add_map_source(entry, type, "amd", + age, 1, (const char **) argv); + if (!new) { + error(m_logopt, + "failed to add source for amd section mount %s", + path); + if (type) + free(type); + goto out; + } + master_free_map_source(source, 0); + entry->maps = new; + source = new; + if (type) + free(type); + } + + loglevel = conf_amd_get_log_options(); + logopt = m_logopt; + if (loglevel <= LOG_DEBUG && loglevel > LOG_INFO) + logopt = LOGOPT_DEBUG; + else if (loglevel <= LOG_INFO && loglevel > LOG_ERR) + logopt = LOGOPT_VERBOSE; + + flags = conf_amd_get_flags(path); + if (flags & CONF_BROWSABLE_DIRS) + entry->ap->flags |= MOUNT_FLAG_GHOST; + + opts = conf_amd_get_map_options(path); + if (opts) { + if (strstr(opts, "cache:=all")) + entry->ap->flags |= MOUNT_FLAG_AMD_CACHE_ALL; + free(opts); + } + + entry->ap->logopt = logopt; + + timeout = conf_amd_get_dismount_interval(path); + set_exp_timeout(entry->ap, source, timeout); + source->master_line = 0; + entry->age = age; +out: + free(map); +} + static void master_add_amd_mount_section_mounts(struct master *master, time_t age) { unsigned int m_logopt = master->logopt; @@ -916,8 +993,10 @@ static void master_add_amd_mount_section * master map it's not a duplicate, don't issue * an error message. */ - if (ret == 1) + if (ret == 1) { + master_update_amd_mount_section_mount(master, path, age); goto next; + } info(m_logopt, "amd section mount path conflict, %s ignored", path);