132 lines
4.1 KiB
Diff
132 lines
4.1 KiB
Diff
autofs-5.1.8 - make submount cleanup the same as top level mounts
|
|
|
|
From: Ian Kent <raven@themaw.net>
|
|
|
|
We often see segfaults when cleaning up resources at submount shutdown
|
|
after changes are made to resolve problems. It's always really hard to
|
|
work out what's causing these to happen.
|
|
|
|
But changing submounts to use the same final cleanup method as top level
|
|
mounts eliminates the faulting, at least in the case of the most recent
|
|
changes, hopefully this change in proceedure will continue to work.
|
|
Admitedly there's some setting of fields to NULL after freeing but that
|
|
didn't fix the problem until the procedure change was also made.
|
|
|
|
In any case the result is a consistency improvement.
|
|
|
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
|
---
|
|
CHANGELOG | 1 +
|
|
daemon/automount.c | 17 +++--------------
|
|
daemon/master.c | 19 +++++++++++++++++--
|
|
modules/mount_autofs.c | 6 +++---
|
|
4 files changed, 24 insertions(+), 19 deletions(-)
|
|
|
|
--- autofs-5.1.7.orig/CHANGELOG
|
|
+++ autofs-5.1.7/CHANGELOG
|
|
@@ -150,6 +150,7 @@
|
|
- dont take parent source lock at mount shutdown.
|
|
- eliminate buffer usage from handle_mounts_cleanup().
|
|
- fix possible use after free in handle_mounts_exit().
|
|
+- make submount cleanup the same as top level mounts.
|
|
|
|
25/01/2021 autofs-5.1.7
|
|
- make bind mounts propagation slave by default.
|
|
--- autofs-5.1.7.orig/daemon/automount.c
|
|
+++ autofs-5.1.7/daemon/automount.c
|
|
@@ -1769,21 +1769,10 @@ static void handle_mounts_cleanup(void *
|
|
master_source_unlock(ap->entry);
|
|
|
|
/*
|
|
- * Submounts are detached threads and don't belong to the
|
|
- * master map entry list so we need to free their resources
|
|
- * here.
|
|
+ * Send a signal to the signal handler so it can join with any
|
|
+ * completed handle_mounts() threads and perform final cleanup.
|
|
*/
|
|
- if (submount) {
|
|
- master_free_mapent_sources(ap->entry, 1);
|
|
- master_free_mapent(ap->entry);
|
|
- }
|
|
-
|
|
- /*
|
|
- * If we are not a submount send a signal to the signal handler
|
|
- * so it can join with any completed handle_mounts() threads and
|
|
- * perform final cleanup.
|
|
- */
|
|
- if (!submount && !pending)
|
|
+ if (!pending)
|
|
pthread_kill(signal_handler_thid, SIGTERM);
|
|
|
|
master_mutex_unlock();
|
|
--- autofs-5.1.7.orig/daemon/master.c
|
|
+++ autofs-5.1.7/daemon/master.c
|
|
@@ -384,11 +384,14 @@ static void __master_free_map_source(str
|
|
|
|
instance = source->instance;
|
|
while (instance) {
|
|
- if (instance->lookup)
|
|
+ if (instance->lookup) {
|
|
close_lookup(instance->lookup);
|
|
+ instance->lookup = NULL;
|
|
+ }
|
|
instance = instance->next;
|
|
}
|
|
close_lookup(source->lookup);
|
|
+ source->lookup = NULL;
|
|
}
|
|
if (source->argv)
|
|
free_argv(source->argc, source->argv);
|
|
@@ -401,6 +404,7 @@ static void __master_free_map_source(str
|
|
__master_free_map_source(instance, 0);
|
|
instance = next;
|
|
}
|
|
+ source->instance = NULL;
|
|
}
|
|
|
|
status = pthread_rwlock_destroy(&source->module_lock);
|
|
@@ -863,9 +867,20 @@ void master_add_mapent(struct master *ma
|
|
void master_remove_mapent(struct master_mapent *entry)
|
|
{
|
|
struct master *master = entry->master;
|
|
+ struct autofs_point *ap = entry->ap;
|
|
+
|
|
+ if (ap->submount) {
|
|
+ struct mnt_list *mnt;
|
|
|
|
- if (entry->ap->submount)
|
|
+ mnt = mnts_find_submount(ap->path);
|
|
+ if (mnt) {
|
|
+ warn(ap->logopt,
|
|
+ "map entry %s in use at shutdown", ap->path);
|
|
+ mnts_put_mount(mnt);
|
|
+ }
|
|
+ list_add(&entry->join, &master->completed);
|
|
return;
|
|
+ }
|
|
|
|
if (!list_empty(&entry->list)) {
|
|
list_del_init(&entry->list);
|
|
--- autofs-5.1.7.orig/modules/mount_autofs.c
|
|
+++ autofs-5.1.7/modules/mount_autofs.c
|
|
@@ -28,8 +28,8 @@
|
|
|
|
#define MODPREFIX "mount(autofs): "
|
|
|
|
-/* Attribute to create detached thread */
|
|
-extern pthread_attr_t th_attr_detached;
|
|
+/* Attributes to create handle_mounts() thread */
|
|
+extern pthread_attr_t th_attr;
|
|
extern struct startup_cond suc;
|
|
|
|
int mount_version = AUTOFS_MOUNT_VERSION; /* Required by protocol */
|
|
@@ -327,7 +327,7 @@ int mount_mount(struct autofs_point *ap,
|
|
suc.done = 0;
|
|
suc.status = 0;
|
|
|
|
- if (pthread_create(&thid, &th_attr_detached, handle_mounts, &suc)) {
|
|
+ if (pthread_create(&thid, &th_attr, handle_mounts, &suc)) {
|
|
crit(ap->logopt,
|
|
MODPREFIX
|
|
"failed to create mount handler thread for %s",
|