Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/autofs autofs: Change autounmountd(8) to use time_t...



details:   https://anonhg.NetBSD.org/src/rev/08f2ddfe0f98
branches:  trunk
changeset: 846523:08f2ddfe0f98
user:      tkusumi <tkusumi%NetBSD.org@localhost>
date:      Thu Nov 21 16:45:05 2019 +0000

description:
autofs: Change autounmountd(8) to use time_t for duration instead of double

The commit log from FreeBSD.
--
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.
--

Taken-from: FreeBSD and DragonFlyBSD

diffstat:

 usr.sbin/autofs/autounmountd.c |  47 ++++++++++++++++++++---------------------
 1 files changed, 23 insertions(+), 24 deletions(-)

diffs (133 lines):

diff -r f019d02ae7cf -r 08f2ddfe0f98 usr.sbin/autofs/autounmountd.c
--- a/usr.sbin/autofs/autounmountd.c    Thu Nov 21 15:24:17 2019 +0000
+++ b/usr.sbin/autofs/autounmountd.c    Thu Nov 21 16:45:05 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: autounmountd.c,v 1.1 2018/01/09 03:31:15 christos Exp $        */
+/*     $NetBSD: autounmountd.c,v 1.2 2019/11/21 16:45:05 tkusumi Exp $ */
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  *
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: autounmountd.c,v 1.1 2018/01/09 03:31:15 christos Exp $");
+__RCSID("$NetBSD: autounmountd.c,v 1.2 2019/11/21 16:45:05 tkusumi Exp $");
 
 #include <sys/types.h>
 #include <sys/mount.h>
@@ -175,12 +175,12 @@
        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);
@@ -188,14 +188,14 @@
        log_debugx("expiring automounted filesystems");
 
        TAILQ_FOREACH_SAFE(af, &automounted, af_next, tmpaf) {
-               mounted_for = difftime(now, af->af_mount_time);
+               mounted_for = (time_t)difftime(now, af->af_mount_time);
 
                if (mounted_for < expiration_time) {
                        log_debugx("skipping %s (FSID:%d:%d), mounted "
-                           "for %.0f seconds", af->af_mountpoint,
+                           "for %jd seconds", af->af_mountpoint,
                            af->af_fsid.__fsid_val[0],
                            af->af_fsid.__fsid_val[1],
-                           mounted_for);
+                           (intmax_t)mounted_for);
 
                        if (mounted_for > mounted_max)
                                mounted_max = mounted_for;
@@ -204,9 +204,9 @@
                }
 
                log_debugx("filesystem mounted on %s (FSID:%d:%d), "
-                   "was mounted for %.0f seconds; unmounting",
+                   "was mounted for %jd seconds; unmounting",
                    af->af_mountpoint, af->af_fsid.__fsid_val[0],
-                   af->af_fsid.__fsid_val[1], mounted_for);
+                   af->af_fsid.__fsid_val[1], (intmax_t)mounted_for);
                error = do_unmount(af->af_fsid, af->af_mountpoint);
                if (error != 0) {
                        if (mounted_for > mounted_max)
@@ -227,19 +227,19 @@
 }
 
 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 = (int)sleep_time;
                timeout.tv_nsec = 0;
 
-               log_debugx("waiting for filesystem event for %.0f seconds",
-                   sleep_time);
+               log_debugx("waiting for filesystem event for %jd seconds",
+                   (intmax_t)sleep_time);
                nevents = kevent(kq, NULL, 0, &unused, 1, &timeout);
        } else {
                log_debugx("waiting for filesystem event");
@@ -253,7 +253,7 @@
 
        if (nevents == 0) {
                log_debugx("timeout reached");
-               assert(sleep_time > 0.0);
+               assert(sleep_time > 0);
        } else {
                log_debugx("got filesystem event");
        }
@@ -264,7 +264,7 @@
 {
        struct kevent event;
        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) {
@@ -333,19 +333,18 @@
        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 = 
-                           (double)difftime((time_t)expiration_time,
-                           (time_t)mounted_max);
-                       log_debugx("some filesystems expire in %.0f seconds",
-                           sleep_time);
+                       sleep_time =
+                           (time_t)difftime(expiration_time, mounted_max);
+                       log_debugx("some filesystems expire in %jd seconds",
+                           (intmax_t)sleep_time);
                } else {
                        sleep_time = retry_time;
                        log_debugx("some expired filesystems remain mounted, "
-                           "will retry in %.0f seconds", sleep_time);
+                           "will retry in %jd seconds", (intmax_t)sleep_time);
                }
 
                do_wait(kq, sleep_time);



Home | Main Index | Thread Index | Old Index