aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/autofs/automount.c
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/automount.c
parenta0252a0a822d14b7c5c0365b7fce495b8bcc572b (diff)
downloadsrc-e3d5f1fe3b6084a77eb433d84009c38cb1c4dfd6.tar.gz
src-e3d5f1fe3b6084a77eb433d84009c38cb1c4dfd6.zip
Implement "automount -c".
MFC after: 1 month Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=274859
Diffstat (limited to 'usr.sbin/autofs/automount.c')
-rw-r--r--usr.sbin/autofs/automount.c65
1 files changed, 62 insertions, 3 deletions
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);