70 lines
2.1 KiB
Diff
70 lines
2.1 KiB
Diff
|
autofs-5.1.4 - set bind mount as propagation slave
|
||
|
|
||
|
From: Ian Kent <raven@themaw.net>
|
||
|
|
||
|
When using a multi-mount with mount targets that are on the
|
||
|
local machine and resulting bind mounts are made to a file
|
||
|
system that is mount propagation shared (such as the root
|
||
|
file system on systemd managed systems) the autofs offset
|
||
|
mount triggers made within the bind mount will be propagated
|
||
|
back to the target file system.
|
||
|
|
||
|
When this happens the target of the offset (the unwanted
|
||
|
propagated mount) is itself an autofs trigger mount and
|
||
|
accessing the path results in a deadlock.
|
||
|
|
||
|
In order for these multi-mounts to function properly in this
|
||
|
case bind mounts that contain mount triggers must be set to
|
||
|
propagation slave or private so the backward propagation
|
||
|
doesn't occur.
|
||
|
|
||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||
|
---
|
||
|
CHANGELOG | 1 +
|
||
|
modules/mount_bind.c | 16 +++++++++++++++-
|
||
|
2 files changed, 16 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||
|
+++ autofs-5.1.4/CHANGELOG
|
||
|
@@ -30,6 +30,7 @@ xx/xx/2018 autofs-5.1.5
|
||
|
- fix program usage message.
|
||
|
- fix update_negative_cache() map source usage.
|
||
|
- mark removed cache entry negative.
|
||
|
+- set bind mount as propagation slave.
|
||
|
|
||
|
19/12/2017 autofs-5.1.4
|
||
|
- fix spec file url.
|
||
|
--- autofs-5.1.4.orig/modules/mount_bind.c
|
||
|
+++ autofs-5.1.4/modules/mount_bind.c
|
||
|
@@ -20,6 +20,7 @@
|
||
|
#include <sys/param.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/stat.h>
|
||
|
+#include <sys/mount.h>
|
||
|
|
||
|
#define MODULE_MOUNT
|
||
|
#include "automount.h"
|
||
|
@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap,
|
||
|
debug(ap->logopt,
|
||
|
MODPREFIX "mounted %s type %s on %s",
|
||
|
what, fstype, fullpath);
|
||
|
- return 0;
|
||
|
}
|
||
|
+
|
||
|
+ /* The bind mount has succeeded but if the target
|
||
|
+ * mount is propagation shared propagation of child
|
||
|
+ * mounts (autofs offset mounts for example) back to
|
||
|
+ * the target of the bind mount must be avoided or
|
||
|
+ * autofs trigger mounts will deadlock.
|
||
|
+ */
|
||
|
+ err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
||
|
+ if (err)
|
||
|
+ warn(ap->logopt,
|
||
|
+ "failed to set propagation type for %s",
|
||
|
+ fullpath);
|
||
|
+
|
||
|
+ return 0;
|
||
|
} else {
|
||
|
char *cp;
|
||
|
char basepath[PATH_MAX];
|