[PATCH] ACPI: Make sure that the alarm math is correct

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

 



On June 30, we were running some suspend/resume cycles with an 
alarm time set through /proc/acpi/alarm.  We discovered the next morning
that all of the boxes were suspended.  Investigation showed that they
all had an alarm set for June 31.. :)

It turns out the /proc/acpi/alarm code assumes 31 days for all months.
The attached patch does the correct math.  I know this is a deprecated
interface, but I figure that as long as the code is living in Linus's
tree, it should be correct.

Jordan

-- 
Jordan Crouse
Systems Software Development Engineer 
Advanced Micro Devices, Inc.
[PATCH] ACPI: Make sure that the alarm math is correct

From: Jordan Crouse <jordan.crouse@xxxxxxx>

The current /proc/acpi/alarm math assumes that every month has 31 days.
This patch figures out the correct number of days in the month.

Signed-off-by: Jordan Crouse <jordan.crouse@xxxxxxx>
---

 drivers/acpi/sleep/proc.c |   28 +++++++++++++++++++++++++---
 1 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c
index 4ebbba2..19c150b 100644
--- a/drivers/acpi/sleep/proc.c
+++ b/drivers/acpi/sleep/proc.c
@@ -283,10 +283,32 @@ acpi_system_write_alarm(struct file *file,
 		day += hr/24;
 		hr = hr%24;
 	}
-	if (day > 31) {
-		mo += day/32;
-		day = day%32;
+
+	while(1) {
+		int tmo  = mo % 13;
+		int dinmo;
+
+		if (tmo == 2) {
+			if (((yr % 4 == 0) && (yr % 100 != 0)) ||
+			    (yr % 400 == 0))
+				dinmo=29;
+			else
+				dinmo=28;
+		}
+		else if (tmo == 1 || tmo == 3 || tmo == 5 ||
+			 tmo == 7 || tmo == 8 || tmo == 10 ||
+			 tmo == 12)
+			 dinmo=31;
+		else
+			dinmo=30;
+
+		if (day <= dinmo)
+			break;
+
+		mo  += 1;
+		day -= dinmo;
 	}
+
 	if (mo > 12) {
 		yr += mo/13;
 		mo = mo%13;

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux