Blob Blame History Raw
autofs-5.0.6 - remove move mount code and configure option

From: Ian Kent <ikent@redhat.com>

The code to construct a multi-mount tree in a temporary location and then
move it into place is obsolete when using a kernel which includes the
vfs-automount infrastructure.

It is incompatible with systemd and cannot be used if systemd is being used.

So it's being removed.
---

 autofs.spec         |    2 
 configure           |   18 ----
 configure.in        |   10 --
 daemon/automount.c  |    5 -
 include/config.h.in |    3 
 modules/parse_sun.c |  195 +---------------------------------------------------
 6 files changed, 7 insertions(+), 226 deletions(-)


--- autofs-5.0.6.orig/autofs.spec
+++ autofs-5.0.6/autofs.spec
@@ -74,7 +74,7 @@ echo %{version}-%{release} > .version
 %endif
 
 %build
-CFLAGS="$RPM_OPT_FLAGS -Wall" ./configure --libdir=%{_libdir} --disable-mount-locking --enable-ignore-busy --with-libtirpc --disable-mount-move %{?systemd_configure_arg:}
+CFLAGS="$RPM_OPT_FLAGS -Wall" ./configure --libdir=%{_libdir} --disable-mount-locking --enable-ignore-busy --with-libtirpc %{?systemd_configure_arg:}
 CFLAGS="$RPM_OPT_FLAGS -Wall" make initdir=/etc/rc.d/init.d DONTSTRIP=1
 
 %install
--- autofs-5.0.6.orig/configure
+++ autofs-5.0.6/configure
@@ -719,7 +719,6 @@ with_openldap
 with_sasl
 enable_ext_env
 enable_mount_locking
-enable_mount_move
 enable_forced_shutdown
 enable_ignore_busy
 '
@@ -1343,7 +1342,6 @@ Optional Features:
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-ext-env	  disable search in environment for substitution variable
   --disable-mount-locking disable use of locking when spawning mount command
-  --disable-mount-move    disable use of mount move when when preparing tree of mounts
   --enable-force-shutdown enable USR1 signal to force unlink umount of any
 			  busy mounts during shutdown
   --enable-ignore-busy	  enable exit without umounting busy mounts during
@@ -5447,22 +5445,6 @@ $as_echo "#define ENABLE_MOUNT_LOCKING 1
 
 fi
 
-#
-# Disable use of mount move
-#
-# Check whether --enable-mount-move was given.
-if test "${enable_mount_move+set}" = set; then :
-  enableval=$enable_mount_move;
-else
-  enableval=yes
-fi
-
-if test x$enable_mount_move = xyes -o x$enableval = xyes; then
-
-$as_echo "#define ENABLE_MOUNT_MOVE 1" >>confdefs.h
-
-fi
-
 #
 # Enable forced shutdown on USR1 signal (unlink umounts all mounts).
 #
--- autofs-5.0.6.orig/configure.in
+++ autofs-5.0.6/configure.in
@@ -338,16 +338,6 @@ if test x$enable_mount_locking = xyes -o
 fi
 
 #
