Commit 81be22cd authored by Anthony Pighin (Nokia)'s avatar Anthony Pighin (Nokia) Committed by Alexandre Belloni
Browse files

rtc: interface: Alarm race handling should not discard preceding error



Commit 795cda83 ("rtc: interface: Fix long-standing race when setting
alarm") should not discard any errors from the preceding validations.

Prior to that commit, if the alarm feature was disabled, or the
set_alarm failed, a meaningful error code would be returned to the
caller for further action.

After, more often than not, the __rtc_read_time will cause a success
return code instead, misleading the caller.

An example of this is when timer_enqueue is called for a rtc-abx080x
device. Since that driver does not clear the alarm feature bit, but
instead relies on the set_alarm operation to return invalid, the discard
of the return code causes very different behaviour; i.e.
    hwclock: select() to /dev/rtc0 to wait for clock tick timed out

Fixes: 795cda83 ("rtc: interface: Fix long-standing race when setting alarm")
Signed-off-by: default avatarAnthony Pighin (Nokia) <anthony.pighin@nokia.com>
Reviewed-by: default avatarEsben Haabendal <esben@geanix.com>
Tested-by: default avatarNick Bowler <nbowler@draconx.ca>
Link: https://patch.msgid.link/BN0PR08MB6951415A751F236375A2945683D1A@BN0PR08MB6951.namprd08.prod.outlook.com


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent 8eeb611b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
	 * are in, we can return -ETIME to signal that the timer has already
	 * expired, which is true in both cases.
	 */
	if ((scheduled - now) <= 1) {
	if (!err && (scheduled - now) <= 1) {
		err = __rtc_read_time(rtc, &tm);
		if (err)
			return err;