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 /net | |
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 'net')
-rw-r--r-- | net/sunrpc/clnt.c | 2 | ||||
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 10 | ||||
-rw-r--r-- | net/sunrpc/rpcb_clnt.c | 2 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 7 |
4 files changed, 12 insertions, 9 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 7fee13b331d1..f56f045778ae 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -1286,6 +1286,8 @@ call_reserveresult(struct rpc_task *task) | |||
1286 | } | 1286 | } |
1287 | 1287 | ||
1288 | switch (status) { | 1288 | switch (status) { |
1289 | case -ENOMEM: | ||
1290 | rpc_delay(task, HZ >> 2); | ||
1289 | case -EAGAIN: /* woken up; retry */ | 1291 | case -EAGAIN: /* woken up; retry */ |
1290 | task->tk_action = call_reserve; | 1292 | task->tk_action = call_reserve; |
1291 | return; | 1293 | return; |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index fd2423991c2d..04040476082e 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -120,7 +120,7 @@ EXPORT_SYMBOL_GPL(rpc_pipe_generic_upcall); | |||
120 | 120 | ||
121 | /** | 121 | /** |
122 | * rpc_queue_upcall - queue an upcall message to userspace | 122 | * rpc_queue_upcall - queue an upcall message to userspace |
123 | * @inode: inode of upcall pipe on which to queue given message | 123 | * @pipe: upcall pipe on which to queue given message |
124 | * @msg: message to queue | 124 | * @msg: message to queue |
125 | * | 125 | * |
126 | * Call with an @inode created by rpc_mkpipe() to queue an upcall. | 126 | * Call with an @inode created by rpc_mkpipe() to queue an upcall. |
@@ -819,9 +819,7 @@ static int rpc_rmdir_depopulate(struct dentry *dentry, | |||
819 | * @parent: dentry of directory to create new "pipe" in | 819 | * @parent: dentry of directory to create new "pipe" in |
820 | * @name: name of pipe | 820 | * @name: name of pipe |
821 | * @private: private data to associate with the pipe, for the caller's use | 821 | * @private: private data to associate with the pipe, for the caller's use |
822 | * @ops: operations defining the behavior of the pipe: upcall, downcall, | 822 | * @pipe: &rpc_pipe containing input parameters |
823 | * release_pipe, open_pipe, and destroy_msg. | ||
824 | * @flags: rpc_pipe flags | ||
825 | * | 823 | * |
826 | * Data is made available for userspace to read by calls to | 824 | * Data is made available for userspace to read by calls to |
827 | * rpc_queue_upcall(). The actual reads will result in calls to | 825 | * rpc_queue_upcall(). The actual reads will result in calls to |
@@ -943,7 +941,7 @@ struct dentry *rpc_create_client_dir(struct dentry *dentry, | |||
943 | 941 | ||
944 | /** | 942 | /** |
945 | * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir() | 943 | * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir() |
946 | * @clnt: rpc client | 944 | * @dentry: dentry for the pipe |
947 | */ | 945 | */ |
948 | int rpc_remove_client_dir(struct dentry *dentry) | 946 | int rpc_remove_client_dir(struct dentry *dentry) |
949 | { | 947 | { |
@@ -1115,7 +1113,7 @@ rpc_fill_super(struct super_block *sb, void *data, int silent) | |||
1115 | sb->s_op = &s_ops; | 1113 | sb->s_op = &s_ops; |
1116 | sb->s_time_gran = 1; | 1114 | sb->s_time_gran = 1; |
1117 | 1115 | ||
1118 | inode = rpc_get_inode(sb, S_IFDIR | 0755); | 1116 | inode = rpc_get_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO); |
1119 | sb->s_root = root = d_make_root(inode); | 1117 | sb->s_root = root = d_make_root(inode); |
1120 | if (!root) | 1118 | if (!root) |
1121 | return -ENOMEM; | 1119 | return -ENOMEM; |
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 78ac39fd9fe7..3c0653439f3d 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
@@ -394,6 +394,7 @@ static int rpcb_register_call(struct rpc_clnt *clnt, struct rpc_message *msg) | |||
394 | 394 | ||
395 | /** | 395 | /** |
396 | * rpcb_register - set or unset a port registration with the local rpcbind svc | 396 | * rpcb_register - set or unset a port registration with the local rpcbind svc |
397 | * @net: target network namespace | ||
397 | * @prog: RPC program number to bind | 398 | * @prog: RPC program number to bind |
398 | * @vers: RPC version number to bind | 399 | * @vers: RPC version number to bind |
399 | * @prot: transport protocol to register | 400 | * @prot: transport protocol to register |
@@ -521,6 +522,7 @@ static int rpcb_unregister_all_protofamilies(struct sunrpc_net *sn, | |||
521 | 522 | ||
522 | /** | 523 | /** |
523 | * rpcb_v4_register - set or unset a port registration with the local rpcbind | 524 | * rpcb_v4_register - set or unset a port registration with the local rpcbind |
525 | * @net: target network namespace | ||
524 | * @program: RPC program number of service to (un)register | 526 | * @program: RPC program number of service to (un)register |
525 | * @version: RPC version number of service to (un)register | 527 | * @version: RPC version number of service to (un)register |
526 | * @address: address family, IP address, and port to (un)register | 528 | * @address: address family, IP address, and port to (un)register |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 6fe2dcead150..3c83035cdaa9 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -979,20 +979,21 @@ static void xprt_alloc_slot(struct rpc_task *task) | |||
979 | list_del(&req->rq_list); | 979 | list_del(&req->rq_list); |
980 | goto out_init_req; | 980 | goto out_init_req; |
981 | } | 981 | } |
982 | req = xprt_dynamic_alloc_slot(xprt, GFP_NOWAIT); | 982 | req = xprt_dynamic_alloc_slot(xprt, GFP_NOWAIT|__GFP_NOWARN); |
983 | if (!IS_ERR(req)) | 983 | if (!IS_ERR(req)) |
984 | goto out_init_req; | 984 | goto out_init_req; |
985 | switch (PTR_ERR(req)) { | 985 | switch (PTR_ERR(req)) { |
986 | case -ENOMEM: | 986 | case -ENOMEM: |
987 | rpc_delay(task, HZ >> 2); | ||
988 | dprintk("RPC: dynamic allocation of request slot " | 987 | dprintk("RPC: dynamic allocation of request slot " |
989 | "failed! Retrying\n"); | 988 | "failed! Retrying\n"); |
989 | task->tk_status = -ENOMEM; | ||
990 | break; | 990 | break; |
991 | case -EAGAIN: | 991 | case -EAGAIN: |
992 | rpc_sleep_on(&xprt->backlog, task, NULL); | 992 | rpc_sleep_on(&xprt->backlog, task, NULL); |
993 | dprintk("RPC: waiting for request slot\n"); | 993 | dprintk("RPC: waiting for request slot\n"); |
994 | default: | ||
995 | task->tk_status = -EAGAIN; | ||
994 | } | 996 | } |
995 | task->tk_status = -EAGAIN; | ||
996 | return; | 997 | return; |
997 | out_init_req: | 998 | out_init_req: |
998 | task->tk_status = 0; | 999 | task->tk_status = 0; |