diff options
author | Jeff Layton <jlayton@redhat.com> | 2016-09-16 16:28:25 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2016-09-26 15:20:36 -0400 |
commit | 7919d0a27f1e7cb324e023776aa1cbff00f1ee7b (patch) | |
tree | 49ad90bf5a85f3c5ee3b0814be8902c3186614ec /fs/nfsd/state.h | |
parent | 76d348fadff52e8ad10e7f587a4560df79a5fefe (diff) | |
download | linux-7919d0a27f1e7cb324e023776aa1cbff00f1ee7b.tar.gz linux-7919d0a27f1e7cb324e023776aa1cbff00f1ee7b.tar.bz2 linux-7919d0a27f1e7cb324e023776aa1cbff00f1ee7b.zip |
nfsd: add a LRU list for blocked locks
It's possible for a client to call in on a lock that is blocked for a
long time, but discontinue polling for it. A malicious client could
even set a lock on a file, and then spam the server with failing lock
requests from different lockowners that pile up in a DoS attack.
Add the blocked lock structures to a per-net namespace LRU when hashing
them, and timestamp them. If the lock request is not revisited after a
lease period, we'll drop it under the assumption that the client is no
longer interested.
This also gives us a mechanism to clean up these objects at server
shutdown time as well.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/state.h')
-rw-r--r-- | fs/nfsd/state.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index e45c183a8bf7..c9399366f9df 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -587,6 +587,8 @@ 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; struct file_lock nbl_lock; struct knfsd_fh nbl_fh; struct nfsd4_callback nbl_cb; |