autofs-5.1.9 - eliminate master map parameter where possible

From: Ian Kent <raven@themaw.net>

The master map parameter is redundant in a number of cases and could
lead to confusion or possibly introduce unnecessary dependancies.

There can only be one master map list so remove function paramaters
where possible.

Signed-off-by: Ian Kent <raven@themaw.net>
---
 CHANGELOG              |    1 
 daemon/automount.c     |  127 ++++++++++++++++++++++++------------------------
 daemon/master.c        |  103 +++++++++++++++++++++++----------------
 daemon/master_parse.y  |   11 ++--
 include/automount.h    |    1 
 include/master.h       |   29 ++++++-----
 modules/mount_autofs.c |    5 --
 7 files changed, 146 insertions(+), 131 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 97416f80d..39b8a0d71 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -61,6 +61,7 @@
 - add missing cache_unlock() in umount_subtree_mounts().
 - move open close on exec functions to autofs library.
 - fix locking when setting master map reading.
+- eliminate master map parameter where possible.
 
 02/11/2023 autofs-5.1.9
 - fix kernel mount status notification.
diff --git a/daemon/automount.c b/daemon/automount.c
index ee43c823d..c48ec9831 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -103,7 +103,7 @@ pthread_attr_t th_attr;
 pthread_attr_t th_attr_detached;
 
 struct master_readmap_cond mrc = {
-	PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, NULL, 0, 0, 0, 0};
+	PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0, 0, 0, 0};
 
 struct startup_cond suc = {
 	PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0};
@@ -114,8 +114,6 @@ pthread_key_t key_thread_attempt_id = (pthread_key_t) 0L;
 int aquire_flag_file(void);
 void release_flag_file(void);
 
