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>
This commit is contained in:
committed by
Trond Myklebust
parent
4911096f1a
commit
b9efa1b27e
@@ -1249,6 +1249,12 @@ static int nfs4_reclaim_lease(struct nfs_client *clp)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFS_V4_1
|
||||
void nfs41_handle_recall_slot(struct nfs_client *clp)
|
||||
{
|
||||
set_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state);
|
||||
nfs4_schedule_state_recovery(clp);
|
||||
}
|
||||
|
||||
void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
|
||||
{
|
||||
if (!flags)
|
||||
@@ -1299,9 +1305,38 @@ out:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int nfs4_recall_slot(struct nfs_client *clp)
|
||||
{
|
||||
struct nfs4_slot_table *fc_tbl = &clp->cl_session->fc_slot_table;
|
||||
struct nfs4_channel_attrs *fc_attrs = &clp->cl_session->fc_attrs;
|
||||
struct nfs4_slot *new, *old;
|
||||
int i;
|
||||
|
||||
nfs4_begin_drain_session(clp);
|
||||
new = kmalloc(fc_tbl->target_max_slots * sizeof(struct nfs4_slot),
|
||||
GFP_KERNEL);
|
||||
if (!new)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock(&fc_tbl->slot_tbl_lock);
|
||||
for (i = 0; i < fc_tbl->target_max_slots; i++)
|
||||
new[i].seq_nr = fc_tbl->slots[i].seq_nr;
|
||||
old = fc_tbl->slots;
|
||||
fc_tbl->slots = new;
|
||||
fc_tbl->max_slots = fc_tbl->target_max_slots;
|
||||
fc_tbl->target_max_slots = 0;
|
||||
fc_attrs->max_reqs = fc_tbl->max_slots;
|
||||
spin_unlock(&fc_tbl->slot_tbl_lock);
|
||||
|
||||
kfree(old);
|
||||
nfs4_end_drain_session(clp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* CONFIG_NFS_V4_1 */
|
||||
static int nfs4_reset_session(struct nfs_client *clp) { return 0; }
|
||||
static int nfs4_end_drain_session(struct nfs_client *clp) { return 0; }
|
||||
static int nfs4_recall_slot(struct nfs_client *clp) { return 0; }
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
/* Set NFS4CLNT_LEASE_EXPIRED for all v4.0 errors and for recoverable errors
|
||||
@@ -1398,6 +1433,15 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
||||
nfs_client_return_marked_delegations(clp);
|
||||
continue;
|
||||
}
|
||||
/* Recall session slots */
|
||||
if (test_and_clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state)
|
||||
&& nfs4_has_session(clp)) {
|
||||
status = nfs4_recall_slot(clp);
|
||||
if (status < 0)
|
||||
goto out_error;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
nfs4_clear_state_manager_bit(clp);
|
||||
/* Did we race with an attempt to give us more work? */
|
||||
|
Reference in New Issue
Block a user