Author: jhibbits
Date: Thu Aug  8 03:16:32 2019
New Revision: 350737
URL: https://svnweb.freebsd.org/changeset/base/350737

Log:
  Change autounmountd(8) to use time_t for duration instead of double
  
  Summary:
  autounmountd(8) uses doubles to handle mount time durations.  However,
  it must convert to integer types, time_t in particular, to do anything
  meaningful.  Additionally, even though it's a floating-point value in
  seconds, the sub-seconds component is never used, so it's unnecessary.
  
  Switching type to time_t fixes an assertion on powerpc64, which checks
  that a sleep value that's not -1.0 is greater than 0.  On powerpc64, it
  happens that the value of -1.0 gets loaded as a float (perhaps a bug in
  gcc), but gets compared to a double.  This compares as false, so follows
  through the 'sleep != -1.0' path, and fails the assert.  Since the
  sub-second component isn't used in the double, just drop it and deal
  with whole-integer seconds.
  
  Reviewed by:  trasz
  Differential Revision: https://reviews.freebsd.org/D21109

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

Modified: head/usr.sbin/autofs/autounmountd.c
==============================================================================
--- head/usr.sbin/autofs/autounmountd.c Thu Aug  8 03:01:35 2019        
(r350736)
+++ head/usr.sbin/autofs/autounmountd.c Thu Aug  8 03:16:32 2019        
(r350737)
@@ -179,12 +179,12 @@ unmount_by_fsid(const fsid_t fsid, const char *mountpo
        return (error);
 }
 
-static double
-expire_automounted(double expiration_time)
+static time_t
+expire_automounted(time_t expiration_time)
 {
        struct automounted_fs *af, *tmpaf;
        time_t now;
-       double mounted_for, mounted_max = -1.0;
+       time_t mounted_for, mounted_max = -1;
        int error;
 
        now = time(NULL);
@@ -196,9 +196,9 @@ expire_automounted(double expiration_time)
 
                if (mounted_for < expiration_time) {
                        log_debugx("skipping %s (FSID:%d:%d), mounted "
-                           "for %.0f seconds", af->af_mountpoint,
+                           "for %ld  seconds", af->af_mountpoint,
                            af->af_fsid.val[0], af->af_fsid.val[1],
-                           mounted_for);
+                           (long)mounted_for);
 
                        if (mounted_for > mounted_max)
                                mounted_max = mounted_for;
@@ -207,9 +207,9 @@ expire_automounted(double expiration_time)
                }
 
                log_debugx("filesystem mounted on %s (FSID:%d:%d), "
-                   "was mounted for %.0f seconds; unmounting",
+                   "was mounted for %ld seconds; unmounting",
                    af->af_mountpoint, af->af_fsid.val[0], af->af_fsid.val[1],
-                   mounted_for);
+                   (long)mounted_for);
                error = unmount_by_fsid(af->af_fsid, af->af_mountpoint);
                if (error != 0) {
                        if (mounted_for > mounted_max)
@@ -229,18 +229,19 @@ usage_autounmountd(void)
 }
 
 static void
-do_wait(int kq, double sleep_time)
+do_wait(int kq, time_t sleep_time)
 {
        struct timespec timeout;
        struct kevent unused;
        int nevents;
 
-       if (sleep_time != -1.0) {
-               assert(sleep_time > 0.0);
+       if (sleep_time != -1) {
+               assert(sleep_time > 0);
                timeout.tv_sec = sleep_time;
                timeout.tv_nsec = 0;
 
-               log_debugx("waiting for filesystem event for %.0f seconds", 
sleep_time);
+               log_debugx("waiting for filesystem event for %ld seconds",
+                   (long)sleep_time);
                nevents = kevent(kq, NULL, 0, &unused, 1, &timeout);
        } else {
                log_debugx("waiting for filesystem event");
@@ -254,7 +255,7 @@ do_wait(int kq, double sleep_time)
 
        if (nevents == 0) {
                log_debugx("timeout reached");
-               assert(sleep_time > 0.0);
+               assert(sleep_time > 0);
        } else {
                log_debugx("got filesystem event");
        }
@@ -268,7 +269,7 @@ main_autounmountd(int argc, char **argv)
        pid_t otherpid;
        const char *pidfile_path = AUTOUNMOUNTD_PIDFILE;
        int ch, debug = 0, error, kq;
-       double expiration_time = 600, retry_time = 600, mounted_max, sleep_time;
+       time_t expiration_time = 600, retry_time = 600, mounted_max, sleep_time;
        bool dont_daemonize = false;
 
        while ((ch = getopt(argc, argv, "dr:t:v")) != -1) {
@@ -336,17 +337,17 @@ main_autounmountd(int argc, char **argv)
        for (;;) {
                refresh_automounted();
                mounted_max = expire_automounted(expiration_time);
-               if (mounted_max == -1.0) {
+               if (mounted_max == -1) {
                        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);
+                       log_debugx("some filesystems expire in %ld  seconds",
+                           (long)sleep_time);
                } else {
                        sleep_time = retry_time;
                        log_debugx("some expired filesystems remain mounted, "
-                           "will retry in %.0f seconds", sleep_time);
+                           "will retry in %ld  seconds", (long)sleep_time);
                }
 
                do_wait(kq, sleep_time);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to