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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to