ptp: Add error handling for adjfine callback in ptp_clock_adjtime
authorAjay Kaher <ajay.kaher@broadcom.com>
Mon, 25 Nov 2024 10:59:54 +0000 (10:59 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 30 Nov 2024 21:01:32 +0000 (13:01 -0800)
ptp_clock_adjtime sets ptp->dialed_frequency even when adjfine
callback returns an error. This causes subsequent reads to return
an incorrect value.

Fix this by adding error check before ptp->dialed_frequency is set.

Fixes: 39a8cbd9ca05 ("ptp: remember the adjusted frequency")
Signed-off-by: Ajay Kaher <ajay.kaher@broadcom.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Link: https://patch.msgid.link/20241125105954.1509971-1-ajay.kaher@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/ptp/ptp_clock.c

index c56cd0f63909a21c10803bed0df8fdd259f67b83..77a36e7bddd54e8f45eab317e687f033f57cc5bc 100644 (file)
@@ -150,7 +150,8 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)
                if (ppb > ops->max_adj || ppb < -ops->max_adj)
                        return -ERANGE;
                err = ops->adjfine(ops, tx->freq);
-               ptp->dialed_frequency = tx->freq;
+               if (!err)
+                       ptp->dialed_frequency = tx->freq;
        } else if (tx->modes & ADJ_OFFSET) {
                if (ops->adjphase) {
                        s32 max_phase_adj = ops->getmaxphase(ops);