svn commit: r277834 - head/usr.sbin/autofs

Edward Tomasz Napierala trasz at FreeBSD.org
Wed Jan 28 15:46:12 UTC 2015


Author: trasz
Date: Wed Jan 28 15:46:11 2015
New Revision: 277834
URL: https://svnweb.freebsd.org/changeset/base/277834

Log:
  When there are no automounted filesystems, autounmountd(8) should wait
  for filesystem event, instead of looping on a timeout.
  
  MFC after:	1 month
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/usr.sbin/autofs/autounmountd.c

Modified: head/usr.sbin/autofs/autounmountd.c
==============================================================================
--- head/usr.sbin/autofs/autounmountd.c	Wed Jan 28 15:37:35 2015	(r277833)
+++ head/usr.sbin/autofs/autounmountd.c	Wed Jan 28 15:46:11 2015	(r277834)
@@ -182,7 +182,7 @@ expire_automounted(double expiration_tim
 {
 	struct automounted_fs *af, *tmpaf;
 	time_t now;
-	double mounted_for, mounted_max = 0;
+	double mounted_for, mounted_max = -1.0;
 	int error;
 
 	now = time(NULL);
@@ -231,21 +231,28 @@ do_wait(int kq, double sleep_time)
 {
 	struct timespec timeout;
 	struct kevent unused;
-	int error;
-
-	assert(sleep_time > 0);
-	timeout.tv_sec = sleep_time;
-	timeout.tv_nsec = 0;
+	int nevents;
 
-	log_debugx("waiting for filesystem event for %.0f seconds", sleep_time);
-	error = kevent(kq, NULL, 0, &unused, 1, &timeout);
-	if (error < 0)
+	if (sleep_time != -1.0) {
+		assert(sleep_time > 0.0);
+		timeout.tv_sec = sleep_time;
+		timeout.tv_nsec = 0;
+
+		log_debugx("waiting for filesystem event for %.0f seconds", sleep_time);
+		nevents = kevent(kq, NULL, 0, &unused, 1, &timeout);
+	} else {
+		log_debugx("waiting for filesystem event");
+		nevents = kevent(kq, NULL, 0, &unused, 1, NULL);
+	}
+	if (nevents < 0)
 		log_err(1, "kevent");
 
-	if (error == 0)
+	if (nevents == 0) {
 		log_debugx("timeout reached");
-	else
+		assert(sleep_time > 0.0);
+	} else {
 		log_debugx("got filesystem event");
+	}
 }
 
 int
@@ -324,7 +331,10 @@ main_autounmountd(int argc, char **argv)
 	for (;;) {
 		refresh_automounted();
 		mounted_max = expire_automounted(expiration_time);
-		if (mounted_max < expiration_time) {
+		if (mounted_max == -1.0) {
+			sleep_time = mounted_max;
+			log_debugx("no filesystems to expire");
+		} else if (mounted_max < expiration_time) {
 			sleep_time = difftime(expiration_time, mounted_max);
 			log_debugx("some filesystems expire in %.0f seconds",
 			    sleep_time);


More information about the svn-src-head mailing list