Module Name:    src
Committed By:   tkusumi
Date:           Sat Nov 16 09:22:00 UTC 2019

Modified Files:
        src/sys/fs/autofs: autofs_vfsops.c

Log Message:
autofs: Fix change by r1.3 "prevent assert on unmount."

Must delete all nodes on unmount, otherwise automounts with >1 level of 
directories can't be deleted.
taken-from: FreeBSD and DragonFlyBSD


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/fs/autofs/autofs_vfsops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/autofs/autofs_vfsops.c
diff -u src/sys/fs/autofs/autofs_vfsops.c:1.5 src/sys/fs/autofs/autofs_vfsops.c:1.6
--- src/sys/fs/autofs/autofs_vfsops.c:1.5	Thu Nov 14 08:45:24 2019
+++ src/sys/fs/autofs/autofs_vfsops.c	Sat Nov 16 09:22:00 2019
@@ -33,7 +33,7 @@
  *
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autofs_vfsops.c,v 1.5 2019/11/14 08:45:24 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autofs_vfsops.c,v 1.6 2019/11/16 09:22:00 tkusumi Exp $");
 
 
 #include "autofs.h"
@@ -232,13 +232,14 @@ autofs_unmount(struct mount *mp, int mnt
 	mutex_enter(&amp->am_lock);
 	while (!RB_EMPTY(&amp->am_root->an_children)) {
 		struct autofs_node *anp;
+		/*
+		 * Force delete all nodes when more than one level of
+		 * directories are created via indirect map. Autofs doesn't
+		 * support rmdir(2), thus this is the only way to get out.
+		 */
 		anp = RB_MIN(autofs_node_tree, &amp->am_root->an_children);
-		if (!RB_EMPTY(&anp->an_children)) {
-			AUTOFS_DEBUG("%s: %s has children", __func__,
-			    anp->an_name);
-			mutex_exit(&amp->am_lock);
-			return EBUSY;
-		}
+		while (!RB_EMPTY(&anp->an_children))
+			anp = RB_MIN(autofs_node_tree, &anp->an_children);
 		autofs_node_delete(anp);
 	}
 	autofs_node_delete(amp->am_root);

Reply via email to