-# Disable use of mount move
-#
-AC_ARG_ENABLE(mount-move,
-[  --disable-mount-move    disable use of mount move when when preparing tree of mounts],,
-	enableval=yes)
-if test x$enable_mount_move = xyes -o x$enableval = xyes; then
-	AC_DEFINE(ENABLE_MOUNT_MOVE, 1, [Disable use of mount move when preparing tree of mounts])
-fi
-
-#
 # Enable forced shutdown on USR1 signal (unlink umounts all mounts).
 #
 AC_ARG_ENABLE(forced-shutdown,
--- autofs-5.0.6.orig/daemon/automount.c
+++ autofs-5.0.6/daemon/automount.c
@@ -1748,11 +1748,6 @@ static void show_build_info(void)
 	count = 22;
 #endif
 
-#ifndef ENABLE_MOUNT_MOVE
-	printf("DISABLE_MOUNT_MOVE ");
-	count = count + 19;
-#endif
-
 #ifdef ENABLE_FORCED_SHUTDOWN
 	printf("ENABLE_FORCED_SHUTDOWN ");
 	count = count + 23;
--- autofs-5.0.6.orig/include/config.h.in
+++ autofs-5.0.6/include/config.h.in
@@ -12,9 +12,6 @@
 /* Disable use of locking when spawning mount command */
 #undef ENABLE_MOUNT_LOCKING
 
-/* Disable use of mount move when preparing tree of mounts */
-#undef ENABLE_MOUNT_MOVE
-
 /* define if you have E2FSCK */
 #undef HAVE_E2FSCK
 
--- autofs-5.0.6.orig/modules/parse_sun.c
+++ autofs-5.0.6/modules/parse_sun.c
@@ -37,10 +37,6 @@
 
 #define MODPREFIX "parse(sun): "
 
-#define MOUNT_MOVE_NONE		0x00
-#define MOUNT_MOVE_AUTOFS	0x01
-#define MOUNT_MOVE_OTHER	0x02
-
 int parse_version = AUTOFS_PARSE_VERSION;	/* Required by protocol */
 
 static struct mount_mod *mount_nfs = NULL;
@@ -1047,86 +1043,6 @@ static int parse_mapent(const char *ent,
 	return (p - ent);
 }
 
-#ifdef ENABLE_MOUNT_MOVE
-static int move_mount(struct autofs_point *ap,
-		      const char *mm_tmp_root, const char *mm_root,
-		      unsigned int move)
-{
-	char buf[MAX_ERR_BUF];
-	int err;
-
-	if (move == MOUNT_MOVE_NONE)
-		return 1;
-
-	err = mkdir_path(mm_root, 0555);
-	if (err < 0 && errno != EEXIST) {
-		error(ap->logopt,
-		      "failed to create move target mount point %s", mm_root);
-		return 0;
-	}
-
-	if (move == MOUNT_MOVE_AUTOFS)
-		err = mount(mm_tmp_root, mm_root, NULL, MS_MOVE, NULL);
-	else
-		err = spawn_mount(ap->logopt,
-				  "--move", mm_tmp_root, mm_root, NULL);
-	if (err) {
-		char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
-		error(ap->logopt,
-		      "failed to move mount from %s to %s: %s",
-		      mm_tmp_root, mm_root, estr);
-		return 0;
-	}
-
-	debug(ap->logopt,
-	      "moved mount tree from %s to %s", mm_tmp_root, mm_root);
-
-	return 1;
-}
-#endif
-
-static void cleanup_multi_root(struct autofs_point *ap, const char *root,
-					 const char *path, unsigned int move)
-{
-	if (move == MOUNT_MOVE_NONE)
-		return;
-
-	if (move == MOUNT_MOVE_OTHER)
-		spawn_umount(ap->logopt, root, NULL);
-	else {
-		struct ioctl_ops *ops = get_ioctl_ops();
-		struct autofs_point *submount;
-
-		mounts_mutex_lock(ap);
-		submount = __master_find_submount(ap, path);
-		if (!submount) {
-			mounts_mutex_unlock(ap);
-			return;
-		}
-
-		alarm_delete(submount);
-		st_remove_tasks(submount);
-		st_wait_state(submount, ST_READY);
-
-		submount->parent->submnt_count--;
-		list_del_init(&submount->mounts);
-
-		ops->catatonic(submount->logopt, submount->ioctlfd);
-
-		mounts_mutex_unlock(ap);
-
-		if (submount->thid) {
-			pthread_cancel(submount->thid);
-			close_mount_fds(submount);
-			umount(root);
-			destroy_logpri_fifo(submount);
-			master_free_mapent_sources(submount->entry, 1);
-			master_free_mapent(ap->entry);
-		}
-	}
-	return;
-}
-
 static void cleanup_multi_triggers(struct autofs_point *ap,
 			    struct mapent *me, const char *root, int start,
 			    const char *base)
@@ -1166,49 +1082,15 @@ static void cleanup_multi_triggers(struc
 	return;
 }
 
-#ifdef ENABLE_MOUNT_MOVE
-static int check_fstype_autofs_option(const char *options)
-{
-	char *tok, *tokbuf;
-	int found;
-
-	/*
-	 * Look for fstype= in options and return true if
-	 * the last occurrence is fstype=autofs.
-	 */
-	found = 0;
-	tokbuf = alloca(strlen(options) + 2);
-	strcpy(tokbuf, options);
-	tok = strtok_r(tokbuf, ",", &tokbuf);
-	if (tok) {
-		do {
-			if (strstr(tok, "fstype=")) {
-				if (strstr(tok, "autofs"))
-					found = 1;
-				else
-					found = 0;
-			}
-		} while ((tok = strtok_r(NULL, ",", &tokbuf)));
-	}
-
-	return found;
-}
-#endif
-
 static int mount_subtree(struct autofs_point *ap, struct mapent *me,
 			 const char *name, char *loc, char *options, void *ctxt)
 {
 	struct mapent *mm;
 	struct mapent *ro;
 	char *mm_root, *mm_base, *mm_key;
-	const char *mnt_root, *target;
+	const char *mnt_root;
 	unsigned int mm_root_len, mnt_root_len;
 	int start, ret = 0, rv;
-	unsigned int move = MOUNT_MOVE_NONE;
-#ifdef ENABLE_MOUNT_MOVE
-	char t_dir[] = "/tmp/autoXXXXXX";
-	char *mnt_tmp_root = NULL;
-#endif
 
 	rv = 0;
 
@@ -1227,26 +1109,12 @@ static int mount_subtree(struct autofs_p
 	}
 	mm_root_len = strlen(mm_root);
 
-#ifndef ENABLE_MOUNT_MOVE
 	mnt_root = mm_root;
 	mnt_root_len = mm_root_len;
-#else
-	if (ap->flags & MOUNT_FLAG_REMOUNT) {
-		mnt_root = mm_root;
-		mnt_root_len = mm_root_len;
-	} else {
-		mnt_root = mkdtemp(t_dir);
-		if (!mnt_root)
-			return 1;
-		mnt_root_len = strlen(mnt_root);
-		mnt_tmp_root = (char *) mnt_root;
-	}
-#endif
 
 	if (me == me->multi) {
 		/* name = NULL */
 		/* destination = mm_root */
-		target = mm_root;
 		mm_base = "/";
 
 		/* Mount root offset if it exists */
@@ -1263,18 +1131,10 @@ static int mount_subtree(struct autofs_p
 				warn(ap->logopt,
 				      MODPREFIX "failed to parse root offset");
 				cache_delete_offset_list(me->mc, name);
-				goto error_out;
+				return 1;
 			}
 			ro_len = strlen(ro_loc);
 
-#ifdef ENABLE_MOUNT_MOVE
-			if (!(ap->flags & MOUNT_FLAG_REMOUNT)) {
-				move = MOUNT_MOVE_OTHER;
-				if (check_fstype_autofs_option(myoptions))
-					move = MOUNT_MOVE_AUTOFS;
-			}
-#endif
-
 			tmp = alloca(mnt_root_len + 1);
 			strcpy(tmp, mnt_root);
 			tmp[mnt_root_len] = '/';
@@ -1293,44 +1153,25 @@ static int mount_subtree(struct autofs_p
 				error(ap->logopt, MODPREFIX
 					 "failed to mount offset triggers");
 				cleanup_multi_triggers(ap, me, mnt_root, start, mm_base);
-				cleanup_multi_root(ap, mnt_root, mm_root, move);
-				goto error_out;
+				return 1;
 			}
 		} else if (rv <= 0) {
-#ifdef ENABLE_MOUNT_MOVE
-			move = MOUNT_MOVE_NONE;
-#endif
 			ret = mount_multi_triggers(ap, me, mm_root, start, mm_base);
 			if (ret == -1) {
 				error(ap->logopt, MODPREFIX
 					 "failed to mount offset triggers");
 				cleanup_multi_triggers(ap, me, mm_root, start, mm_base);
-				goto error_out;
+				return 1;
 			}
 		}
 	} else {
 		int loclen = strlen(loc);
 		int namelen = strlen(name);
 
-#ifndef ENABLE_MOUNT_MOVE
-		/*
-		 * When using move mount to mount offsets or direct mounts
-		 * the base of the tree can be the base of the temporary
-		 * mount point it needs to be the full path when not moving
-		 * the mount after construction.
-		 */
 		mnt_root = name;
-#else
-		if (!(ap->flags & MOUNT_FLAG_REMOUNT)) {
-			move = MOUNT_MOVE_OTHER;
-			if (check_fstype_autofs_option(options))
-				move = MOUNT_MOVE_AUTOFS;
-		}
-#endif
 
 		/* name = mm_root + mm_base */
 		/* destination = mm_root + mm_base = name */
-		target = name;
 		mm_base = &me->key[start];
 
 		rv = sun_mount(ap, mnt_root, name, namelen, loc, loclen, options, ctxt);
@@ -1340,16 +1181,11 @@ static int mount_subtree(struct autofs_p
 				error(ap->logopt, MODPREFIX
 					 "failed to mount offset triggers");
 				cleanup_multi_triggers(ap, me, mnt_root, start, mm_base);
-				cleanup_multi_root(ap, mnt_root, mm_root, move);
-				goto error_out;
+				return 1;
 			}
 		} else if (rv < 0) {
 			char *mm_root_base = alloca(strlen(mm_root) + strlen(mm_base) + 1);
 	
-#ifdef ENABLE_MOUNT_MOVE
-			move = MOUNT_MOVE_NONE;
-#endif
-
 			strcpy(mm_root_base, mm_root);
 			strcat(mm_root_base, mm_base);
 
@@ -1358,22 +1194,11 @@ static int mount_subtree(struct autofs_p
 				error(ap->logopt, MODPREFIX
 					 "failed to mount offset triggers");
 				cleanup_multi_triggers(ap, me, mm_root, start, mm_base);
-				goto error_out;
+				return 1;
 			}
 		}
 	}
 
-#ifdef ENABLE_MOUNT_MOVE
-	if (!move_mount(ap, mnt_root, target, move)) {
-		cleanup_multi_triggers(ap, me, mnt_root, start, mm_base);
-		cleanup_multi_root(ap, mnt_root, mm_root, move);
-		goto error_out;
-	}
-
-	if (mnt_tmp_root)
-		rmdir(mnt_tmp_root);
-#endif
-
 	/* Mount for base of tree failed */
 	if (rv > 0)
 		return rv;
@@ -1386,14 +1211,6 @@ static int mount_subtree(struct autofs_p
 		rv = 0;
 
 	return rv;
-
-error_out:
-#ifdef ENABLE_MOUNT_MOVE
-	if (mnt_tmp_root)
-		rmdir(mnt_tmp_root);
-#endif
-
-	return 1;
 }
 
 /*