Blame SOURCES/autofs-5.1.7-switch-to-use-tree-implementation-for-offsets.patch

9a499a
autofs-5.1.7 - switch to use tree implementation for offsets
9a499a
9a499a
From: Ian Kent <raven@themaw.net>
9a499a
9a499a
Change to use the tree mapent implementation for the handling
9a499a
of offset mounts.
9a499a
9a499a
Signed-off-by: Ian Kent <raven@themaw.net>
9a499a
---
9a499a
 CHANGELOG                |    1 
9a499a
 daemon/automount.c       |   25 ++----------
9a499a
 daemon/lookup.c          |    2 -
9a499a
 include/automount.h      |    8 ++--
9a499a
 lib/cache.c              |   67 ---------------------------------
9a499a
 lib/mounts.c             |    4 +-
9a499a
 modules/lookup_program.c |    2 -
9a499a
 modules/parse_sun.c      |   94 ++++++++++++-----------------------------------
9a499a
 8 files changed, 39 insertions(+), 164 deletions(-)
9a499a
9a499a
--- autofs-5.1.4.orig/CHANGELOG
9a499a
+++ autofs-5.1.4/CHANGELOG
9a499a
@@ -40,6 +40,7 @@
9a499a
 - add tree_mapent_cleanup_offsets().
9a499a
 - add set_offset_tree_catatonic().
9a499a
 - add mount and umount offsets functions.
9a499a
+- switch to use tree implementation for offsets.
9a499a
 
9a499a
 xx/xx/2018 autofs-5.1.5
9a499a
 - fix flag file permission.
