nfsd: clients don't need to break their own delegations
authorJ. Bruce Fields <bfields@redhat.com>
Fri, 28 Jul 2017 20:35:15 +0000 (16:35 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Sat, 9 May 2020 01:23:10 +0000 (21:23 -0400)
commit28df3d1539de5090f7916f6fff03891b67f366f4
tree0a324005caeca12e5bb02384d7e30ddc655d9862
parent52782c92ac85c4e393eb4a903a62e6c24afa633f
nfsd: clients don't need to break their own delegations

We currently revoke read delegations on any write open or any operation
that modifies file data or metadata (including rename, link, and
unlink).  But if the delegation in question is the only read delegation
and is held by the client performing the operation, that's not really
necessary.

It's not always possible to prevent this in the NFSv4.0 case, because
there's not always a way to determine which client an NFSv4.0 delegation
came from.  (In theory we could try to guess this from the transport
layer, e.g., by assuming all traffic on a given TCP connection comes
from the same client.  But that's not really correct.)

In the NFSv4.1 case the session layer always tells us the client.

This patch should remove such self-conflicts in all cases where we can
reliably determine the client from the compound.

To do that we need to track "who" is performing a given (possibly
lease-breaking) file operation.  We're doing that by storing the
information in the svc_rqst and using kthread_data() to map the current
task back to a svc_rqst.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Documentation/filesystems/locking.rst
fs/locks.c
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4state.c
fs/nfsd/nfsd.h
fs/nfsd/nfssvc.c
include/linux/fs.h
include/linux/sunrpc/svc.h