diff options
author | Mi Jinlong <mijinlong@cn.fujitsu.com> | 2011-10-20 05:51:39 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2011-10-24 04:24:30 -0400 |
commit | 345c284290cabb5484df909303e73d6def8ec8ec (patch) | |
tree | 1a853fe648230fefee758e36bd1ab141639c0b83 /fs/nfsd/nfs4state.c | |
parent | 92bac8c5d60623167c6802b1f125e6d623708185 (diff) |
nfs41: implement DESTROY_CLIENTID operation
According to rfc5661 18.50, implement DESTROY_CLIENTID operation.
Signed-off-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r-- | fs/nfsd/nfs4state.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 1527aaffb000..47e94e33a975 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -1962,6 +1962,50 @@ out: | |||
1962 | return status; | 1962 | return status; |
1963 | } | 1963 | } |
1964 | 1964 | ||
1965 | static inline bool has_resources(struct nfs4_client *clp) | ||
1966 | { | ||
1967 | return !list_empty(&clp->cl_openowners) | ||
1968 | || !list_empty(&clp->cl_delegations) | ||
1969 | || !list_empty(&clp->cl_sessions); | ||
1970 | } | ||
1971 | |||
1972 | __be32 | ||
1973 | nfsd4_destroy_clientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_destroy_clientid *dc) | ||
1974 | { | ||
1975 | struct nfs4_client *conf, *unconf, *clp; | ||
1976 | int status = 0; | ||
1977 | |||
1978 | nfs4_lock_state(); | ||
1979 | unconf = find_unconfirmed_client(&dc->clientid); | ||
1980 | conf = find_confirmed_client(&dc->clientid); | ||
1981 | |||
1982 | if (conf) { | ||
1983 | clp = conf; | ||
1984 | |||
1985 | if (!is_client_expired(conf) && has_resources(conf)) { | ||
1986 | status = nfserr_clientid_busy; | ||
1987 | goto out; | ||
1988 | } | ||
1989 | |||
1990 | /* rfc5661 18.50.3 */ | ||
1991 | if (cstate->session && conf == cstate->session->se_client) { | ||
1992 | status = nfserr_clientid_busy; | ||
1993 | goto out; | ||
1994 | } | ||
1995 | } else if (unconf) | ||
1996 | clp = unconf; | ||
1997 | else { | ||
1998 | status = nfserr_stale_clientid; | ||
1999 | goto out; | ||
2000 | } | ||
2001 | |||
2002 | expire_client(clp); | ||
2003 | out: | ||
2004 | nfs4_unlock_state(); | ||
2005 | dprintk("%s return %d\n", __func__, ntohl(status)); | ||
2006 | return status; | ||
2007 | } | ||
2008 | |||
1965 | __be32 | 2009 | __be32 |
1966 | nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_reclaim_complete *rc) | 2010 | nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_reclaim_complete *rc) |
1967 | { | 2011 | { |