Author: trasz
Date: Sat Mar  7 19:45:07 2015
New Revision: 279745
URL: https://svnweb.freebsd.org/changeset/base/279745

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

Modified:
  stable/10/usr.sbin/autofs/autounmountd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/autofs/autounmountd.c
==============================================================================
--- stable/10/usr.sbin/autofs/autounmountd.c    Sat Mar  7 19:41:58 2015        
(r279744)
+++ stable/10/usr.sbin/autofs/autounmountd.c    Sat Mar  7 19:45:07 2015        
(r279745)
@@ -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);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "[email protected]"

Reply via email to