summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2019-11-04 14:43:17 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-02-11 04:34:13 -0800
commitfdbc75c7cb7535890b948b16d349bb7de0d37664 (patch)
tree5bdccb8a336e8a931a60b7362c839f033e38eb57 /fs/nfsd
parent70b43a9da1e5c54e80528c7ed911a82cc78df1b7 (diff)
downloadlinux-stable-fdbc75c7cb7535890b948b16d349bb7de0d37664.tar.gz
linux-stable-fdbc75c7cb7535890b948b16d349bb7de0d37664.tar.bz2
linux-stable-fdbc75c7cb7535890b948b16d349bb7de0d37664.zip
nfsd: fix jiffies/time_t mixup in LRU list
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>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4state.c2
-rw-r--r--fs/nfsd/state.h2
2 files changed, 2 insertions, 2 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index c8ce128e0054..ed73e86194fa 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -6075,7 +6075,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
}
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);
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 0f07ad6dc1ef..594fc1a8b672 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -592,7 +592,7 @@ static inline bool nfsd4_stateid_generation_after(stateid_t *a, stateid_t *b)
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;