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

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