Module Name: src Committed By: tkusumi Date: Thu Nov 21 16:45:05 UTC 2019
Modified Files: src/usr.sbin/autofs: autounmountd.c Log Message: 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 To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/autofs/autounmountd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/autofs/autounmountd.c diff -u src/usr.sbin/autofs/autounmountd.c:1.1 src/usr.sbin/autofs/autounmountd.c:1.2 --- src/usr.sbin/autofs/autounmountd.c:1.1 Tue Jan 9 03:31:15 2018 +++ src/usr.sbin/autofs/autounmountd.c Thu Nov 21 16:45:05 2019 @@ -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 @@ do_unmount(const fsid_t fsid __unused, c 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 @@ expire_automounted(double expiration_tim 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 @@ expire_automounted(double expiration_tim } 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 @@ 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 = (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 @@ 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"); } @@ -264,7 +264,7 @@ main_autounmountd(int argc, char **argv) { 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 @@ 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 = - (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);