RFC Implement NFSv4 delegations, take 4
Get series with b4
b4 am [email protected]Versions newest first
- v1 RFC Latest7 of 13 patches 3 repliesIn review
7 of 13 patches are in this archive. The cover letter announces 13.
Patches in v1 No applies recorded yet
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 3/13 | vfs: don't use PARENT/CHILD lock classes for non-directoriesfs/ | +4 | 0 replies | |
| 4/13 | vfs: rename I_MUTEX_QUOTA now that it's not used for quotasfs/ include/ | +8 | 0 replies | |
| 7/13 | locks: implement delegationsfs/ include/ | +54 | 0 replies | |
| 9/13 | locks: break delegations on unlinkdrivers/ fs/ fs/ +4 more | +26 | 0 replies | |
| 10/13 | locks: helper functions for delegation breakingfs/ include/ | +34 | 0 replies | |
| 12/13 | locks: break delegations on linkfs/ fs/ fs/ +1 more | +17 | 3 replies | |
| 13/13 | locks: break delegations on any attribute modificationdrivers/ fs/ fs/ +7 more | +47 | 0 replies |
Reviews trailers per patch
No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.
Cover letter [RFC PATCH 00/13] Implement NFSv4 delegations, take 4
From: "J. Bruce Fields" <[email protected]>
Older NFS clients can only find out about changes to a file by polling. NFSv4 instead allows a client to get a "delegation" on a file and then operate on a file without talking to the server. Consistency is maintained by requiring the server to recall the delegation before allowing any conflicting operation.
But our kfsd doesn't always recall delegations on conflicting operations from local (non-NFS) users of an exported filesystem.
This patch series fixes that by defining a new lock type to represent a delegation. This new lock type isn't available to userspace for now--nfsd is the only user.
Delegations come in both "read" and "write" flavors, but I'm only implementing read delegations for now.
Delegations are similar to leases. The main difference is that delegations need to be broken on any operation that changes a file's attributes or the set of links pointing to it (like link, unlink, and rename).
Such operations take several locks (including at least one i_mutex on a directory). Delegations can take a long time (about a minute) to recall when NFS clients are unresponsive. To avoid blocking a lot of unrelated operations, this version of the patches drops all of those locks before waiting.
To that end, I'm passing an extra inode ** to functions like vfs_unlink. When vfs_unlink finds a delegation it can then pass back the offending inode so that the caller can wait for the delegation recall. If the caller passes in NULL, then it instead gets -EWOULDBLOCK on encountering a delegation.
In fact, callers outside the vfs are mostly passing in NULL:
- nfsd wants to imediately return NFS4ERR_DELAY to callers on encountering a delegation, instead of waiting.
- I assume that anyone exporting the fileystem underlying an ecryptfs mount is making a mistake, and that it's better to return an error than to wait.
- Ditto for fscache.
But those other callers could be taught to wait as well if necessary.
At least in the link case, these patches may currently have the same problem Jeff Layton's ESTALE patches hit (some code paths that look safe to retry aren't, due to some audit code).
I think this is about the 4th version posted. The previous version didn't drop locks before waiting.
--b.
J. Bruce Fields (12):
vfs: pull ext4's double-i_mutex-locking into common code
vfs: don't use PARENT/CHILD lock classes for non-directories
vfs: rename I_MUTEX_QUOTA now that it's not used for quotas
vfs: take i_mutex on renamed file
locks: introduce new FL_DELEG lock flag
locks: implement delegations
namei: minor vfs_unlink cleanup
locks: break delegations on unlink
locks: helper functions for delegation breaking
locks: break delegations on rename
locks: break delegations on link
locks: break delegations on any attribute modification
Jan Kara (1):
gfs2: Get rid of I_MUTEX_QUOTA usage
Documentation/filesystems/directory-locking | 30 +++++++---- drivers/base/devtmpfs.c | 6 +-- fs/attr.c | 5 +- fs/cachefiles/interface.c | 4 +- fs/cachefiles/namei.c | 4 +- fs/ecryptfs/inode.c | 6 +-- fs/ext4/move_extent.c | 21 +------- fs/gfs2/ops_fstype.c | 8 +++ fs/gfs2/quota.c | 2 +- fs/hpfs/namei.c | 2 +- fs/inode.c | 42 ++++++++++++++- fs/locks.c | 51 ++++++++++++++---- fs/namei.c | 74 ++++++++++++++++++++------- fs/nfsd/nfs4state.c | 2 +- fs/nfsd/vfs.c | 14 +++-- fs/open.c | 21 ++++++-- fs/utimes.c | 9 +++- include/linux/fs.h | 72 +++++++++++++++++++++----- ipc/mqueue.c | 2 +- 19 files changed, 280 insertions(+), 95 deletions(-)
Signature · 1 line
1.7.9.5