5a4722cbbe
mounts. Jira: https://issues.redhat.com/browse/RHEL-18035 In commit 635b90ecc (autofs-5.1.8 - fix mount tree startup reconnect) when getting the parent the check for a multi-mount should include a check for the root of the multi-mount as well since the root does not set the parent. There's also a possible deadlock when re-connecting to existing direct mounts. If we're starting up or trying to re-connect to an existing direct mount we could be iterating through the map entries with the readlock held so we can't just take the writelock for direct mounts. But when trying to re-connect to an existing mount at startup there won't be any other process updating the map entry cache. Signed-off-by: Ian Kent <ikent@redhat.com>
69 lines
2.3 KiB
Diff
69 lines
2.3 KiB
Diff
autofs-5.1.9 - fix deadlock in remount
|
|
|
|
From: Ian Kent <raven@themaw.net>
|
|
|
|
If we're starting up or trying to re-connect to an existing direct mount
|
|
we could be iterating through the map entries with the cache readlock
|
|
held so we can't just take the writelock for direct mounts. But when
|
|
trying to re-connect to an existing mount at startup there won't be any
|
|
other process updating the map entry cache.
|
|
|
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
|
---
|
|
CHANGELOG | 1 +
|
|
modules/parse_sun.c | 26 ++++++++++++++++++++++++--
|
|
2 files changed, 25 insertions(+), 2 deletions(-)
|
|
|
|
--- autofs-5.1.4.orig/CHANGELOG
|
|
+++ autofs-5.1.4/CHANGELOG
|
|
@@ -153,6 +153,7 @@
|
|
- allow -null map in indirect maps.
|
|
- fix multi-mount check.
|
|
- fix get parent multi-mount check in try_remount().
|
|
+- fix deadlock in remount.
|
|
|
|
xx/xx/2018 autofs-5.1.5
|
|
- fix flag file permission.
|
|
--- autofs-5.1.4.orig/modules/parse_sun.c
|
|
+++ autofs-5.1.4/modules/parse_sun.c
|
|
@@ -888,7 +888,18 @@ update_offset_entry(struct autofs_point
|
|
strcpy(m_mapent, loc);
|
|
}
|
|
|
|
- cache_writelock(mc);
|
|
+ /*
|
|
+ * If we're starting up or trying to re-connect to an existing
|
|
+ * direct mount we could be iterating through the map entries
|
|
+ * with the readlock held so we can't just take the writelock
|
|
+ * for direct mounts. But at when trying to re-connect to an
|
|
+ * existing mount at startup there won't be any other process
|
|
+ * updating the map entry cache.
|
|
+ */
|
|
+ if (ap->state == ST_INIT && ap->flags & MOUNT_FLAG_REMOUNT)
|
|
+ cache_readlock(mc);
|
|
+ else
|
|
+ cache_writelock(mc);
|
|
ret = cache_update_offset(mc, name, m_key, m_mapent, age);
|
|
|
|
me = cache_lookup_distinct(mc, m_key);
|
|
@@ -1580,7 +1591,18 @@ dont_expand:
|
|
free(myoptions);
|
|
} while (*p == '/' || (*p == '"' && *(p + 1) == '/'));
|
|
|
|
- cache_writelock(mc);
|
|
+ /*
|
|
+ * If we're starting up or trying to re-connect to an existing
|
|
+ * direct mount we could be iterating through the map entries
|
|
+ * with the readlock held so we can't just take the writelock
|
|
+ * for direct mounts. But at when trying to re-connect to an
|
|
+ * existing mount at startup there won't be any other process
|
|
+ * updating the map entry cache.
|
|
+ */
|
|
+ if (ap->state == ST_INIT && ap->flags & MOUNT_FLAG_REMOUNT)
|
|
+ cache_readlock(mc);
|
|
+ else
|
|
+ cache_writelock(mc);
|
|
me = cache_lookup_distinct(mc, name);
|
|
if (!me) {
|
|
cache_unlock(mc);
|