Blame SOURCES/autofs-5.1.6-make-external-mounts-independent-of-amd_entry.patch

9a499a
autofs-5.1.6 - make external mounts independent of amd_entry
9a499a
9a499a
From: Ian Kent <raven@themaw.net>
9a499a
9a499a
The external mounts used by amd map entries should not depend
9a499a
on the amd map entry.
9a499a
9a499a
The external mounts list is keyed by the external mount path
9a499a
and this should be what's used to locate them.
9a499a
9a499a
Signed-off-by: Ian Kent <raven@themaw.net>
9a499a
---
9a499a
 CHANGELOG           |    1 
9a499a
 daemon/automount.c  |    4 -
9a499a
 include/mounts.h    |    6 +-
9a499a
 include/parse_amd.h |    1 
9a499a
 lib/master.c        |    3 -
9a499a
 lib/mounts.c        |  114 ++++++++++++++++++++++++++++++----------------------
9a499a
 modules/parse_amd.c |   14 +++---
9a499a
 7 files changed, 80 insertions(+), 63 deletions(-)
9a499a
9a499a
--- autofs-5.1.4.orig/CHANGELOG
9a499a
+++ autofs-5.1.4/CHANGELOG
9a499a
@@ -119,6 +119,7 @@ xx/xx/2018 autofs-5.1.5
9a499a
 - update list.h.
9a499a
 - add hashtable implementation.
9a499a
 - change mountpoint to mp in struct ext_mount.
9a499a
+- make external mounts independent of amd_entry.
9a499a
 
9a499a
 19/12/2017 autofs-5.1.4
9a499a
 - fix spec file url.
9a499a
--- autofs-5.1.4.orig/daemon/automount.c
9a499a
+++ autofs-5.1.4/daemon/automount.c
9a499a
@@ -613,7 +613,7 @@ static int umount_subtree_mounts(struct
9a499a
 		}
9a499a
 		list_del(&entry->entries);
9a499a
 		mounts_mutex_unlock(ap);
9a499a
-		umount_amd_ext_mount(ap, entry);
9a499a
+		umount_amd_ext_mount(ap, entry->fs);
9a499a
 		free_amd_entry(entry);
9a499a
 	}
9a499a
 done:
9a499a
@@ -679,7 +679,7 @@ int umount_multi(struct autofs_point *ap
9a499a
 		}
9a499a
 		list_del(&entry->entries);
9a499a
 		mounts_mutex_unlock(ap);
9a499a
-		umount_amd_ext_mount(ap, entry);
9a499a
+		umount_amd_ext_mount(ap, entry->fs);
9a499a
 		free_amd_entry(entry);
9a499a
 		return 0;
9a499a
 	}
9a499a
--- autofs-5.1.4.orig/include/mounts.h
9a499a
+++ autofs-5.1.4/include/mounts.h
9a499a
@@ -97,8 +97,8 @@ unsigned int get_kver_minor(void);
9a499a
 char *make_options_string(char *path, int pipefd,
9a499a
 			  const char *type, unsigned int flags);
9a499a
 char *make_mnt_name_string(char *path);
9a499a
-int ext_mount_add(struct list_head *, const char *, unsigned int);
9a499a
-int ext_mount_remove(struct list_head *, const char *);
9a499a
+int ext_mount_add(const char *, const char *);
9a499a
+int ext_mount_remove(const char *);
9a499a
 int ext_mount_inuse(const char *);
9a499a
 struct mnt_list *get_mnt_list(const char *path, int include);
9a499a
 int unlink_mount_tree(struct autofs_point *ap, const char *mp);
