Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13615871 authored by Andy Adamson's avatar Andy Adamson Committed by Benny Halevy
Browse files

nfs41: nfs41_sequence_free_slot



[from nfs41: separate free slot from sequence done]

Don't free the slot until after all rpc_restart_calls have completed.
Session reset will require more work.

As noted by Trond, since we're using rpc_wake_up_next rather than
rpc_wake_up() we must always wake up the next task in the queue
either by going through nfs4_free_slot, or just calling
rpc_wake_up_next if no slot is to be freed.

[nfs41: sequence res use slotid]
[nfs41: remove SEQ4_STATUS_USE_TK_STATUS]
[got rid of nfs4_sequence_res.sr_session, use nfs_client.cl_session instead]
Signed-off-by: default avatarAndy Adamson <andros@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfs41: rpc_wake_up_next if sessions slot was not consumed.]
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfs41: nfs4_sequence_free_slot use nfs_client for data server]
Signed-off-by: default avatarAndy Adamson <andros@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent e2c4ab3c
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -230,6 +230,20 @@ static inline int nfs4_has_session(const struct nfs_client *clp)
	return 0;
}

#ifdef CONFIG_NFS_V4_1
extern void nfs41_sequence_free_slot(const struct nfs_client *,
				     struct nfs4_sequence_res *res);
#endif /* CONFIG_NFS_V4_1 */

static inline void nfs4_sequence_free_slot(const struct nfs_client *clp,
					   struct nfs4_sequence_res *res)
{
#ifdef CONFIG_NFS_V4_1
	if (nfs4_has_session(clp))
		nfs41_sequence_free_slot(clp, res);
#endif /* CONFIG_NFS_V4_1 */
}

/*
 * Determine the device name as a string
 */
+21 −0
Original line number Diff line number Diff line
@@ -309,6 +309,27 @@ nfs4_free_slot(struct nfs4_slot_table *tbl, u8 free_slotid)
		free_slotid, tbl->highest_used_slotid);
}

void nfs41_sequence_free_slot(const struct nfs_client *clp,
			      struct nfs4_sequence_res *res)
{
	struct nfs4_slot_table *tbl;

	if (!nfs4_has_session(clp)) {
		dprintk("%s: No session\n", __func__);
		return;
	}
	tbl = &clp->cl_session->fc_slot_table;
	if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) {
		dprintk("%s: No slot\n", __func__);
		/* just wake up the next guy waiting since
		 * we may have not consumed a slot after all */
		rpc_wake_up_next(&tbl->slot_tbl_waitq);
		return;
	}
	nfs4_free_slot(tbl, res->sr_slotid);
	res->sr_slotid = NFS4_MAX_SLOT_TABLE;
}

/*
 * nfs4_find_slot - efficiently look for a free slot
 *