View | Details | Raw Unified | Return to bug 228497 | Differences between
and this patch

Collapse All | Expand All

(-)fs/nfsserver/nfs_nfsdstate.c (-11 / +29 lines)
Lines 710-717 nfsrv_destroyclient(nfsquad_t clientid, Link Here
710
{
710
{
711
	struct nfsclient *clp;
711
	struct nfsclient *clp;
712
	struct nfsclienthashhead *hp;
712
	struct nfsclienthashhead *hp;
713
	int error = 0, i, igotlock;
713
	struct nfsdsession *sep;
714
	int error, i, igotlock;
714
715
716
	error = 0;
715
	if (nfsrvboottime != clientid.lval[0]) {
717
	if (nfsrvboottime != clientid.lval[0]) {
716
		error = NFSERR_STALECLIENTID;
718
		error = NFSERR_STALECLIENTID;
717
		goto out;
719
		goto out;
Lines 740-758 nfsrv_destroyclient(nfsquad_t clientid, Link Here
740
	}
742
	}
741
743
742
	/* Scan for state on the clientid. */
744
	/* Scan for state on the clientid. */
743
	for (i = 0; i < nfsrv_statehashsize; i++)
745
	if (!LIST_EMPTY(&clp->lc_deleg))
744
		if (!LIST_EMPTY(&clp->lc_stateid[i])) {
746
		error = NFSERR_CLIENTIDBUSY;
745
			NFSLOCKV4ROOTMUTEX();
747
	for (i = 0; i < nfsrv_statehashsize && error == 0; i++)
746
			nfsv4_unlock(&nfsv4rootfs_lock, 1);
748
		if (!LIST_EMPTY(&clp->lc_stateid[i]))
747
			NFSUNLOCKV4ROOTMUTEX();
748
			error = NFSERR_CLIENTIDBUSY;
749
			error = NFSERR_CLIENTIDBUSY;
749
			goto out;
750
	if (error == 0) {
751
		LIST_FOREACH(sep, &clp->lc_session, sess_list) {
752
			if ((sep->sess_crflags & NFSV4CRSESS_DEFUNCT) == 0) {
753
				error = NFSERR_CLIENTIDBUSY;
754
				break;
755
			}
750
		}
756
		}
751
	if (!LIST_EMPTY(&clp->lc_session) || !LIST_EMPTY(&clp->lc_deleg)) {
757
	}
758
759
	if (error != 0) {
752
		NFSLOCKV4ROOTMUTEX();
760
		NFSLOCKV4ROOTMUTEX();
753
		nfsv4_unlock(&nfsv4rootfs_lock, 1);
761
		nfsv4_unlock(&nfsv4rootfs_lock, 1);
754
		NFSUNLOCKV4ROOTMUTEX();
762
		NFSUNLOCKV4ROOTMUTEX();
755
		error = NFSERR_CLIENTIDBUSY;
756
		goto out;
763
		goto out;
757
	}
764
	}
758
765
Lines 5993-5999 nfsrv_findsession(uint8_t *sessionid) Link Here
5993
6000
5994
	shp = NFSSESSIONHASH(sessionid);
6001
	shp = NFSSESSIONHASH(sessionid);
5995
	LIST_FOREACH(sep, &shp->list, sess_hash) {
6002
	LIST_FOREACH(sep, &shp->list, sess_hash) {
5996
		if (!NFSBCMP(sessionid, sep->sess_sessionid, NFSX_V4SESSIONID))
6003
		if (NFSBCMP(sessionid, sep->sess_sessionid, NFSX_V4SESSIONID) ==
6004
		    0 && (sep->sess_crflags & NFSV4CRSESS_DEFUNCT) == 0)
5997
			break;
6005
			break;
5998
	}
6006
	}
5999
	return (sep);
6007
	return (sep);
Lines 6005-6019 nfsrv_findsession(uint8_t *sessionid) Link Here
6005
int
6013
int
6006
nfsrv_destroysession(struct nfsrv_descript *nd, uint8_t *sessionid)
6014
nfsrv_destroysession(struct nfsrv_descript *nd, uint8_t *sessionid)
6007
{
6015
{
6016
	struct nfssessionhash *shp;
6017
	struct nfsdsession *sep;
6008
	int error, samesess;
6018
	int error, samesess;
6009
6019
6010
	samesess = 0;
6020
	samesess = 0;
6021
	error = 0;
6011
	if (!NFSBCMP(sessionid, nd->nd_sessionid, NFSX_V4SESSIONID)) {
6022
	if (!NFSBCMP(sessionid, nd->nd_sessionid, NFSX_V4SESSIONID)) {
6012
		samesess = 1;
6023
		samesess = 1;
6013
		if ((nd->nd_flag & ND_LASTOP) == 0)
6024
		if ((nd->nd_flag & ND_LASTOP) == 0)
6014
			return (NFSERR_BADSESSION);
6025
			return (NFSERR_BADSESSION);
6015
	}
6026
	}
6016
	error = nfsrv_freesession(NULL, sessionid);
6027
	shp = NFSSESSIONHASH(sessionid);
6028
	NFSLOCKSESSION(shp);
6029
	sep = nfsrv_findsession(sessionid);
6030
	if (sep != NULL)
6031
		sep->sess_crflags |= NFSV4CRSESS_DEFUNCT;
6032
	NFSUNLOCKSESSION(shp);
6033
	if (sep == NULL)
6034
		error = NFSERR_BADSESSION;
6017
	if (error == 0 && samesess != 0)
6035
	if (error == 0 && samesess != 0)
6018
		nd->nd_flag &= ~ND_HASSEQUENCE;
6036
		nd->nd_flag &= ~ND_HASSEQUENCE;
6019
	return (error);
6037
	return (error);
(-)fs/nfs/nfsproto.h (+3 lines)
Lines 616-621 Link Here
616
#define	NFSV4CRSESS_CONNBACKCHAN	0x00000002
616
#define	NFSV4CRSESS_CONNBACKCHAN	0x00000002
617
#define	NFSV4CRSESS_CONNRDMA		0x00000004
617
#define	NFSV4CRSESS_CONNRDMA		0x00000004
618
618
619
/* Fake flag for Create Session used internally. */
620
#define	NFSV4CRSESS_DEFUNCT		0x80000000
621
619
/* Flags for Sequence */
622
/* Flags for Sequence */
620
#define	NFSV4SEQ_CBPATHDOWN		0x00000001
623
#define	NFSV4SEQ_CBPATHDOWN		0x00000001
621
#define	NFSV4SEQ_CBGSSCONTEXPIRING	0x00000002
624
#define	NFSV4SEQ_CBGSSCONTEXPIRING	0x00000002

Return to bug 228497