9a499a
@@ -118,7 +118,7 @@ int try_remount(struct autofs_point *, s
9a499a
 void set_indirect_mount_tree_catatonic(struct autofs_point *);
9a499a
 void set_direct_mount_tree_catatonic(struct autofs_point *, struct mapent *);
9a499a
 int umount_ent(struct autofs_point *, const char *);
9a499a
-int umount_amd_ext_mount(struct autofs_point *, struct amd_entry *);
9a499a
+int umount_amd_ext_mount(struct autofs_point *, const char *);
9a499a
 int mount_multi_triggers(struct autofs_point *, struct mapent *, const char *, unsigned int, const char *);
9a499a
 int umount_multi_triggers(struct autofs_point *, struct mapent *, char *, const char *);
9a499a
 int clean_stale_multi_triggers(struct autofs_point *, struct mapent *, char *, const char *);
9a499a
--- autofs-5.1.4.orig/include/parse_amd.h
9a499a
+++ autofs-5.1.4/include/parse_amd.h
9a499a
@@ -66,7 +66,6 @@ struct amd_entry {
9a499a
 	struct selector *selector;
9a499a
 	struct list_head list;
9a499a
 	struct list_head entries;
9a499a
-	struct list_head ext_mount;
9a499a
 };
9a499a
 
9a499a
 int amd_parse_list(struct autofs_point *,
9a499a
--- autofs-5.1.4.orig/lib/master.c
9a499a
+++ autofs-5.1.4/lib/master.c
9a499a
@@ -154,10 +154,9 @@ void master_free_autofs_point(struct aut
9a499a
 	while (p != head) {
9a499a
 		struct amd_entry *entry = list_entry(p, struct amd_entry, entries);
9a499a
 		p = p->next;
9a499a
-		if (!list_empty(&entry->ext_mount))
9a499a
-			ext_mount_remove(&entry->ext_mount, entry->fs);
9a499a
 		if (!list_empty(&entry->entries))
9a499a
 			list_del(&entry->entries);
9a499a
+		ext_mount_remove(entry->fs);
9a499a
 		free_amd_entry(entry);
9a499a
 	}
9a499a
 	mounts_mutex_unlock(ap);
9a499a
--- autofs-5.1.4.orig/lib/mounts.c
9a499a
+++ autofs-5.1.4/lib/mounts.c
9a499a
@@ -54,10 +54,10 @@ static size_t maxgrpbuf = 0;
9a499a
 #define EXT_MOUNTS_HASH_SIZE    50
9a499a
 
9a499a
 struct ext_mount {
9a499a
+	unsigned int ref;
9a499a
 	char *mp;
9a499a
-	unsigned int umount;
9a499a
+	char *umount;
9a499a
 	struct list_head mount;
9a499a
-	struct list_head mounts;
9a499a
 };
9a499a
 static struct list_head ext_mounts_hash[EXT_MOUNTS_HASH_SIZE];
9a499a
 static unsigned int ext_mounts_hash_init_done = 0;
9a499a
@@ -542,7 +542,6 @@ struct amd_entry *new_amd_entry(const st
9a499a
 	new->path = path;
9a499a
 	INIT_LIST_HEAD(&new->list);
9a499a
 	INIT_LIST_HEAD(&new->entries);
9a499a
-	INIT_LIST_HEAD(&new->ext_mount);
9a499a
 
9a499a
 	return new;
9a499a
 }
9a499a
@@ -763,7 +762,7 @@ static struct ext_mount *ext_mount_looku
9a499a
 	return NULL;
9a499a
 }
9a499a
 
9a499a
-int ext_mount_add(struct list_head *entry, const char *path, unsigned int umount)
9a499a
+int ext_mount_add(const char *path, const char *umount)
9a499a
 {
9a499a
 	struct ext_mount *em;
9a499a
 	u_int32_t hval;
9a499a
@@ -773,13 +772,7 @@ int ext_mount_add(struct list_head *entr
9a499a
 
9a499a
 	em = ext_mount_lookup(path);
9a499a
 	if (em) {
9a499a
-		struct list_head *p, *head;
9a499a
-		head = &em->mounts;
9a499a
-		list_for_each(p, head) {
9a499a
-			if (p == entry)
9a499a
-				goto done;
9a499a
-		}
9a499a
-		list_add_tail(entry, &em->mounts);
9a499a
+		em->ref++;
9a499a
 		ret = 1;
9a499a
 		goto done;
9a499a
 	}
9a499a
@@ -787,28 +780,34 @@ int ext_mount_add(struct list_head *entr
9a499a
 	em = malloc(sizeof(struct ext_mount));
9a499a
 	if (!em)
9a499a
 		goto done;
9a499a
+	memset(em, 0, sizeof(*em));
9a499a
 
9a499a
 	em->mp = strdup(path);
9a499a
 	if (!em->mp) {
9a499a
 		free(em);
9a499a
 		goto done;
9a499a
 	}
9a499a
-	em->umount = umount;
9a499a
+	if (umount) {
9a499a
+		em->umount = strdup(umount);
9a499a
+		if (!em->umount) {
9a499a
+			free(em->mp);
9a499a
+			free(em);
9a499a
+			goto done;
9a499a
+		}
9a499a
+	}
9a499a
+	em->ref = 1;
9a499a
 	INIT_LIST_HEAD(&em->mount);
9a499a
-	INIT_LIST_HEAD(&em->mounts);
9a499a
 
9a499a
 	hval = hash(path, EXT_MOUNTS_HASH_SIZE);
9a499a
 	list_add_tail(&em->mount, &ext_mounts_hash[hval]);
9a499a
 
9a499a
-	list_add_tail(entry, &em->mounts);
9a499a
-
9a499a
 	ret = 1;
9a499a
 done:
9a499a
 	pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
 	return ret;
9a499a
 }
9a499a
 
9a499a
-int ext_mount_remove(struct list_head *entry, const char *path)
9a499a
+int ext_mount_remove(const char *path)
9a499a
 {
9a499a
 	struct ext_mount *em;
9a499a
 	int ret = 0;
9a499a
@@ -819,18 +818,18 @@ int ext_mount_remove(struct list_head *e
9a499a
 	if (!em)
9a499a
 		goto done;
9a499a
 
9a499a
-	list_del_init(entry);
9a499a
-
9a499a
-	if (!list_empty(&em->mounts))
9a499a
+	em->ref--;
9a499a
+	if (em->ref)
9a499a
 		goto done;
9a499a
 	else {
9a499a
 		list_del_init(&em->mount);
9a499a
-		if (em->umount)
9a499a
-			ret = 1;
9a499a
 		if (list_empty(&em->mount)) {
9a499a
 			free(em->mp);
9a499a
+			if (em->umount)
9a499a
+				free(em->umount);
9a499a
 			free(em);
9a499a
 		}
9a499a
+		ret = 1;
9a499a
 	}
9a499a
 done:
9a499a
 	pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
@@ -846,9 +845,7 @@ int ext_mount_inuse(const char *path)
9a499a
 	em = ext_mount_lookup(path);
9a499a
 	if (!em)
9a499a
 		goto done;
9a499a
-
9a499a
-	if (!list_empty(&em->mounts))
9a499a
-		ret = 1;
9a499a
+	ret = em->ref;
9a499a
 done:
9a499a
 	pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
 	return ret;
9a499a
@@ -2092,29 +2089,49 @@ int umount_ent(struct autofs_point *ap,
9a499a
 	return rv;
9a499a
 }
9a499a
 
9a499a
-int umount_amd_ext_mount(struct autofs_point *ap, struct amd_entry *entry)
9a499a
+int umount_amd_ext_mount(struct autofs_point *ap, const char *path)
9a499a
 {
9a499a
+	struct ext_mount *em;
9a499a
+	char *umount = NULL;
9a499a
+	char *mp;
9a499a
 	int rv = 1;
9a499a
 
9a499a
-	if (entry->umount) {
9a499a
-		char *prog, *str;
9a499a
-		char **argv;
9a499a
-		int argc = -1;
9a499a
+	pthread_mutex_lock(&ext_mount_hash_mutex);
9a499a
 
9a499a
-		str = strdup(entry->umount);
9a499a
-		if (!str)
9a499a
+	em = ext_mount_lookup(path);
9a499a
+	if (!em) {
9a499a
+		pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
+		goto out;
9a499a
+	}
9a499a
+	mp = strdup(em->mp);
9a499a
+	if (!mp) {
9a499a
+		pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
+		goto out;
9a499a
+	}
9a499a
+	if (em->umount) {
9a499a
+		umount = strdup(em->umount);
9a499a
+		if (!umount) {
9a499a
+			pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
+			free(mp);
9a499a
 			goto out;
9a499a
+		}
9a499a
+	}
9a499a
+
9a499a
+	pthread_mutex_unlock(&ext_mount_hash_mutex);
9a499a
+
9a499a
+	if (umount) {
9a499a
+		char *prog;
9a499a
+		char **argv;
9a499a
+		int argc = -1;
9a499a
 
9a499a
 		prog = NULL;
9a499a
 		argv = NULL;
9a499a
 
9a499a
-		argc = construct_argv(str, &prog, &argv);
9a499a
-		if (argc == -1) {
9a499a
-			free(str);
9a499a
-			goto out;
9a499a
-		}
9a499a
+		argc = construct_argv(umount, &prog, &argv);
9a499a
+		if (argc == -1)
9a499a
+			goto done;
9a499a
 
9a499a
-		if (!ext_mount_remove(&entry->ext_mount, entry->fs)) {
9a499a
+		if (!ext_mount_remove(mp)) {
9a499a
 			rv =0;
9a499a
 			goto out_free;
9a499a
 		}
9a499a
@@ -2122,29 +2139,30 @@ int umount_amd_ext_mount(struct autofs_p
9a499a
 		rv = spawnv(ap->logopt, prog, (const char * const *) argv);
9a499a
 		if (rv == -1 || (WIFEXITED(rv) && WEXITSTATUS(rv)))
9a499a
 			error(ap->logopt,
9a499a
-			     "failed to umount program mount at %s", entry->fs);
9a499a
+			     "failed to umount program mount at %s", mp);
9a499a
 		else {
9a499a
 			rv = 0;
9a499a
-			debug(ap->logopt,
9a499a
-			      "umounted program mount at %s", entry->fs);
9a499a
-			rmdir_path(ap, entry->fs, ap->dev);
9a499a
+			debug(ap->logopt, "umounted program mount at %s", mp);
9a499a
+			rmdir_path(ap, mp, ap->dev);
9a499a
 		}
9a499a
 out_free:
9a499a
 		free_argv(argc, (const char **) argv);
9a499a
-		free(str);
9a499a
 
9a499a
-		goto out;
9a499a
+		goto done;
9a499a
 	}
9a499a
 
9a499a
-	if (ext_mount_remove(&entry->ext_mount, entry->fs)) {
9a499a
-		rv = umount_ent(ap, entry->fs);
9a499a
+	if (ext_mount_remove(mp)) {
9a499a
+		rv = umount_ent(ap, mp);
9a499a
 		if (rv)
9a499a
 			error(ap->logopt,
9a499a
-			      "failed to umount external mount %s", entry->fs);
9a499a
+			      "failed to umount external mount %s", mp);
9a499a
 		else
9a499a
-			debug(ap->logopt,
9a499a
-			      "umounted external mount %s", entry->fs);
9a499a
+			debug(ap->logopt, "umounted external mount %s", mp);
9a499a
 	}
9a499a
+done:
9a499a
+	if (umount)
9a499a
+		free(umount);
9a499a
+	free(mp);
9a499a
 out:
9a499a
 	return rv;
9a499a
 }
9a499a
--- autofs-5.1.4.orig/modules/parse_amd.c
9a499a
+++ autofs-5.1.4/modules/parse_amd.c
9a499a
@@ -1136,7 +1136,7 @@ symlink:
9a499a
 
9a499a
 	if (entry->sublink) {
9a499a
 		/* failed to complete sublink mount */
9a499a
-		umount_amd_ext_mount(ap, entry);
9a499a
+		umount_amd_ext_mount(ap, entry->fs);
9a499a
 	}
9a499a
 out:
9a499a
 	return ret;
9a499a
@@ -1183,8 +1183,8 @@ static int do_generic_mount(struct autof
9a499a
 				goto out;
9a499a
 			umount = 1;
9a499a
 		}
9a499a
-		/* We have an external mount */
9a499a
-		if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
9a499a
+		/* If we have an external mount add it to the list */
9a499a
+		if (umount && !ext_mount_add(entry->fs, entry->umount)) {
9a499a
 			umount_ent(ap, entry->fs);
9a499a
 			error(ap->logopt, MODPREFIX
9a499a
 			      "error: could not add external mount %s",
9a499a
@@ -1235,7 +1235,7 @@ static int do_nfs_mount(struct autofs_po
9a499a
 			umount = 1;
9a499a
 		}
9a499a
 		/* We might be using an external mount */
9a499a
-		if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
9a499a
+		if (umount && !ext_mount_add(entry->fs, entry->umount)) {
9a499a
 			umount_ent(ap, entry->fs);
9a499a
 			error(ap->logopt, MODPREFIX
9a499a
 			      "error: could not add external mount %s", entry->fs);
9a499a
@@ -1429,7 +1429,7 @@ static int do_program_mount(struct autof
9a499a
 		/* An external mount with path entry->fs exists
9a499a
 		 * so ext_mount_add() won't fail.
9a499a
 		 */
9a499a
-		ext_mount_add(&entry->ext_mount, entry->fs, 1);
9a499a
+		ext_mount_add(entry->fs, entry->umount);
9a499a
 	} else {
9a499a
 		rv = mkdir_path(entry->fs, mp_mode);
9a499a
 		if (rv && errno != EEXIST) {
9a499a
@@ -1445,7 +1445,7 @@ static int do_program_mount(struct autof
9a499a
 
9a499a
 		rv = spawnv(ap->logopt, prog, (const char * const *) argv);
9a499a
 		if (WIFEXITED(rv) && !WEXITSTATUS(rv)) {
9a499a
-			if (ext_mount_add(&entry->ext_mount, entry->fs, 1)) {
9a499a
+			if (ext_mount_add(entry->fs, entry->umount)) {
9a499a
 				rv = 0;
9a499a
 				debug(ap->logopt, MODPREFIX
9a499a
 				     "%s: mounted %s", entry->type, entry->fs);
9a499a
@@ -1470,7 +1470,7 @@ do_free:
9a499a
 	if (!rv)
9a499a
 		goto out;
9a499a
 
9a499a
-	if (umount_amd_ext_mount(ap, entry)) {
9a499a
+	if (umount_amd_ext_mount(ap, entry->fs)) {
9a499a
 		if (!ext_mount_inuse(entry->fs))
9a499a
 			rmdir_path(ap, entry->fs, ap->dev);
9a499a
 		debug(ap->logopt, MODPREFIX