mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
Fix nfsrv_freeallnfslocks() in the experimental NFSv4 server so that
it frees local locks correctly upon close. In order for nfsrv_localunlock() to work correctly, the lock can no longer be in the lockowner's stateid list. As such, nfsrv_freenfslock() has to be called before nfsrv_localunlock(), to get rid of the lock structure on the lockowner's stateid list. This only affected operation when local locks (vfs.newnfs.enable_locallocks=1) are enabled, which is not the default at this time. MFC after: 1 week
This commit is contained in:
parent
c7aafc24c4
commit
a212c01aac
1 changed files with 7 additions and 4 deletions
|
|
@ -1137,6 +1137,7 @@ nfsrv_freeallnfslocks(struct nfsstate *stp, vnode_t vp, int cansleep,
|
|||
struct nfslockfile *lfp = NULL;
|
||||
int gottvp = 0;
|
||||
vnode_t tvp = NULL;
|
||||
uint64_t first, end;
|
||||
|
||||
lop = LIST_FIRST(&stp->ls_lock);
|
||||
while (lop != LIST_END(&stp->ls_lock)) {
|
||||
|
|
@ -1167,14 +1168,16 @@ nfsrv_freeallnfslocks(struct nfsstate *stp, vnode_t vp, int cansleep,
|
|||
if (tvp != NULL) {
|
||||
if (cansleep == 0)
|
||||
panic("allnfs2");
|
||||
nfsrv_localunlock(tvp, lfp, lop->lo_first,
|
||||
lop->lo_end, p);
|
||||
first = lop->lo_first;
|
||||
end = lop->lo_end;
|
||||
nfsrv_freenfslock(lop);
|
||||
nfsrv_localunlock(tvp, lfp, first, end, p);
|
||||
LIST_FOREACH_SAFE(rlp, &lfp->lf_rollback, rlck_list,
|
||||
nrlp)
|
||||
free(rlp, M_NFSDROLLBACK);
|
||||
LIST_INIT(&lfp->lf_rollback);
|
||||
}
|
||||
nfsrv_freenfslock(lop);
|
||||
} else
|
||||
nfsrv_freenfslock(lop);
|
||||
lop = nlop;
|
||||
}
|
||||
if (vp == NULL && tvp != NULL)
|
||||
|
|
|
|||
Loading…
Reference in a new issue