summaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4proc.c
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@netapp.com>2013-08-13 16:37:34 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-09-05 10:44:17 -0400
commitfa940720ceff2d7b24b4898c51a440ab59f39a4d (patch)
tree61fbe57804f1101997fa70e0d45885f3fbbe81ec /fs/nfs/nfs4proc.c
parentab4c2361358ebdf4933f6bfd1dc98d7a14b55769 (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.c19
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 */
6122static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = { 6129static 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;