| From 9594497f2c78993cb66b696122f7c65528ace985 Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Mon, 4 Nov 2019 14:43:17 +0100 |
| Subject: nfsd: fix jiffies/time_t mixup in LRU list |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit 9594497f2c78993cb66b696122f7c65528ace985 upstream. |
| |
| The nfsd4_blocked_lock->nbl_time timestamp is recorded in jiffies, |
| but then compared to a CLOCK_REALTIME timestamp later on, which makes |
| no sense. |
| |
| For consistency with the other timestamps, change this to use a time_t. |
| |
| This is a change in behavior, which may cause regressions, but the |
| current code is not sensible. On a system with CONFIG_HZ=1000, |
| the 'time_after((unsigned long)nbl->nbl_time, (unsigned long)cutoff))' |
| check is false for roughly the first 18 days of uptime and then true |
| for the next 49 days. |
| |
| Fixes: 7919d0a27f1e ("nfsd: add a LRU list for blocked locks") |
| 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/nfs4state.c | 2 +- |
| fs/nfsd/state.h | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/nfsd/nfs4state.c |
| +++ b/fs/nfsd/nfs4state.c |
| @@ -6075,7 +6075,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struc |
| } |
| |
| if (fl_flags & FL_SLEEP) { |
| - nbl->nbl_time = jiffies; |
| + nbl->nbl_time = get_seconds(); |
| spin_lock(&nn->blocked_locks_lock); |
| list_add_tail(&nbl->nbl_list, &lock_sop->lo_blocked); |
| list_add_tail(&nbl->nbl_lru, &nn->blocked_locks_lru); |
| --- a/fs/nfsd/state.h |
| +++ b/fs/nfsd/state.h |
| @@ -592,7 +592,7 @@ static inline bool nfsd4_stateid_generat |
| struct nfsd4_blocked_lock { |
| struct list_head nbl_list; |
| struct list_head nbl_lru; |
| - unsigned long nbl_time; |
| + time_t nbl_time; |
| struct file_lock nbl_lock; |
| struct knfsd_fh nbl_fh; |
| struct nfsd4_callback nbl_cb; |