-extern struct master *master_list;
-
 /* simple string hash based on public domain sdbm library */
 static unsigned long sdbm_hash(const char *str, unsigned long seed)
 {
@@ -1141,7 +1139,7 @@ static void do_master_cleanup_unlock(void *arg)
 
 static void *do_notify_state(void *arg)
 {
-	struct master *master;
+	unsigned int logopt = master_get_logopt();
 	int sig;
 	int status;
 
@@ -1151,14 +1149,12 @@ static void *do_notify_state(void *arg)
 	if (status)
 		fatal(status);
 
-	master = mrc.master;
-
-	debug(master->logopt, "signal %d", sig);
+	debug(logopt, "signal %d", sig);
 
 	mrc.signaled = 1;
 	status = pthread_cond_signal(&mrc.cond);
 	if (status) {
-		error(master->logopt,
+		error(logopt,
 		      "failed to signal state notify condition");
 		status = pthread_mutex_unlock(&mrc.mutex);
 		if (status)
@@ -1170,13 +1166,14 @@ static void *do_notify_state(void *arg)
 	if (status)
 		fatal(status);
 
-	master_notify_state_change(master, sig);
+	master_notify_state_change(sig);
 
 	return NULL;
 }
 
-static pthread_t do_signals(struct master *master, int sig)
+static pthread_t do_signals(int sig)
 {
+	unsigned int logopt = master_get_logopt();
 	pthread_t thid;
 	int r_sig = sig;
 	int status;
@@ -1187,7 +1184,7 @@ static pthread_t do_signals(struct master *master, int sig)
 
 	status = pthread_create(&thid, &th_attr_detached, do_notify_state, &r_sig);
 	if (status) {
-		error(master->logopt,
+		error(logopt,
 		      "mount state notify thread create failed");
 		status = pthread_mutex_unlock(&mrc.mutex);
 		if (status)
@@ -1196,7 +1193,6 @@ static pthread_t do_signals(struct master *master, int sig)
 	}
 
 	mrc.thid = thid;
-	mrc.master = master;
 
 	pthread_cleanup_push(do_master_cleanup_unlock, NULL);
 
@@ -1214,7 +1210,7 @@ static pthread_t do_signals(struct master *master, int sig)
 
 static void *do_read_master(void *arg)
 {
-	struct master *master;
+	struct master *master = master_get_master();
 	unsigned int logopt;
 	time_t age;
 	int status;
@@ -1223,7 +1219,6 @@ static void *do_read_master(void *arg)
 	if (status)
 		fatal(status);
 
-	master = mrc.master;
 	age = mrc.age;
 	logopt = master->logopt;
 
@@ -1256,7 +1251,7 @@ static void *do_read_master(void *arg)
 
 	master->readall = 1;
 
-	status = master_read_master(master, age);
+	status = master_read_master(age);
 
 	master->readall = 0;
 
@@ -1271,8 +1266,9 @@ static void *do_read_master(void *arg)
 	return NULL;
 }
 
-static int do_hup_signal(struct master *master)
+static int do_hup_signal(void)
 {
+	struct master *master = master_get_master();
 	unsigned int logopt = master->logopt;
 	time_t age = monotonic_time(NULL);
 	pthread_t thid;
@@ -1305,7 +1301,6 @@ static int do_hup_signal(struct master *master)
 	}
 
 	mrc.thid = thid;
-	mrc.master = master;
 	mrc.age = age;
 
 	pthread_cleanup_push(do_master_cleanup_unlock, NULL);
@@ -1325,6 +1320,7 @@ static int do_hup_signal(struct master *master)
 /* Deal with all the signal-driven events in the state machine */
 static void *signal_handler(void *arg)
 {
+	struct master *master = master_get_master();
 	sigset_t signalset;
 	int sig;
 
@@ -1340,13 +1336,13 @@ static void *signal_handler(void *arg)
 		case SIGINT:
 		case SIGUSR2:
 			master_mutex_lock();
-			if (list_empty(&master_list->completed)) {
-				if (__master_list_empty(master_list)) {
+			if (list_empty(&master->completed)) {
+				if (__master_list_empty()) {
 					master_mutex_unlock();
 					return NULL;
 				}
 			} else {
-				if (master_done(master_list)) {
+				if (master_done()) {
 					master_mutex_unlock();
 					return NULL;
 				}
@@ -1356,11 +1352,11 @@ static void *signal_handler(void *arg)
 			master_mutex_unlock();
 
 		case SIGUSR1:
-			do_signals(master_list, sig);
+			do_signals(sig);
 			break;
 
 		case SIGHUP:
-			do_hup_signal(master_list);
+			do_hup_signal();
 			break;
 
 		default:
@@ -1498,7 +1494,7 @@ static void handle_cmd_pipe_fifo_message(int fd)
 		return;
 	}
 
-	ap = master_find_mapent_by_devid(master_list, devid);
+	ap = master_find_mapent_by_devid(devid);
 	if (!ap) {
 		error(LOGOPT_ANY, "can't locate autofs_point for device id %ld.", devid);
 		return;
@@ -1774,6 +1770,7 @@ void handle_mounts_startup_cond_destroy(void *arg)
 
 static void handle_mounts_cleanup(void *arg)
 {
+	struct master *master = master_get_master();
 	struct autofs_point *ap;
 	char buf[MAX_ERR_BUF];
 	unsigned int clean = 0, submount, logopt;
@@ -1803,7 +1800,7 @@ static void handle_mounts_cleanup(void *arg)
 	}
 
 	/* Don't signal the handler if we have already done so */
-	if (!list_empty(&master_list->completed))
+	if (!list_empty(&master->completed))
 		pending = 1;
 
 	info(logopt, "shut down path %s", ap->path);
@@ -2180,8 +2177,9 @@ static void remove_empty_args(char **argv, int *argc)
 	*argc = j;
 }
 
-static void do_master_list_reset(struct master *master)
+static void do_master_list_reset(void)
 {
+	struct master *master = master_get_master();
 	struct list_head *head, *p, *n;
 
 	master_mutex_lock();
@@ -2205,7 +2203,7 @@ static void do_master_list_reset(struct master *master)
 	master_mutex_unlock();
 }
 
-static int do_master_read_master(struct master *master, time_t *age, int wait)
+static int do_master_read_master(time_t *age, int wait)
 {
 	sigset_t signalset, savesigset;
 	/* Wait must be at least 1 second */
@@ -2223,10 +2221,10 @@ static int do_master_read_master(struct master *master, time_t *age, int wait)
 	while (1) {
 		struct timespec t = { retry_wait, 0 };
 
-		do_master_list_reset(master);
+		do_master_list_reset();
 
 		*age = monotonic_time(NULL);
-		if (master_read_master(master, *age)) {
+		if (master_read_master(*age)) {
 			ret = 1;
 			break;
 		}
@@ -2251,6 +2249,7 @@ static int do_master_read_master(struct master *master, time_t *age, int wait)
 
 int main(int argc, char *argv[])
 {
+	struct master *master = NULL;
 	int res, opt, status;
 	int logpri = -1;
 	unsigned int flags;
@@ -2505,7 +2504,7 @@ int main(int argc, char *argv[])
 		struct mapent_cache *nc;
 		const char *type = NULL;
 		const char *name = NULL;
-		const char *master = NULL;
+		const char *map = NULL;
 
 		if (argc > 0) {
 			if (argc >= 2) {
@@ -2513,7 +2512,7 @@ int main(int argc, char *argv[])
 				name = argv[1];
 			}
 			if (argc == 3)
-				master = argv[2];
+				map = argv[2];
 		}
 
 		status = pthread_key_create(&key_thread_stdenv_vars,
@@ -2533,11 +2532,9 @@ int main(int argc, char *argv[])
 			exit(1);
 		}
 
-		if (master)
-			master_list = master_new(NULL, timeout, flags);
-		else
-			master_list = master_new(master, timeout, flags);
-		if (!master_list) {
+		if (!master_new(map, timeout, flags))
+			master = master_get_master();
+		if (!master) {
 			printf("%s: can't create master map", program);
 			macro_free_global_table();
 			exit(1);
@@ -2547,27 +2544,27 @@ int main(int argc, char *argv[])
 
 		master_init_scan();
 
-		nc = cache_init_null_cache(master_list);
+		nc = cache_init_null_cache(master);
 		if (!nc) {
 			printf("%s: failed to init null map cache for %s",
-				program, master_list->name);
+				program, master->name);
 			macro_free_global_table();
 			exit(1);
 		}
-		master_list->nc = nc;
+		master->nc = nc;
 
-		lookup_nss_read_master(master_list, 0);
+		lookup_nss_read_master(master, 0);
 		if (type) {
 			const char *map = basename(name);
 			if (!map)
 				printf("%s: invalid map name %s\n",
 					program, name);
 			else
-				dump_map(master_list, type, map);
+				dump_map(type, map);
 		} else
-			master_show_mounts(master_list);
+			master_show_mounts();
 
-		head = &master_list->mounts;
+		head = &master->mounts;
 		p = head->next;
 		while (p != head) {
 			entry = list_entry(p, struct master_mapent, list);
@@ -2575,18 +2572,20 @@ int main(int argc, char *argv[])
 			master_free_mapent_sources(entry, 1);
 			master_free_mapent(entry);
 		}
-		master_kill(master_list);
+		master_kill();
 		macro_free_global_table();
 
 		exit(0);
 	}
 
-	if (argc == 0)
-		master_list = master_new(NULL, timeout, flags);
-	else
-		master_list = master_new(argv[0], timeout, flags);
-
-	if (!master_list) {
+	if (argc == 0) {
+		if (!master_new(NULL, timeout, flags))
+			master = master_get_master();
+	} else {
+		if (!master_new(argv[0], timeout, flags))
+			master = master_get_master();
+	}
+	if (!master) {
 		printf("%s: can't create master map %s", program, argv[0]);
 		macro_free_global_table();
 		exit(1);
@@ -2632,7 +2631,7 @@ int main(int argc, char *argv[])
 	}
 
 	info(logging, "Starting automounter version %s, master map %s",
-		version, master_list->name);
+		version, master->name);
 	info(logging, "using kernel protocol version %d.%02d",
 		get_kver_major(), get_kver_minor());
 
@@ -2641,7 +2640,7 @@ int main(int argc, char *argv[])
 	if (status) {
 		logerr("%s: failed to create thread data key for std env vars!",
 		       program);
-		master_kill(master_list);
+		master_kill();
 		if (start_pipefd[1] != -1) {
 			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
 			close(start_pipefd[1]);
@@ -2655,7 +2654,7 @@ int main(int argc, char *argv[])
 	if (status) {
 		logerr("%s: failed to create thread data key for attempt ID!",
 		       program);
-		master_kill(master_list);
+		master_kill();
 		if (start_pipefd[1] != -1) {
 			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
 			close(start_pipefd[1]);
@@ -2669,7 +2668,7 @@ int main(int argc, char *argv[])
 
 	if (!start_cmd_pipe_handler()) {
 		logerr("%s: failed to create command pipe handler thread!", program);
-		master_kill(master_list);
+		master_kill();
 		if (start_pipefd[1] != -1) {
 			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
 			close(start_pipefd[1]);
@@ -2681,7 +2680,7 @@ int main(int argc, char *argv[])
 
 	if (!alarm_start_handler()) {
 		logerr("%s: failed to create alarm handler thread!", program);
-		master_kill(master_list);
+		master_kill();
 		if (start_pipefd[1] != -1) {
 			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
 			close(start_pipefd[1]);
@@ -2693,7 +2692,7 @@ int main(int argc, char *argv[])
 
 	if (!st_start_handler()) {
 		logerr("%s: failed to create FSM handler thread!", program);
-		master_kill(master_list);
+		master_kill();
 		if (start_pipefd[1] != -1) {
 			res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
 			close(start_pipefd[1]);
@@ -2718,14 +2717,16 @@ int main(int argc, char *argv[])
 		dh_tirpc = dlopen("libtirpc.so.3", RTLD_NOW);
 #endif
 
-	master_read = master_read_master(master_list, age);
+	master_read = master_read_master(age);
 	if (!master_read) {
 		/*
 		 * Read master map, waiting until it is available, unless
 		 * a signal is received, in which case exit returning an
 		 * error.
 		 */
-		if (!do_master_read_master(master_list, &age, master_wait)) {
+		if (!do_master_read_master(&age, master_wait)) {
+			struct master *master = master_get_master();
+
 			logmsg("%s: warning: could not read at least one "
 				"map source after waiting, continuing ...",
 				 program);
@@ -2734,12 +2735,12 @@ int main(int argc, char *argv[])
 			 * we have anyway.
 			 */
 			master_mutex_lock();
-			master_list->readall = 1;
-			master_mount_mounts(master_list, age);
-			master_list->readall = 0;
+			master->readall = 1;
+			master_mount_mounts(age);
+			master->readall = 0;
 
-			if (list_empty(&master_list->mounts))
-				warn(master_list->logopt, "no mounts in table");
+			if (list_empty(&master->mounts))
+				warn(master_get_logopt(), "no mounts in table");
 			master_mutex_unlock();
 		}
 	}
@@ -2766,7 +2767,7 @@ int main(int argc, char *argv[])
 		signal_handler(NULL);
 	}
 
-	master_kill(master_list);
+	master_kill();
 
 	finish_cmd_pipe_handler();
 
diff --git a/daemon/master.c b/daemon/master.c
index e1357c44b..d85dd8975 100644
--- a/daemon/master.c
+++ b/daemon/master.c
@@ -102,6 +102,11 @@ void map_module_lock_cleanup(void *arg)
 	map_module_unlock(map);
 }
 
+struct master *master_get_master(void)
+{
+	return master_list;
+}
+
 int master_add_autofs_point(struct master_mapent *entry, unsigned logopt,
 			    unsigned nobind, unsigned ghost, int submount)
 {
@@ -688,8 +693,9 @@ void master_source_lock_cleanup(void *arg)
 	return;
 }
 
-struct master_mapent *master_find_mapent(struct master *master, const char *path)
+struct master_mapent *master_find_mapent(const char *path)
 {
+	struct master *master = master_list;
 	struct list_head *head, *p;
 
 	head = &master->mounts;
@@ -705,8 +711,9 @@ struct master_mapent *master_find_mapent(struct master *master, const char *path
 	return NULL;
 }
 
-struct autofs_point *master_find_mapent_by_devid(struct master *master, dev_t devid)
+struct autofs_point *master_find_mapent_by_devid(dev_t devid)
 {
+	struct master *master = master_list;
 	struct autofs_point *ap = NULL;
 	struct list_head *head, *p;
 
@@ -733,8 +740,9 @@ struct autofs_point *master_find_mapent_by_devid(struct master *master, dev_t de
 	return ap;
 }
 
-static unsigned int master_partial_match_amd_mapent(struct master *master, const char *path)
+static unsigned int master_partial_match_amd_mapent(const char *path)
 {
+	struct master *master = master_list;
 	struct list_head *head, *p;
 	size_t path_len = strlen(path);
 	int ret = 0;
@@ -780,7 +788,7 @@ static unsigned int master_partial_match_amd_mapent(struct master *master, const
 	return ret;
 }
 
-struct master_mapent *master_new_mapent(struct master *master, const char *path, time_t age)
+struct master_mapent *master_new_mapent(const char *path, time_t age)
 {
 	struct master_mapent *entry;
 	int status;
@@ -801,7 +809,7 @@ struct master_mapent *master_new_mapent(struct master *master, const char *path,
 	entry->len = strlen(tmp);
 
 	entry->age = age;
-	entry->master = master;
+	entry->master = master_list;
 	entry->maps = NULL;
 	entry->ap = NULL;
 
@@ -815,10 +823,9 @@ struct master_mapent *master_new_mapent(struct master *master, const char *path,
 	return entry;
 }
 
-void master_add_mapent(struct master *master, struct master_mapent *entry)
+void master_add_mapent(struct master_mapent *entry)
 {
-	list_add_tail(&entry->list, &master->mounts);
-	return;
+	list_add_tail(&entry->list, &master_list->mounts);
 }
 
 void master_remove_mapent(struct master_mapent *entry)
@@ -882,14 +889,14 @@ void master_free_mapent(struct master_mapent *entry)
 	return;
 }
 
-struct master *master_new(const char *name, unsigned int timeout, unsigned int flags)
+int master_new(const char *name, unsigned int timeout, unsigned int flags)
 {
 	struct master *master;
 	char *tmp;
 
 	master = malloc(sizeof(struct master));
 	if (!master)
-		return NULL;
+		return ENOMEM;
 
 	if (!name)
 		tmp = (char *) defaults_get_master_map();
@@ -898,7 +905,7 @@ struct master *master_new(const char *name, unsigned int timeout, unsigned int f
 
 	if (!tmp) {
 		free(master);
-		return NULL;
+		return ENOMEM;
 	}
 
 	master->name = tmp;
@@ -917,13 +924,14 @@ struct master *master_new(const char *name, unsigned int timeout, unsigned int f
 	INIT_LIST_HEAD(&master->mounts);
 	INIT_LIST_HEAD(&master->completed);
 
-	return master;
+	master_list = master;
+
+	return 0;
 }
 
-static void master_update_amd_mount_section_mount(struct master *master,
-						  const char *path, time_t age)
+static void master_update_amd_mount_section_mount(const char *path, time_t age)
 {
-	unsigned int m_logopt = master->logopt;
+	unsigned int m_logopt = master_list->logopt;
 	struct master_mapent *entry;
 	struct map_source *source;
 	unsigned int loglevel;
@@ -933,7 +941,7 @@ static void master_update_amd_mount_section_mount(struct master *master,
 	char *map;
 	char *opts;
 
-	entry = master_find_mapent(master, path);
+	entry = master_find_mapent(path);
 	if (!entry)
 		return;
 
@@ -997,9 +1005,9 @@ out:
 	free(map);
 }
 
-static void master_add_amd_mount_section_mounts(struct master *master, time_t age)
+static void master_add_amd_mount_section_mounts(time_t age)
 {
-	unsigned int m_logopt = master->logopt;
+	unsigned int m_logopt = master_list->logopt;
 	struct master_mapent *entry;
 	struct map_source *source;
 	unsigned int loglevel;
@@ -1025,14 +1033,14 @@ static void master_add_amd_mount_section_mounts(struct master *master, time_t ag
 		char *map = NULL;
 		char *opts;
 
-		ret = master_partial_match_amd_mapent(master, path);
+		ret = master_partial_match_amd_mapent(path);
 		if (ret) {
 			/* If this amd entry is already present in the
 			 * master map it's not a duplicate, don't issue
 			 * an error message.
 			 */
 			if (ret == 1) {
-				master_update_amd_mount_section_mount(master, path, age);
+				master_update_amd_mount_section_mount(path, age);
 				goto next;
 			}
 			info(m_logopt,
@@ -1049,7 +1057,7 @@ static void master_add_amd_mount_section_mounts(struct master *master, time_t ag
 			goto next;
 		}
 
-		entry = master_new_mapent(master, path, age);
+		entry = master_new_mapent(path, age);
 		if (!entry) {
 			error(m_logopt,
 			      "failed to allocate new amd section mount %s",
@@ -1114,7 +1122,7 @@ static void master_add_amd_mount_section_mounts(struct master *master, time_t ag
 
 		entry->age = age;
 
-		master_add_mapent(master, entry);
+		master_add_mapent(entry);
 next:
 		if (type)
 			free(type);
@@ -1129,8 +1137,9 @@ next:
 	free(paths);
 }
 
-static void wait_for_lookups_and_lock(struct master *master)
+static void wait_for_lookups_and_lock(void)
 {
+	struct master *master = master_list;
 	struct list_head *p, *head;
 	int status;
 
@@ -1162,8 +1171,9 @@ again:
 	}
 }
 
-int master_read_master(struct master *master, time_t age)
+int master_read_master(time_t age)
 {
+	struct master *master = master_list;
 	unsigned int logopt = master->logopt;
 	struct mapent_cache *nc;
 	int ret = 1;
@@ -1172,7 +1182,7 @@ int master_read_master(struct master *master, time_t age)
 	 * We need to clear and re-populate the null map entry cache
 	 * before alowing anyone else to use it.
 	 */
-	wait_for_lookups_and_lock(master);
+	wait_for_lookups_and_lock();
 	pthread_cleanup_push(master_mutex_lock_cleanup, NULL);
 	if (master->nc) {
 		cache_writelock(master->nc);
@@ -1193,10 +1203,10 @@ int master_read_master(struct master *master, time_t age)
 	master_init_scan();
 	lookup_nss_read_master(master, age);
 	cache_unlock(nc);
-	master_add_amd_mount_section_mounts(master, age);
+	master_add_amd_mount_section_mounts(age);
 
 	if (!master->read_fail)
-		master_mount_mounts(master, age);
+		master_mount_mounts(age);
 	else {
 		master->read_fail = 0;
 		/* HUP signal sets master->readall == 1 only */
@@ -1204,10 +1214,10 @@ int master_read_master(struct master *master, time_t age)
 			ret = 0;
 			goto done;
 		} else
-			master_mount_mounts(master, age);
+			master_mount_mounts(age);
 	}
 
-	if (__master_list_empty(master))
+	if (__master_list_empty())
 		warn(logopt, "no mounts in table");
 done:
 	pthread_cleanup_pop(1);
@@ -1273,8 +1283,9 @@ done:
 	return ret;
 }
 
-void master_notify_state_change(struct master *master, int sig)
+void master_notify_state_change(int sig)
 {
+	struct master *master = master_list;
 	struct master_mapent *entry;
 	struct autofs_point *ap;
 	struct list_head *p;
@@ -1451,8 +1462,9 @@ void check_update_map_sources(struct master_mapent *entry, int readall)
 	return;
 }
 
-int master_mount_mounts(struct master *master, time_t age)
+int master_mount_mounts(time_t age)
 {
+	struct master *master = master_list;
 	struct mapent_cache *nc = master->nc;
 	struct list_head *p, *head;
 	int cur_state;
@@ -1693,11 +1705,12 @@ static int match_name(struct map_source *source, const char *name)
 	return ret;
 }
 
-int dump_map(struct master *master, const char *type, const char *name)
+int dump_map(const char *type, const char *name)
 {
+	struct master *master = master_list;
 	struct list_head *p, *head;
 
-	if (__master_list_empty(master)) {
+	if (__master_list_empty()) {
 		printf("no master map entries found\n");
 		return 1;
 	}
@@ -1798,8 +1811,9 @@ int dump_map(struct master *master, const char *type, const char *name)
 	return 0;
 }
 
-int master_show_mounts(struct master *master)
+int master_show_mounts(void)
 {
+	struct master *master = master_list;
 	struct list_head *p, *head;
 
 	printf("\nautofs dump map information\n"
@@ -1815,7 +1829,7 @@ int master_show_mounts(struct master *master)
 		printf("global options %s be appended to map entries\n", append);
 	}
 
-	if (__master_list_empty(master)) {
+	if (__master_list_empty()) {
 		printf("no master map entries found\n\n");
 		return 1;
 	}
@@ -1903,29 +1917,30 @@ int master_show_mounts(struct master *master)
 	return 1;
 }
 
-int __master_list_empty(struct master *master)
+int __master_list_empty(void)
 {
 	int res = 0;
 
-	if (list_empty(&master->mounts))
+	if (list_empty(&master_list->mounts))
 		res = 1;
 
 	return res;
 }
 
-int master_list_empty(struct master *master)
+int master_list_empty(void)
 {
 	int res;
 
 	master_mutex_lock();
-	res = __master_list_empty(master);
+	res = __master_list_empty();
 	master_mutex_unlock();
 
 	return res;
 }
 
-int master_done(struct master *master)
+int master_done(void)
 {
+	struct master *master = master_list;
 	struct list_head *head, *p;
 	struct master_mapent *entry;
 	int res = 0;
@@ -1941,7 +1956,7 @@ int master_done(struct master *master)
 		master_free_mapent(entry);
 	}
 
-	if (__master_list_empty(master))
+	if (__master_list_empty())
 		res = 1;
 
 	return res;
@@ -1952,12 +1967,14 @@ unsigned int master_get_logopt(void)
 	return master_list ? master_list->logopt : LOGOPT_NONE;
 }
 
-int master_kill(struct master *master)
+int master_kill(void)
 {
+	struct master *master = master_list;
+
 	if (!master)
 		return 1;
 
-	if (!master_list_empty(master))
+	if (!master_list_empty())
 		return 0;
 
 	if (master->name)
diff --git a/daemon/master_parse.y b/daemon/master_parse.y
index 087ff5b19..8ad5f5c9e 100644
--- a/daemon/master_parse.y
+++ b/daemon/master_parse.y
@@ -815,12 +815,11 @@ void master_init_scan(void)
 
 int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigned int logging, time_t age)
 {
-	struct master *master = master_list;
 	struct mapent_cache *nc;
 	struct master_mapent *entry, *new;
 	struct map_source *source;
 	unsigned int logopt = logging;
-	unsigned int m_logopt = master->logopt;
+	unsigned int m_logopt = master_get_logopt();
 	size_t mp_len;
 	int ret;
 
@@ -840,7 +839,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
 	while (mp_len && path[--mp_len] == '/')
 		path[mp_len] = 0;
 
-	nc = master->nc;
+	nc = master_get_master()->nc;
 
 	/* Add null map entries to the null map cache */
 	if (type && !strcmp(type, "null")) {
@@ -861,9 +860,9 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
 	}
 
 	new = NULL;
-	entry = master_find_mapent(master, path);
+	entry = master_find_mapent(path);
 	if (!entry) {
-		new = master_new_mapent(master, path, age);
+		new = master_new_mapent(path, age);
 		if (!new) {
 			local_free_vars();
 			return 0;
@@ -981,7 +980,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
 	entry->age = age;
 
 	if (new)
-		master_add_mapent(master, entry);
+		master_add_mapent(entry);
 
 	local_free_vars();
 
diff --git a/include/automount.h b/include/automount.h
index 7b7ee41b3..0be7003e4 100644
--- a/include/automount.h
+++ b/include/automount.h
@@ -410,7 +410,6 @@ struct master_readmap_cond {
 	pthread_mutex_t mutex;
 	pthread_cond_t  cond;
 	pthread_t thid;		 /* map reader thread id */
-	struct master *master;
 	time_t age;		 /* Last time read */
 	enum states state;	 /* Next state */
 	unsigned int signaled;   /* Condition has been signaled */
diff --git a/include/master.h b/include/master.h
index a5f876e2e..71610611f 100644
--- a/include/master.h
+++ b/include/master.h
@@ -81,6 +81,7 @@ int master_parse_entry(const char *, unsigned int, unsigned int, time_t);
 void master_mutex_lock(void);
 void master_mutex_unlock(void);
 void master_mutex_lock_cleanup(void *);
+struct master *master_get_master(void);
 void master_set_default_timeout(void);
 void master_set_default_ghost_mode(void);
 int master_add_autofs_point(struct master_mapent *, unsigned, unsigned, unsigned, int);
@@ -103,26 +104,26 @@ void master_source_writelock(struct master_mapent *);
 void master_source_readlock(struct master_mapent *);
 void master_source_unlock(struct master_mapent *);
 void master_source_lock_cleanup(void *);
-struct master_mapent *master_find_mapent(struct master *, const char *);
-struct autofs_point *master_find_mapent_by_devid(struct master *master, dev_t devid);
-struct master_mapent *master_new_mapent(struct master *, const char *, time_t);
-void master_add_mapent(struct master *, struct master_mapent *);
+struct master_mapent *master_find_mapent(const char *);
+struct autofs_point *master_find_mapent_by_devid(dev_t devid);
+struct master_mapent *master_new_mapent(const char *, time_t);
+void master_add_mapent(struct master_mapent *);
 void master_remove_mapent(struct master_mapent *);
 void master_free_mapent_sources(struct master_mapent *, unsigned int);
 void master_free_mapent(struct master_mapent *);
-struct master *master_new(const char *, unsigned int, unsigned int);
-int master_read_master(struct master *, time_t);
+int master_new(const char *, unsigned int, unsigned int);
+int master_read_master(time_t);
 int master_notify_submount(struct autofs_point *, const char *path, enum states);
-void master_notify_state_change(struct master *, int);
+void master_notify_state_change(int);
 void check_update_map_sources(struct master_mapent *, int);
-int master_mount_mounts(struct master *, time_t);
-int dump_map(struct master *, const char *, const char *);
-int master_show_mounts(struct master *);
+int master_mount_mounts(time_t);
+int dump_map(const char *, const char *);
+int master_show_mounts(void);
 unsigned int master_get_logopt(void);
-int __master_list_empty(struct master *);
-int master_list_empty(struct master *);
-int master_done(struct master *);
-int master_kill(struct master *);
+int __master_list_empty(void);
+int master_list_empty(void);
+int master_done(void);
+int master_kill(void);
 void map_module_writelock(struct map_source *map);
 int map_module_try_writelock(struct map_source *map);
 void map_module_readlock(struct map_source *map);
diff --git a/modules/mount_autofs.c b/modules/mount_autofs.c
index b567fccde..b39d06cee 100644
--- a/modules/mount_autofs.c
+++ b/modules/mount_autofs.c
@@ -60,7 +60,6 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name,
 	time_t timeout = get_exp_timeout(ap, ap->entry->maps);
 	unsigned logopt = ap->logopt;
 	struct map_type_info *info;
-	struct master *master;
 	struct master_mapent *entry;
 	struct map_source *source;
 	struct autofs_point *nap;
@@ -161,9 +160,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name,
 	      MODPREFIX "mountpoint=%s what=%s options=%s",
 	      mountpoint, what, options);
 
-	master = ap->entry->master;
-
-	entry = master_new_mapent(master, mountpoint, ap->entry->age);
+	entry = master_new_mapent(mountpoint, ap->entry->age);
 	if (!entry) {
 		error(ap->logopt,
 		      MODPREFIX "failed to malloc master_mapent struct");
