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); |