From fb6c1a0ce3dd14977eb09c794d5a395509aa62ba Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 1 Mar 2004 07:04:56 -0800 Subject: [PATCH] sys_alarm() return value fix From: Kurt Garloff when calling alarm(1); alarm(0); the second alarm can wrongly return 2. This makes an LSB test fail. It happens due to rounding errors in the timeval to jiffie conversion and back. On i386 with HZ =3D=3D 1000, there would not need to be rounding error IMVHO, but they even occur there. On HZ=3D1024 platforms, they may even be unavoidable. Attached patch fixes the return value of alarm(). --- kernel/timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'kernel/timer.c') diff --git a/kernel/timer.c b/kernel/timer.c index 51df7364331c..f88763c4d820 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -868,7 +868,7 @@ asmlinkage unsigned long sys_alarm(unsigned int seconds) oldalarm = it_old.it_value.tv_sec; /* ehhh.. We can't return 0 if we have an alarm pending.. */ /* And we'd better return too much than too little anyway */ - if (it_old.it_value.tv_usec) + if ((!oldalarm && it_old.it_value.tv_usec) || it_old.it_value.tv_usec >= 500000) oldalarm++; return oldalarm; } -- cgit v1.2.3