diff options
author | Andy Adamson <andros@netapp.com> | 2010-01-20 16:06:27 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-02-10 08:30:59 -0500 |
commit | b9efa1b27e25b1286504973c0a6bf0f24106faa8 (patch) | |
tree | e2cff0c8c7a33869123ea3e340d3b9ac3eefcef2 /fs/nfs/callback_proc.c | |
parent | 4911096f1a5df73c12c287a42ece4e7b5d9c19ec (diff) |
nfs41: implement cb_recall_slot
Drain the fore channel and reset the max_slots to the new value.
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/callback_proc.c')
-rw-r--r-- | fs/nfs/callback_proc.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 4062f7690a33..e5155d9df595 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c | |||
@@ -361,4 +361,36 @@ out: | |||
361 | dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); | 361 | dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); |
362 | return status; | 362 | return status; |
363 | } | 363 | } |
364 | |||
365 | /* Reduce the fore channel's max_slots to the target value */ | ||
366 | unsigned nfs4_callback_recallslot(struct cb_recallslotargs *args, void *dummy) | ||
367 | { | ||
368 | struct nfs_client *clp; | ||
369 | struct nfs4_slot_table *fc_tbl; | ||
370 | int status; | ||
371 | |||
372 | status = htonl(NFS4ERR_OP_NOT_IN_SESSION); | ||
373 | clp = nfs_find_client(args->crsa_addr, 4); | ||
374 | if (clp == NULL) | ||
375 | goto out; | ||
376 | |||
377 | dprintk("NFS: CB_RECALL_SLOT request from %s target max slots %d\n", | ||
378 | rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR), | ||
379 | args->crsa_target_max_slots); | ||
380 | |||
381 | fc_tbl = &clp->cl_session->fc_slot_table; | ||
382 | |||
383 | status = htonl(NFS4ERR_BAD_HIGH_SLOT); | ||
384 | if (args->crsa_target_max_slots >= fc_tbl->max_slots || | ||
385 | args->crsa_target_max_slots < 1) | ||
386 | goto out; | ||
387 | |||
388 | fc_tbl->target_max_slots = args->crsa_target_max_slots; | ||
389 | nfs41_handle_recall_slot(clp); | ||
390 | status = htonl(NFS4_OK); | ||
391 | nfs_put_client(clp); /* balance nfs_find_client */ | ||
392 | out: | ||
393 | dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); | ||
394 | return status; | ||
395 | } | ||
364 | #endif /* CONFIG_NFS_V4_1 */ | 396 | #endif /* CONFIG_NFS_V4_1 */ |