diff options
author | Hyogi Gim <hyogi.gim@lge.com> | 2014-08-08 17:20:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-08 18:57:20 -0400 |
commit | e1d60093ca7341e884578c41a29da7cd1714c80e (patch) | |
tree | 505e4dbbc5f60276f7e3059af72723c00ad95c4d /drivers/rtc | |
parent | 796b7abb33cd78412897a9e927eb5a8f5a9c4fe6 (diff) |
driver/rtc/class.c: check the error after rtc_read_time()
In rtc_suspend() and rtc_resume(), the error after rtc_read_time() is not
checked. If rtc device fail to read time, we cannot guarantee the
following process.
Add the verification code for returned rtc_read_time() error.
Signed-off-by: Hyogi Gim <hyogi.gim@lge.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/class.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 589351ef75d0..38e26be705be 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c | |||
@@ -53,6 +53,7 @@ static int rtc_suspend(struct device *dev) | |||
53 | struct rtc_device *rtc = to_rtc_device(dev); | 53 | struct rtc_device *rtc = to_rtc_device(dev); |
54 | struct rtc_time tm; | 54 | struct rtc_time tm; |
55 | struct timespec delta, delta_delta; | 55 | struct timespec delta, delta_delta; |
56 | int err; | ||
56 | 57 | ||
57 | if (has_persistent_clock()) | 58 | if (has_persistent_clock()) |
58 | return 0; | 59 | return 0; |
@@ -61,7 +62,12 @@ static int rtc_suspend(struct device *dev) | |||
61 | return 0; | 62 | return 0; |
62 | 63 | ||
63 | /* snapshot the current RTC and system time at suspend*/ | 64 | /* snapshot the current RTC and system time at suspend*/ |
64 | rtc_read_time(rtc, &tm); | 65 | err = rtc_read_time(rtc, &tm); |
66 | if (err < 0) { | ||
67 | pr_debug("%s: fail to read rtc time\n", dev_name(&rtc->dev)); | ||
68 | return 0; | ||
69 | } | ||
70 | |||
65 | getnstimeofday(&old_system); | 71 | getnstimeofday(&old_system); |
66 | rtc_tm_to_time(&tm, &old_rtc.tv_sec); | 72 | rtc_tm_to_time(&tm, &old_rtc.tv_sec); |
67 | 73 | ||
@@ -94,6 +100,7 @@ static int rtc_resume(struct device *dev) | |||
94 | struct rtc_time tm; | 100 | struct rtc_time tm; |
95 | struct timespec new_system, new_rtc; | 101 | struct timespec new_system, new_rtc; |
96 | struct timespec sleep_time; | 102 | struct timespec sleep_time; |
103 | int err; | ||
97 | 104 | ||
98 | if (has_persistent_clock()) | 105 | if (has_persistent_clock()) |
99 | return 0; | 106 | return 0; |
@@ -104,7 +111,12 @@ static int rtc_resume(struct device *dev) | |||
104 | 111 | ||
105 | /* snapshot the current rtc and system time at resume */ | 112 | /* snapshot the current rtc and system time at resume */ |
106 | getnstimeofday(&new_system); | 113 | getnstimeofday(&new_system); |
107 | rtc_read_time(rtc, &tm); | 114 | err = rtc_read_time(rtc, &tm); |
115 | if (err < 0) { | ||
116 | pr_debug("%s: fail to read rtc time\n", dev_name(&rtc->dev)); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
108 | if (rtc_valid_tm(&tm) != 0) { | 120 | if (rtc_valid_tm(&tm) != 0) { |
109 | pr_debug("%s: bogus resume time\n", dev_name(&rtc->dev)); | 121 | pr_debug("%s: bogus resume time\n", dev_name(&rtc->dev)); |
110 | return 0; | 122 | return 0; |