diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-07 16:19:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-07 16:19:36 -0400 |
| commit | 5df6b8e65ad0f2eaee202ff002ac00d1ac605315 (patch) | |
| tree | 2eff6606f8e39dc1fd7eb8a05feb2a9927151805 | |
| parent | fe21ea18c742ab0eb8f6f8ebc543374839a02a87 (diff) | |
| parent | 3dce9a5c3a39a664e372886ea86c42ae7ae33dfc (diff) | |
Merge branch 'nfs-for-2.6.36' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'nfs-for-2.6.36' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: (42 commits)
NFS: NFSv4.1 is no longer a "developer only" feature
NFS: NFS_V4 is no longer an EXPERIMENTAL feature
NFS: Fix /proc/mount for legacy binary interface
NFS: Fix the locking in nfs4_callback_getattr
SUNRPC: Defer deleting the security context until gss_do_free_ctx()
SUNRPC: prevent task_cleanup running on freed xprt
SUNRPC: Reduce asynchronous RPC task stack usage
SUNRPC: Move the bound cred to struct rpc_rqst
SUNRPC: Clean up of rpc_bindcred()
SUNRPC: Move remaining RPC client related task initialisation into clnt.c
SUNRPC: Ensure that rpc_exit() always wakes up a sleeping task
SUNRPC: Make the credential cache hashtable size configurable
SUNRPC: Store the hashtable size in struct rpc_cred_cache
NFS: Ensure the AUTH_UNIX credcache is allocated dynamically
NFS: Fix the NFS users of rpc_restart_call()
SUNRPC: The function rpc_restart_call() should return success/failure
NFSv4: Get rid of the bogus RPC_ASSASSINATED(task) checks
NFSv4: Clean up the process of renewing the NFSv4 lease
NFSv4.1: Handle NFS4ERR_DELAY on SEQUENCE correctly
NFS: nfs_rename() should not have to flush out writebacks
...
41 files changed, 963 insertions, 647 deletions
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig index a43d07e7b924..cc1bb33b59b8 100644 --- a/fs/nfs/Kconfig +++ b/fs/nfs/Kconfig | |||
| @@ -61,8 +61,8 @@ config NFS_V3_ACL | |||
| 61 | If unsure, say N. | 61 | If unsure, say N. |
| 62 | 62 | ||
| 63 | config NFS_V4 | 63 | config NFS_V4 |
| 64 | bool "NFS client support for NFS version 4 (EXPERIMENTAL)" | 64 | bool "NFS client support for NFS version 4" |
| 65 | depends on NFS_FS && EXPERIMENTAL | 65 | depends on NFS_FS |
| 66 | select RPCSEC_GSS_KRB5 | 66 | select RPCSEC_GSS_KRB5 |
| 67 | help | 67 | help |
| 68 | This option enables support for version 4 of the NFS protocol | 68 | This option enables support for version 4 of the NFS protocol |
| @@ -72,16 +72,16 @@ config NFS_V4 | |||
| 72 | space programs which can be found in the Linux nfs-utils package, | 72 | space programs which can be found in the Linux nfs-utils package, |
| 73 | available from http://linux-nfs.org/. | 73 | available from http://linux-nfs.org/. |
| 74 | 74 | ||
| 75 | If unsure, say N. | 75 | If unsure, say Y. |
| 76 | 76 | ||
| 77 | config NFS_V4_1 | 77 | config NFS_V4_1 |
| 78 | bool "NFS client support for NFSv4.1 (DEVELOPER ONLY)" | 78 | bool "NFS client support for NFSv4.1 (EXPERIMENTAL)" |
| 79 | depends on NFS_V4 && EXPERIMENTAL | 79 | depends on NFS_V4 && EXPERIMENTAL |
| 80 | help | 80 | help |
| 81 | This option enables support for minor version 1 of the NFSv4 protocol | 81 | This option enables support for minor version 1 of the NFSv4 protocol |
| 82 | (draft-ietf-nfsv4-minorversion1) in the kernel's NFS client. | 82 | (draft-ietf-nfsv4-minorversion1) in the kernel's NFS client. |
| 83 | 83 | ||
| 84 | Unless you're an NFS developer, say N. | 84 | If unsure, say N. |
| 85 | 85 | ||
| 86 | config ROOT_NFS | 86 | config ROOT_NFS |
| 87 | bool "Root file system on NFS" | 87 | bool "Root file system on NFS" |
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index a08770a7e857..930d10fecdaf 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c | |||
| @@ -37,8 +37,8 @@ __be32 nfs4_callback_getattr(struct cb_getattrargs *args, struct cb_getattrres * | |||
| 37 | if (inode == NULL) | 37 | if (inode == NULL) |
| 38 | goto out_putclient; | 38 | goto out_putclient; |
| 39 | nfsi = NFS_I(inode); | 39 | nfsi = NFS_I(inode); |
| 40 | down_read(&nfsi->rwsem); | 40 | rcu_read_lock(); |
| 41 | delegation = nfsi->delegation; | 41 | delegation = rcu_dereference(nfsi->delegation); |
| 42 | if (delegation == NULL || (delegation->type & FMODE_WRITE) == 0) | 42 | if (delegation == NULL || (delegation->type & FMODE_WRITE) == 0) |
| 43 | goto out_iput; | 43 | goto out_iput; |
| 44 | res->size = i_size_read(inode); | 44 | res->size = i_size_read(inode); |
| @@ -53,7 +53,7 @@ __be32 nfs4_callback_getattr(struct cb_getattrargs *args, struct cb_getattrres * | |||
| 53 | args->bitmap[1]; | 53 | args->bitmap[1]; |
| 54 | res->status = 0; | 54 | res->status = 0; |
| 55 | out_iput: | 55 | out_iput: |
| 56 | up_read(&nfsi->rwsem); | 56 | rcu_read_unlock(); |
| 57 | iput(inode); | 57 | iput(inode); |
| 58 | out_putclient: | 58 | out_putclient: |
| 59 | nfs_put_client(clp); | 59 | nfs_put_client(clp); |
| @@ -62,16 +62,6 @@ out: | |||
| 62 | return res->status; | 62 | return res->status; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | static int (*nfs_validate_delegation_stateid(struct nfs_client *clp))(struct nfs_delegation *, const nfs4_stateid *) | ||
| 66 | { | ||
| 67 | #if defined(CONFIG_NFS_V4_1) | ||
| 68 | if (clp->cl_minorversion > 0) | ||
| 69 | return nfs41_validate_delegation_stateid; | ||
| 70 | #endif | ||
| 71 | return nfs4_validate_delegation_stateid; | ||
| 72 | } | ||
| 73 | |||
| 74 | |||
| 75 | __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy) | 65 | __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy) |
| 76 | { | 66 | { |
| 77 | struct nfs_client *clp; | 67 | struct nfs_client *clp; |
| @@ -92,8 +82,7 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy) | |||
| 92 | inode = nfs_delegation_find_inode(clp, &args->fh); | 82 | inode = nfs_delegation_find_inode(clp, &args->fh); |
| 93 | if (inode != NULL) { | 83 | if (inode != NULL) { |
| 94 | /* Set up a helper thread to actually return the delegation */ | 84 | /* Set up a helper thread to actually return the delegation */ |
| 95 | switch (nfs_async_inode_return_delegation(inode, &args->stateid, | 85 | switch (nfs_async_inode_return_delegation(inode, &args->stateid)) { |
| 96 | nfs_validate_delegation_stateid(clp))) { | ||
| 97 | case 0: | 86 | case 0: |
| 98 | res = 0; | 87 | res = 0; |
| 99 | break; | 88 | break; |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index d25b5257b7a1..4e7df2adb212 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
| @@ -150,6 +150,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ | |||
| 150 | clp->cl_boot_time = CURRENT_TIME; | 150 | clp->cl_boot_time = CURRENT_TIME; |
| 151 | clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; | 151 | clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; |
| 152 | clp->cl_minorversion = cl_init->minorversion; | 152 | clp->cl_minorversion = cl_init->minorversion; |
| 153 | clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; | ||
| 153 | #endif | 154 | #endif |
| 154 | cred = rpc_lookup_machine_cred(); | 155 | cred = rpc_lookup_machine_cred(); |
| 155 | if (!IS_ERR(cred)) | 156 | if (!IS_ERR(cred)) |
| @@ -178,7 +179,7 @@ static void nfs4_clear_client_minor_version(struct nfs_client *clp) | |||
| 178 | clp->cl_session = NULL; | 179 | clp->cl_session = NULL; |
| 179 | } | 180 | } |
| 180 | 181 | ||
| 181 | clp->cl_call_sync = _nfs4_call_sync; | 182 | clp->cl_mvops = nfs_v4_minor_ops[0]; |
| 182 | #endif /* CONFIG_NFS_V4_1 */ | 183 | #endif /* CONFIG_NFS_V4_1 */ |
| 183 | } | 184 | } |
| 184 | 185 | ||
| @@ -188,7 +189,7 @@ static void nfs4_clear_client_minor_version(struct nfs_client *clp) | |||
| 188 | static void nfs4_destroy_callback(struct nfs_client *clp) | 189 | static void nfs4_destroy_callback(struct nfs_client *clp) |
| 189 | { | 190 | { |
| 190 | if (__test_and_clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state)) | 191 | if (__test_and_clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state)) |
| 191 | nfs_callback_down(clp->cl_minorversion); | 192 | nfs_callback_down(clp->cl_mvops->minor_version); |
| 192 | } | 193 | } |
| 193 | 194 | ||
| 194 | static void nfs4_shutdown_client(struct nfs_client *clp) | 195 | static void nfs4_shutdown_client(struct nfs_client *clp) |
| @@ -1126,7 +1127,7 @@ static int nfs4_init_callback(struct nfs_client *clp) | |||
| 1126 | return error; | 1127 | return error; |
| 1127 | } | 1128 | } |
| 1128 | 1129 | ||
| 1129 | error = nfs_callback_up(clp->cl_minorversion, | 1130 | error = nfs_callback_up(clp->cl_mvops->minor_version, |
| 1130 | clp->cl_rpcclient->cl_xprt); | 1131 | clp->cl_rpcclient->cl_xprt); |
| 1131 | if (error < 0) { | 1132 | if (error < 0) { |
| 1132 | dprintk("%s: failed to start callback. Error = %d\n", | 1133 | dprintk("%s: failed to start callback. Error = %d\n", |
| @@ -1143,10 +1144,8 @@ static int nfs4_init_callback(struct nfs_client *clp) | |||
