diff options
author | Weston Andros Adamson <dros@netapp.com> | 2013-08-13 16:37:34 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-09-05 10:44:17 -0400 |
commit | fa940720ceff2d7b24b4898c51a440ab59f39a4d (patch) | |
tree | 61fbe57804f1101997fa70e0d45885f3fbbe81ec /fs/nfs/nfs4proc.c | |
parent | ab4c2361358ebdf4933f6bfd1dc98d7a14b55769 (diff) |
nfs4.1: Add SP4_MACH_CRED cleanup support
CLOSE and LOCKU can use the machine credential.
Signed-off-by: Weston Andros Adamson <dros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index ab6ee1dffd7b..cba486a18f1e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -2615,6 +2615,9 @@ int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait) | |||
2615 | }; | 2615 | }; |
2616 | int status = -ENOMEM; | 2616 | int status = -ENOMEM; |
2617 | 2617 | ||
2618 | nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_CLEANUP, | ||
2619 | &task_setup_data.rpc_client, &msg); | ||
2620 | |||
2618 | calldata = kzalloc(sizeof(*calldata), gfp_mask); | 2621 | calldata = kzalloc(sizeof(*calldata), gfp_mask); |
2619 | if (calldata == NULL) | 2622 | if (calldata == NULL) |
2620 | goto out; | 2623 | goto out; |
@@ -5230,6 +5233,9 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, | |||
5230 | .flags = RPC_TASK_ASYNC, | 5233 | .flags = RPC_TASK_ASYNC, |
5231 | }; | 5234 | }; |
5232 | 5235 | ||
5236 | nfs4_state_protect(NFS_SERVER(lsp->ls_state->inode)->nfs_client, | ||
5237 | NFS_SP4_MACH_CRED_CLEANUP, &task_setup_data.rpc_client, &msg); | ||
5238 | |||
5233 | /* Ensure this is an unlock - when canceling a lock, the | 5239 | /* Ensure this is an unlock - when canceling a lock, the |
5234 | * canceled lock is passed in, and it won't be an unlock. | 5240 | * canceled lock is passed in, and it won't be an unlock. |
5235 | */ | 5241 | */ |
@@ -6117,7 +6123,8 @@ out: | |||
6117 | } | 6123 | } |
6118 | 6124 | ||
6119 | /* | 6125 | /* |
6120 | * Minimum set of SP4_MACH_CRED operations from RFC 5661 | 6126 | * Minimum set of SP4_MACH_CRED operations from RFC 5661 in the enforce map |
6127 | * and operations we'd like to see to enable certain features in the allow map | ||
6121 | */ | 6128 | */ |
6122 | static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = { | 6129 | static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = { |
6123 | .how = SP4_MACH_CRED, | 6130 | .how = SP4_MACH_CRED, |
@@ -6127,6 +6134,10 @@ static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = { | |||
6127 | 1 << (OP_CREATE_SESSION - 32) | | 6134 | 1 << (OP_CREATE_SESSION - 32) | |
6128 | 1 << (OP_DESTROY_SESSION - 32) | | 6135 | 1 << (OP_DESTROY_SESSION - 32) | |
6129 | 1 << (OP_DESTROY_CLIENTID - 32) | 6136 | 1 << (OP_DESTROY_CLIENTID - 32) |
6137 | }, | ||
6138 | .allow.u.words = { | ||
6139 | [0] = 1 << (OP_CLOSE) | | ||
6140 | 1 << (OP_LOCKU) | ||
6130 | } | 6141 | } |
6131 | }; | 6142 | }; |
6132 | 6143 | ||
@@ -6186,6 +6197,12 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp, | |||
6186 | dfprintk(MOUNT, "sp4_mach_cred: disabled\n"); | 6197 | dfprintk(MOUNT, "sp4_mach_cred: disabled\n"); |
6187 | return -EINVAL; | 6198 | return -EINVAL; |
6188 | } | 6199 | } |
6200 | |||
6201 | if (test_bit(OP_CLOSE, sp->allow.u.longs) && | ||
6202 | test_bit(OP_LOCKU, sp->allow.u.longs)) { | ||
6203 | dfprintk(MOUNT, " cleanup mode enabled\n"); | ||
6204 | set_bit(NFS_SP4_MACH_CRED_CLEANUP, &clp->cl_sp4_flags); | ||
6205 | } | ||
6189 | } | 6206 | } |
6190 | 6207 | ||
6191 | return 0; | 6208 | return 0; |