9a499a
--- autofs-5.1.4.orig/daemon/automount.c
9a499a
+++ autofs-5.1.4/daemon/automount.c
9a499a
@@ -551,29 +551,15 @@ static int umount_subtree_mounts(struct
9a499a
 	left = 0;
9a499a
 
9a499a
 	if (me && IS_MM(me)) {
9a499a
-		char root[PATH_MAX + 1];
9a499a
 		char key[PATH_MAX + 1];
9a499a
 		struct mapent *tmp;
9a499a
-		int status;
9a499a
-		char *base;
9a499a
+		int ret;
9a499a
 
9a499a
-		if (!strchr(MM_ROOT(me)->key, '/'))
9a499a
-			/* Indirect multi-mount root */
9a499a
-			/* sprintf okay - if it's mounted, it's
9a499a
-			 * PATH_MAX or less bytes */
9a499a
-			sprintf(root, "%s/%s", ap->path, MM_ROOT(me)->key);
9a499a
-		else
9a499a
-			strcpy(root, MM_ROOT(me)->key);
9a499a
-
9a499a
-		if (IS_MM_ROOT(me))
9a499a
-			base = NULL;
9a499a
-		else
9a499a
-			base = me->key + strlen(root);
9a499a
-
9a499a
-		left = umount_multi_triggers(ap, me, root, base);
9a499a
-		if (left) {
9a499a
+		ret = tree_mapent_umount_offsets(me, 1);
9a499a
+		if (!ret) {
9a499a
 			warn(ap->logopt,
9a499a
 			     "some offset mounts still present under %s", path);
9a499a
+			left++;
9a499a
 		}
9a499a
 
9a499a
 		strcpy(key, me->key);
9a499a
@@ -589,8 +575,7 @@ static int umount_subtree_mounts(struct
9a499a
 		}
9a499a
 
9a499a
 		if (!left && IS_MM_ROOT(me)) {
9a499a
-			status = cache_delete_offset_list(mc, me->key);
9a499a
-			if (status != CHE_OK) {
9a499a
+			if (!tree_mapent_delete_offsets(mc, me->key)) {
9a499a
 				warn(ap->logopt, "couldn't delete offset list");
9a499a
 				left++;
9a499a
 			}
9a499a
--- autofs-5.1.4.orig/daemon/lookup.c
9a499a
+++ autofs-5.1.4/daemon/lookup.c
9a499a
@@ -851,7 +851,7 @@ static int lookup_amd_instance(struct au
9a499a
 		return NSS_STATUS_UNKNOWN;
9a499a
 	}
9a499a
 
9a499a
-	m_key = malloc(ap->len + strlen(MM_ROOT(me)->key) + 2);
9a499a
+	m_key = malloc(ap->len + MM_ROOT(me)->len + 2);
9a499a
 	if (!m_key) {
9a499a
 		error(ap->logopt,
9a499a
 		     "failed to allocate storage for search key");
9a499a
--- autofs-5.1.4.orig/include/automount.h
9a499a
+++ autofs-5.1.4/include/automount.h
9a499a
@@ -187,10 +187,10 @@ struct mapent {
9a499a
 	ino_t ino;
9a499a
 };
9a499a
 
9a499a
-#define IS_MM(me)	(me->multi)
9a499a
-#define IS_MM_ROOT(me)	(me->multi == me)
9a499a
-#define MM_ROOT(me)	(me->multi)
9a499a
-#define MM_PARENT(me)	(me->parent)
9a499a
+#define IS_MM(me)	(me->mm_root)
9a499a
+#define IS_MM_ROOT(me)	(me->mm_root == &me->node)
9a499a
+#define MM_ROOT(me)	(MAPENT(me->mm_root))
9a499a
+#define MM_PARENT(me)	(MAPENT(me->mm_parent))
9a499a
 
9a499a
 void cache_lock_cleanup(void *arg);
9a499a
 void cache_readlock(struct mapent_cache *mc);
9a499a
--- autofs-5.1.4.orig/lib/cache.c
9a499a
+++ autofs-5.1.4/lib/cache.c
9a499a
@@ -682,14 +682,6 @@ int cache_update_offset(struct mapent_ca
9a499a
 		return CHE_FAIL;
9a499a
 	}
9a499a
 
9a499a
-	me = cache_lookup_distinct(mc, key);
9a499a
-	if (me) {
9a499a
-		cache_add_ordered_offset(me, &owner->multi_list);
9a499a
-		MM_ROOT(me) = owner;
9a499a
-		goto done;
9a499a
-	}
9a499a
-	ret = CHE_FAIL;
9a499a
-done:
9a499a
 	return ret; 
9a499a
 }
9a499a
 
9a499a
@@ -928,65 +920,6 @@ done:
9a499a
 	return ret;
9a499a
 }
9a499a
 
9a499a
-/* cache must be write locked by caller */
9a499a
-int cache_delete_offset_list(struct mapent_cache *mc, const char *key)
9a499a
-{
9a499a
-	unsigned logopt = mc->ap ? mc->ap->logopt : master_get_logopt();
9a499a
-	struct mapent *me;
9a499a
-	struct mapent *this;
9a499a
-	struct list_head *head, *next;
9a499a
-	int remain = 0;
9a499a
-	int status;
9a499a
-
9a499a
-	me = cache_lookup_distinct(mc, key);
9a499a
-	if (!me)
9a499a
-		return CHE_FAIL;
9a499a
-
9a499a
-	/* Not offset list owner */
9a499a
-	if (!IS_MM_ROOT(me))
9a499a
-		return CHE_FAIL;
9a499a
-
9a499a
-	head = &me->multi_list;
9a499a
-	next = head->next;
9a499a
-	while (next != head) {
9a499a
-		this = list_entry(next, struct mapent, multi_list);
9a499a
-		next = next->next;
9a499a
-		if (this->ioctlfd != -1) {
9a499a
-			error(logopt,
9a499a
-			      "active offset mount key %s", this->key);
9a499a
-			return CHE_FAIL;
9a499a
-		}
9a499a
-	}
9a499a
-
9a499a
-	head = &me->multi_list;
9a499a
-	next = head->next;
9a499a
-	while (next != head) {
9a499a
-		this = list_entry(next, struct mapent, multi_list);
9a499a
-		next = next->next;
9a499a
-		list_del_init(&this->multi_list);
9a499a
-		MM_ROOT(this) = NULL;
9a499a
-		debug(logopt, "deleting offset key %s", this->key);
9a499a
-		status = cache_delete(mc, this->key);
9a499a
-		if (status == CHE_FAIL) {
9a499a
-			warn(logopt,
9a499a
-			     "failed to delete offset %s", this->key);
9a499a
-			MM_ROOT(this) = me;
9a499a
-			/* TODO: add list back in */
9a499a
-			remain++;
9a499a
-		}
9a499a
-	}
9a499a
-
9a499a
-	if (!remain) {
9a499a
-		list_del_init(&me->multi_list);
9a499a
-		MM_ROOT(me) = NULL;
9a499a
-	}
9a499a
-
9a499a
-	if (remain)
9a499a
-		return CHE_FAIL;
9a499a
-
9a499a
-	return CHE_OK;
9a499a
-}
9a499a
-
9a499a
 void cache_release(struct map_source *map)
9a499a
 {
9a499a
 	struct mapent_cache *mc;
9a499a
--- autofs-5.1.4.orig/lib/mounts.c
9a499a
+++ autofs-5.1.4/lib/mounts.c
9a499a
@@ -2889,7 +2889,7 @@ void set_indirect_mount_tree_catatonic(s
9a499a
 
9a499a
 			/* Only need to set offset mounts catatonic */
9a499a
 			if (IS_MM(me) && IS_MM_ROOT(me))
9a499a
-				set_multi_mount_tree_catatonic(ap, me);
9a499a
+				set_offset_tree_catatonic(ap, me);
9a499a
 next:
9a499a
 			me = cache_enumerate(mc, me);
9a499a
 		}
9a499a
@@ -2909,7 +2909,7 @@ void set_direct_mount_tree_catatonic(str
9a499a
 {
9a499a
 	/* Set offset mounts catatonic for this mapent */
9a499a
 	if (IS_MM(me) && IS_MM_ROOT(me))
9a499a
-		set_multi_mount_tree_catatonic(ap, me);
9a499a
+		set_offset_tree_catatonic(ap, me);
9a499a
 	set_mount_catatonic(ap, me, me->ioctlfd);
9a499a
 }
9a499a
 
9a499a
--- autofs-5.1.4.orig/modules/lookup_program.c
9a499a
+++ autofs-5.1.4/modules/lookup_program.c
9a499a
@@ -676,7 +676,7 @@ int lookup_mount(struct autofs_point *ap
9a499a
 			me = cache_lookup_distinct(mc, name);
9a499a
 			if (me) {
9a499a
 				if (IS_MM(me))
9a499a
-					cache_delete_offset_list(mc, name);
9a499a
+					tree_mapent_delete_offsets(mc, name);
9a499a
 				cache_delete(mc, name);
9a499a
 			}
9a499a
 			cache_unlock(mc);
9a499a
--- autofs-5.1.4.orig/modules/parse_sun.c
9a499a
+++ autofs-5.1.4/modules/parse_sun.c
9a499a
@@ -856,8 +856,8 @@ update_offset_entry(struct autofs_point
9a499a
 	cache_writelock(mc);
9a499a
 	ret = cache_update_offset(mc, name, m_key, m_mapent, age);
9a499a
 
9a499a
-	if (!cache_set_offset_parent(mc, m_key))
9a499a
-		error(ap->logopt, "failed to set offset parent");
9a499a
+	if (!tree_mapent_add_node(mc, name, m_key))
9a499a
+		error(ap->logopt, "failed to add offset %s to tree", m_key);
9a499a
 	cache_unlock(mc);
9a499a
 
9a499a
 	if (ret == CHE_DUPLICATE) {
9a499a
@@ -1136,10 +1136,7 @@ static int mount_subtree(struct autofs_p
9a499a
 			 const char *name, char *loc, char *options, void *ctxt)
9a499a
 {
9a499a
 	struct mapent *me;
9a499a
-	struct mapent *ro;
9a499a
-	char *mm_root, *mm_base, *mm_key;
9a499a
-	unsigned int mm_root_len;
9a499a
-	int start, ret = 0, rv;
9a499a
+	int ret = 0, rv;
9a499a
 
9a499a
 	cache_readlock(mc);
9a499a
 	me = cache_lookup_distinct(mc, name);
9a499a
@@ -1150,34 +1147,18 @@ static int mount_subtree(struct autofs_p
9a499a
 
9a499a
 	rv = 0;
9a499a
 
9a499a
-	mm_key = MM_ROOT(me)->key;
9a499a
-
9a499a
-	if (*mm_key == '/') {
9a499a
-		mm_root = mm_key;
9a499a
-		start = strlen(mm_key);
9a499a
-	} else {
9a499a
-		start = ap->len + strlen(mm_key) + 1;
9a499a
-		mm_root = alloca(start + 3);
9a499a
-		strcpy(mm_root, ap->path);
9a499a
-		strcat(mm_root, "/");
9a499a
-		strcat(mm_root, mm_key);
9a499a
-	}
9a499a
-	mm_root_len = strlen(mm_root);
9a499a
-
9a499a
 	if (IS_MM_ROOT(me)) {
9a499a
 		char key[PATH_MAX + 1];
9a499a
+		struct mapent *ro;
9a499a
+		size_t len;
9a499a
 
9a499a
-		if (mm_root_len + 1 > PATH_MAX) {
9a499a
+		len = mount_fullpath(key, PATH_MAX, ap->path, me->key);
9a499a
+		if (!len) {
9a499a
 			warn(ap->logopt, "path loo long");
9a499a
 			return 1;
9a499a
 		}
9a499a
-
9a499a
-		/* name = NULL */
9a499a
-		/* destination = mm_root */
9a499a
-		mm_base = "/";
9a499a
-
9a499a
-		strcpy(key, mm_root);
9a499a
-		strcat(key, mm_base);
9a499a
+		key[len] = '/';
9a499a
+		key[len + 1] = 0;
9a499a
 
9a499a
 		/* Mount root offset if it exists */
9a499a
 		ro = cache_lookup_distinct(me->mc, key);
9a499a
@@ -1196,7 +1177,7 @@ static int mount_subtree(struct autofs_p
9a499a
 				warn(ap->logopt,
9a499a
 				      MODPREFIX "failed to parse root offset");
9a499a
 				cache_writelock(mc);
9a499a
-				cache_delete_offset_list(mc, name);
9a499a
+				tree_mapent_delete_offsets(mc, name);
9a499a
 				cache_unlock(mc);
9a499a
 				return 1;
9a499a
 			}
9a499a
@@ -1211,10 +1192,10 @@ static int mount_subtree(struct autofs_p
9a499a
 				free(ro_loc);
9a499a
 		}
9a499a
 
9a499a
-		if ((ro && rv == 0) || rv <= 0) {
9a499a
-			ret = mount_multi_triggers(ap, me, mm_root, start, mm_base);
9a499a
-			if (ret == -1) {
9a499a
-				cleanup_multi_triggers(ap, me, mm_root, start, mm_base);
9a499a
+		if (rv <= 0) {
9a499a
+			ret = tree_mapent_mount_offsets(me, 1);
9a499a
+			if (!ret) {
9a499a
+				tree_mapent_cleanup_offsets(me);
9a499a
 				cache_unlock(mc);
9a499a
 				error(ap->logopt, MODPREFIX
9a499a
 					 "failed to mount offset triggers");
9a499a
@@ -1225,39 +1206,14 @@ static int mount_subtree(struct autofs_p
9a499a
 		int loclen = strlen(loc);
9a499a
 		int namelen = strlen(name);
9a499a
 
9a499a
-		/* name = mm_root + mm_base */
9a499a
-		/* destination = mm_root + mm_base = name */
9a499a
-		mm_base = &me->key[start];
9a499a
-
9a499a
+		/* Mounts at nesting points must succeed for subtree
9a499a
+		 * offsets to be mounted.
9a499a
+		 */
9a499a
 		rv = sun_mount(ap, name, name, namelen, loc, loclen, options, ctxt);
9a499a
 		if (rv == 0) {
9a499a
-			ret = mount_multi_triggers(ap, me->multi, name, start, mm_base);
9a499a
-			if (ret == -1) {
9a499a
-				cleanup_multi_triggers(ap, me, name, start, mm_base);
9a499a
-				cache_unlock(mc);
9a499a
-				error(ap->logopt, MODPREFIX
9a499a
-					 "failed to mount offset triggers");
9a499a
-				return 1;
9a499a
-			}
9a499a
-		} else if (rv < 0) {
9a499a
-			char mm_root_base[PATH_MAX + 1];
9a499a
-			unsigned int mm_root_base_len = mm_root_len + strlen(mm_base) + 1;
9a499a
-	
9a499a
-			if (mm_root_base_len > PATH_MAX) {
9a499a
-				cache_unlock(mc);
9a499a
-				warn(ap->logopt, MODPREFIX "path too long");
9a499a
-				cache_writelock(mc);
9a499a
-				cache_delete_offset_list(mc, name);
9a499a
-				cache_unlock(mc);
9a499a
-				return 1;
9a499a
-			}
9a499a
-
9a499a
-			strcpy(mm_root_base, mm_root);
9a499a
-			strcat(mm_root_base, mm_base);
9a499a
-
9a499a
-			ret = mount_multi_triggers(ap, me->multi, mm_root_base, start, mm_base);
9a499a
-			if (ret == -1) {
9a499a
-				cleanup_multi_triggers(ap, me, mm_root, start, mm_base);
9a499a
+			ret = tree_mapent_mount_offsets(me, 1);
9a499a
+			if (!ret) {
9a499a
+				tree_mapent_cleanup_offsets(me);
9a499a
 				cache_unlock(mc);
9a499a
 				error(ap->logopt, MODPREFIX
9a499a
 					 "failed to mount offset triggers");
9a499a
@@ -1267,7 +1223,7 @@ static int mount_subtree(struct autofs_p
9a499a
 	}
9a499a
 	cache_unlock(mc);
9a499a
 
9a499a
-	/* Mount for base of tree failed */
9a499a
+	/* strict mount failed */
9a499a
 	if (rv > 0)
9a499a
 		return rv;
9a499a
 
9a499a
@@ -1508,7 +1464,7 @@ dont_expand:
9a499a
 
9a499a
 		/* So we know we're the multi-mount root */
9a499a
 		if (!IS_MM(me))
9a499a
-			me->multi = me;
9a499a
+			MAPENT_SET_ROOT(me, tree_mapent_root(me))
9a499a
 		else {
9a499a
 			/*
9a499a
 			 * The amd host mount type assumes the lookup name
9a499a
@@ -1558,7 +1514,7 @@ dont_expand:
9a499a
 			if (!m_offset) {
9a499a
 				warn(ap->logopt, MODPREFIX "null path or out of memory");
9a499a
 				cache_writelock(mc);
9a499a
-				cache_delete_offset_list(mc, name);
9a499a
+				tree_mapent_delete_offsets(mc, name);
9a499a
 				cache_unlock(mc);
9a499a
 				free(options);
9a499a
 				free(pmapent);
9a499a
@@ -1575,7 +1531,7 @@ dont_expand:
9a499a
 			l = parse_mapent(p, options, &myoptions, &loc, ap->logopt);
9a499a
 			if (!l) {
9a499a
 				cache_writelock(mc);
9a499a
-				cache_delete_offset_list(mc, name);
9a499a
+				tree_mapent_delete_offsets(mc, name);
9a499a
 				cache_unlock(mc);
9a499a
 				free(m_offset);
9a499a
 				free(options);
9a499a
@@ -1594,7 +1550,7 @@ dont_expand:
9a499a
 			if (status != CHE_OK) {
9a499a
 				warn(ap->logopt, MODPREFIX "error adding multi-mount");
9a499a
 				cache_writelock(mc);
9a499a
-				cache_delete_offset_list(mc, name);
9a499a
+				tree_mapent_delete_offsets(mc, name);
9a499a
 				cache_unlock(mc);
9a499a
 				free(m_offset);
9a499a
 				free(options);