| From 2561c92b12f4f4e386d453556685f75775c0938b Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Sun, 3 Nov 2019 22:32:20 +0100 |
| Subject: nfsd: fix delay timer on 32-bit architectures |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit 2561c92b12f4f4e386d453556685f75775c0938b upstream. |
| |
| The nfsd4_cb_layout_done() function takes a 'time_t' value, |
| multiplied by NSEC_PER_SEC*2 to get a nanosecond value. |
| |
| This works fine on 64-bit architectures, but on 32-bit, any |
| value over 1 second results in a signed integer overflow |
| with unexpected results. |
| |
| Cast one input to a 64-bit type in order to produce the |
| same result that we have on 64-bit architectures, regarless |
| of the type of nfsd4_lease. |
| |
| Fixes: 6b9b21073d3b ("nfsd: give up on CB_LAYOUTRECALLs after two lease periods") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: J. Bruce Fields <bfields@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfsd/nfs4layouts.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/nfsd/nfs4layouts.c |
| +++ b/fs/nfsd/nfs4layouts.c |
| @@ -676,7 +676,7 @@ nfsd4_cb_layout_done(struct nfsd4_callba |
| |
| /* Client gets 2 lease periods to return it */ |
| cutoff = ktime_add_ns(task->tk_start, |
| - nn->nfsd4_lease * NSEC_PER_SEC * 2); |
| + (u64)nn->nfsd4_lease * NSEC_PER_SEC * 2); |
| |
| if (ktime_before(now, cutoff)) { |
| rpc_delay(task, HZ/100); /* 10 mili-seconds */ |