aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorJustin Hibbits <jhibbits@FreeBSD.org>2019-08-08 03:16:32 +0000
committerJustin Hibbits <jhibbits@FreeBSD.org>2019-08-08 03:16:32 +0000
commitca05fff09038c0818e3d333fdff56ebafbf6efd9 (patch)
tree629e8d4c26d7f25b8bd162b58cb7fb5a361f9d90 /usr.sbin
parent7d0658ad555072c65634165e39a7cd79a07bcdf2 (diff)
downloadsrc-ca05fff09038c0818e3d333fdff56ebafbf6efd9.tar.gz
src-ca05fff09038c0818e3d333fdff56ebafbf6efd9.zip
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
Notes
Notes: svn path=/head/; revision=350737
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/autofs/autounmountd.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/usr.sbin/autofs/autounmountd.c b/usr.sbin/autofs/autounmountd.c
index 539bde5e6e77..6f1c0b856f98 100644
--- a/usr.sbin/autofs/autounmountd.c
+++ b/usr.sbin/autofs/autounmountd.c
@@ -179,12 +179,12 @@ unmount_by_fsid(const fsid_t fsid, const char *mountpoint)
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);