nfsd4: mark_client_expired

Mark the client as expired under the client_lock so it won't be renewed
when an nfsv4.1 session is done, after it was explicitly expired
during processing of the compound.

Do not renew a client mark as expired (in particular, it is not
on the lru list anymore)

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
Benny Halevy 2010-05-12 00:13:41 +03:00 committed by J. Bruce Fields
parent 46583e2597
commit 07cd4909a6
2 changed files with 23 additions and 1 deletions

View File

@ -632,6 +632,14 @@ free_session(struct kref *kref)
static inline void static inline void
renew_client_locked(struct nfs4_client *clp) renew_client_locked(struct nfs4_client *clp)
{ {
if (is_client_expired(clp)) {
dprintk("%s: client (clientid %08x/%08x) already expired\n",
__func__,
clp->cl_clientid.cl_boot,
clp->cl_clientid.cl_id);
return;
}
/* /*
* Move client to the end to the LRU list. * Move client to the end to the LRU list.
*/ */
@ -697,6 +705,7 @@ free_client(struct nfs4_client *clp)
static inline void static inline void
unhash_client_locked(struct nfs4_client *clp) unhash_client_locked(struct nfs4_client *clp)
{ {
mark_client_expired(clp);
list_del(&clp->cl_lru); list_del(&clp->cl_lru);
while (!list_empty(&clp->cl_sessions)) { while (!list_empty(&clp->cl_sessions)) {
struct nfsd4_session *ses; struct nfsd4_session *ses;
@ -836,6 +845,7 @@ static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir,
INIT_LIST_HEAD(&clp->cl_delegations); INIT_LIST_HEAD(&clp->cl_delegations);
INIT_LIST_HEAD(&clp->cl_sessions); INIT_LIST_HEAD(&clp->cl_sessions);
INIT_LIST_HEAD(&clp->cl_lru); INIT_LIST_HEAD(&clp->cl_lru);
clp->cl_time = get_seconds();
clear_bit(0, &clp->cl_cb_slot_busy); clear_bit(0, &clp->cl_cb_slot_busy);
rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
copy_verf(clp, verf); copy_verf(clp, verf);

View File

@ -166,7 +166,7 @@ struct nfsd4_session {
struct list_head se_hash; /* hash by sessionid */ struct list_head se_hash; /* hash by sessionid */
struct list_head se_perclnt; struct list_head se_perclnt;
u32 se_flags; u32 se_flags;
struct nfs4_client *se_client; /* for expire_client */ struct nfs4_client *se_client;
struct nfs4_sessionid se_sessionid; struct nfs4_sessionid se_sessionid;
struct nfsd4_channel_attrs se_fchannel; struct nfsd4_channel_attrs se_fchannel;
struct nfsd4_channel_attrs se_bchannel; struct nfsd4_channel_attrs se_bchannel;
@ -244,6 +244,18 @@ struct nfs4_client {
/* wait here for slots */ /* wait here for slots */
}; };
static inline void
mark_client_expired(struct nfs4_client *clp)
{
clp->cl_time = 0;
}
static inline bool
is_client_expired(struct nfs4_client *clp)
{
return clp->cl_time == 0;
}
/* struct nfs4_client_reset /* struct nfs4_client_reset
* one per old client. Populates reset_str_hashtbl. Filled from conf_id_hashtbl * one per old client. Populates reset_str_hashtbl. Filled from conf_id_hashtbl
* upon lease reset, or from upcall to state_daemon (to read in state * upon lease reset, or from upcall to state_daemon (to read in state