aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/autofs
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2014-11-22 16:48:29 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2014-11-22 16:48:29 +0000
commite3d5f1fe3b6084a77eb433d84009c38cb1c4dfd6 (patch)
tree6088e5441930af0ea1b89602a6e20465f0f0f0f6 /usr.sbin/autofs
parenta0252a0a822d14b7c5c0365b7fce495b8bcc572b (diff)
downloadsrc-e3d5f1fe3b6084a77eb433d84009c38cb1c4dfd6.tar.gz
src-e3d5f1fe3b6084a77eb433d84009c38cb1c4dfd6.zip
Notes
Diffstat (limited to 'usr.sbin/autofs')
-rw-r--r--usr.sbin/autofs/automount.86
-rw-r--r--usr.sbin/autofs/automount.c65
2 files changed, 67 insertions, 4 deletions
diff --git a/usr.sbin/autofs/automount.8 b/usr.sbin/autofs/automount.8
index 2988c68069db..c111a993e2ac 100644
--- a/usr.sbin/autofs/automount.8
+++ b/usr.sbin/autofs/automount.8
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 20, 2014
+.Dd November 22, 2014
.Dt AUTOMOUNT 8
.Os
.Sh NAME
@@ -37,6 +37,7 @@
.Nm
.Op Fl D Ar name=value
.Op Fl L
+.Op Fl c
.Op Fl f
.Op Fl o Ar options
.Op Fl v
@@ -64,6 +65,9 @@ and any direct maps, then print them to standard output.
When specified more than once, all the maps, including indirect ones,
will be parsed and shown.
This is useful when debugging configuration problems.
+.It Fl c
+Flush caches, discarding possibly stale information obtained from maps
+and directory services.
.It Fl f
Force unmount, to be used with
.Fl u .
diff --git a/usr.sbin/autofs/automount.c b/usr.sbin/autofs/automount.c
index a956b08dd5ed..3c59704b5c58 100644
--- a/usr.sbin/autofs/automount.c
+++ b/usr.sbin/autofs/automount.c
@@ -230,6 +230,57 @@ mount_unmount(struct node *root)
}
static void
+flush_autofs(const char *fspath)
+{
+ struct iovec *iov = NULL;
+ char errmsg[255];
+ int error, iovlen = 0;
+
+ log_debugx("flushing %s", fspath);
+ memset(errmsg, 0, sizeof(errmsg));
+
+ build_iovec(&iov, &iovlen, "fstype",
+ __DECONST(void *, "autofs"), (size_t)-1);
+ build_iovec(&iov, &iovlen, "fspath",
+ __DECONST(void *, fspath), (size_t)-1);
+ build_iovec(&iov, &iovlen, "errmsg",
+ errmsg, sizeof(errmsg));
+
+ error = nmount(iov, iovlen, MNT_UPDATE);
+ if (error != 0) {
+ if (*errmsg != '\0') {
+ log_err(1, "cannot flush %s: %s",
+ fspath, errmsg);
+ } else {
+ log_err(1, "cannot flush %s", fspath);
+ }
+ }
+}
+
+static void
+flush_caches(void)
+{
+ struct statfs *mntbuf;
+ int i, nitems;
+
+ nitems = getmntinfo(&mntbuf, MNT_WAIT);
+ if (nitems <= 0)
+ log_err(1, "getmntinfo");
+
+ log_debugx("flushing autofs caches");
+
+ for (i = 0; i < nitems; i++) {
+ if (strcmp(mntbuf[i].f_fstypename, "autofs") != 0) {
+ log_debugx("skipping %s, filesystem type is not autofs",
+ mntbuf[i].f_mntonname);
+ continue;
+ }
+
+ flush_autofs(mntbuf[i].f_mntonname);
+ }
+}
+
+static void
unmount_automounted(bool force)
{
struct statfs *mntbuf;
@@ -262,7 +313,7 @@ static void
usage_automount(void)
{
- fprintf(stderr, "usage: automount [-D name=value][-o opts][-Lfuv]\n");
+ fprintf(stderr, "usage: automount [-D name=value][-o opts][-Lcfuv]\n");
exit(1);
}
@@ -272,7 +323,7 @@ main_automount(int argc, char **argv)
struct node *root;
int ch, debug = 0, show_maps = 0;
char *options = NULL;
- bool do_unmount = false, force_unmount = false;
+ bool do_unmount = false, force_unmount = false, flush = false;
/*
* Note that in automount(8), the only purpose of variable
@@ -280,7 +331,7 @@ main_automount(int argc, char **argv)
*/
defined_init();
- while ((ch = getopt(argc, argv, "D:Lfo:uv")) != -1) {
+ while ((ch = getopt(argc, argv, "D:Lfco:uv")) != -1) {
switch (ch) {
case 'D':
defined_parse_and_add(optarg);
@@ -288,6 +339,9 @@ main_automount(int argc, char **argv)
case 'L':
show_maps++;
break;
+ case 'c':
+ flush = true;
+ break;
case 'f':
force_unmount = true;
break;
@@ -319,6 +373,11 @@ main_automount(int argc, char **argv)
log_init(debug);
+ if (flush) {
+ flush_caches();
+ return (0);
+ }
+
if (do_unmount) {
unmount_automounted(force_unmount);
return (0);