diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 13:43:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 13:43:51 -0400 |
commit | 53f2c4a8fd882009a2a75c5b72d6898c0808616e (patch) | |
tree | 922293a1056c0c2358203cdab832f0e0891e628a /fs/nfs/delegation.c | |
parent | 8f6576ad476b2a22d05ddafd2ddaee102577a4ed (diff) | |
parent | cc0a98436820b161b595b8cc1d2329bcf7328107 (diff) |
Merge tag 'nfs-for-3.5-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust:
"New features include:
- Rewrite the O_DIRECT code so that it can share the same coalescing
and pNFS functionality as the page cache code.
- Allow the server to provide hints as to when we should use pNFS,
and when it is more efficient to read and write through the
metadata server.
- NFS cache consistency updates:
* Use the ctime to emulate a change attribute for NFSv2/v3 so that
all NFS versions can share the same cache management code.
* New cache management code will only look at the change attribute
and size attribute when deciding whether or not our cached data
is still valid or not.
* Don't request NFSv4 post-op attributes on writes in cases such as
O_DIRECT, where we don't care about data cache consistency, or
when we have a write delegation, and know that our cache is still
consistent.
* Don't request NFSv4 post-op attributes on operations such as
COMMIT, where there are no expected metadata updates.
* Don't request NFSv4 directory post-op attributes in cases where
the operations themselves already return change attribute
updates: i.e. operations such as OPEN, CREATE, REMOVE, LINK and
RENAME.
- Speed up 'ls' and friends by using READDIR rather than READDIRPLUS
if we detect no attempts to lookup filenames.
- Improve the code sharing between NFSv2/v3 and v4 mounts
- NFSv4.1 state management efficiency improvements
- More patches in preparation for NFSv4/v4.1 migration functionality."
Fix trivial conflict in fs/nfs/nfs4proc.c that was due to the dcache
qstr name initialization changes (that made the length/hash a 64-bit
union)
* tag 'nfs-for-3.5-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (146 commits)
NFSv4: Add debugging printks to state manager
NFSv4: Map NFS4ERR_SHARE_DENIED into an EACCES error instead of EIO
NFSv4: update_changeattr does not need to set NFS_INO_REVAL_PAGECACHE
NFSv4.1: nfs4_reset_session should use nfs4_handle_reclaim_lease_error
NFSv4.1: Handle other occurrences of NFS4ERR_CONN_NOT_BOUND_TO_SESSION
NFSv4.1: Handle NFS4ERR_CONN_NOT_BOUND_TO_SESSION in the state manager
NFSv4.1: Handle errors in nfs4_bind_conn_to_session
NFSv4.1: nfs4_bind_conn_to_session should drain the session
NFSv4.1: Don't clobber the seqid if exchange_id returns a confirmed clientid
NFSv4.1: Add DESTROY_CLIENTID
NFSv4.1: Ensure we use the correct credentials for bind_conn_to_session
NFSv4.1: Ensure we use the correct credentials for session create/destroy
NFSv4.1: Move NFSPROC4_CLNT_BIND_CONN_TO_SESSION to the end of the operations
NFSv4.1: Handle NFS4ERR_SEQ_MISORDERED when confirming the lease
NFSv4: When purging the lease, we must clear NFS4CLNT_LEASE_CONFIRM
NFSv4: Clean up the error handling for nfs4_reclaim_lease
NFSv4.1: Exchange ID must use GFP_NOFS allocation mode
nfs41: Use BIND_CONN_TO_SESSION for CB_PATH_DOWN*
nfs4.1: add BIND_CONN_TO_SESSION operation
NFSv4.1 test the mdsthreshold hint parameters
...
Diffstat (limited to 'fs/nfs/delegation.c')
-rw-r--r-- | fs/nfs/delegation.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index 89af1d269274..bd3a9601d32d 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c | |||
@@ -316,6 +316,10 @@ out: | |||
316 | * nfs_client_return_marked_delegations - return previously marked delegations | 316 | * nfs_client_return_marked_delegations - return previously marked delegations |
317 | * @clp: nfs_client to process | 317 | * @clp: nfs_client to process |
318 | * | 318 | * |
319 | * Note that this function is designed to be called by the state | ||
320 | * manager thread. For this reason, it cannot flush the dirty data, | ||
321 | * since that could deadlock in case of a state recovery error. | ||
322 | * | ||
319 | * Returns zero on success, or a negative errno value. | 323 | * Returns zero on success, or a negative errno value. |
320 | */ | 324 | */ |
321 | int nfs_client_return_marked_delegations(struct nfs_client *clp) | 325 | int nfs_client_return_marked_delegations(struct nfs_client *clp) |
@@ -340,11 +344,9 @@ restart: | |||
340 | server); | 344 | server); |
341 | rcu_read_unlock(); | 345 | rcu_read_unlock(); |
342 | 346 | ||
343 | if (delegation != NULL) { | 347 | if (delegation != NULL) |
344 | filemap_flush(inode->i_mapping); | ||
345 | err = __nfs_inode_return_delegation(inode, | 348 | err = __nfs_inode_return_delegation(inode, |
346 | delegation, 0); | 349 | delegation, 0); |
347 | } | ||
348 | iput(inode); | 350 | iput(inode); |
349 | if (!err) | 351 | if (!err) |
350 | goto restart; | 352 | goto restart; |
@@ -380,6 +382,10 @@ void nfs_inode_return_delegation_noreclaim(struct inode *inode) | |||
380 | * nfs_inode_return_delegation - synchronously return a delegation | 382 | * nfs_inode_return_delegation - synchronously return a delegation |
381 | * @inode: inode to process | 383 | * @inode: inode to process |
382 | * | 384 | * |
385 | * This routine will always flush any dirty data to disk on the | ||
386 | * assumption that if we need to return the delegation, then | ||
387 | * we should stop caching. | ||
388 | * | ||
383 | * Returns zero on success, or a negative errno value. | 389 | * Returns zero on success, or a negative errno value. |
384 | */ | 390 | */ |
385 | int nfs_inode_return_delegation(struct inode *inode) | 391 | int nfs_inode_return_delegation(struct inode *inode) |
@@ -389,10 +395,10 @@ int nfs_inode_return_delegation(struct inode *inode) | |||
389 | struct nfs_delegation *delegation; | 395 | struct nfs_delegation *delegation; |
390 | int err = 0; | 396 | int err = 0; |
391 | 397 | ||
398 | nfs_wb_all(inode); | ||
392 | if (rcu_access_pointer(nfsi->delegation) != NULL) { | 399 | if (rcu_access_pointer(nfsi->delegation) != NULL) { |
393 | delegation = nfs_detach_delegation(nfsi, server); | 400 | delegation = nfs_detach_delegation(nfsi, server); |
394 | if (delegation != NULL) { | 401 | if (delegation != NULL) { |
395 | nfs_wb_all(inode); | ||
396 | err = __nfs_inode_return_delegation(inode, delegation, 1); | 402 | err = __nfs_inode_return_delegation(inode, delegation, 1); |
397 | } | 403 | } |
398 | } | 404 | } |
@@ -538,6 +544,8 @@ int nfs_async_inode_return_delegation(struct inode *inode, | |||
538 | struct nfs_client *clp = server->nfs_client; | 544 | struct nfs_client *clp = server->nfs_client; |
539 | struct nfs_delegation *delegation; | 545 | struct nfs_delegation *delegation; |
540 | 546 | ||
547 | filemap_flush(inode->i_mapping); | ||
548 | |||
541 | rcu_read_lock(); | 549 | rcu_read_lock(); |
542 | delegation = rcu_dereference(NFS_I(inode)->delegation); | 550 | delegation = rcu_dereference(NFS_I(inode)->delegation); |
543 | 551 | ||