WITNESS won't let us hold two filedesc locks at the same time, so juggle

fdp and newfdp around a bit.
This commit is contained in:
Dag-Erling Smørgrav 2004-01-16 21:54:56 +00:00
parent bafc8f255a
commit 56a9fc0e93
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=124598

View File

@ -1428,10 +1428,11 @@ fdcopy(fdp)
FILEDESC_LOCK_ASSERT(fdp, MA_OWNED);
newfdp = fdinit(fdp);
FILEDESC_LOCK(newfdp);
while (fdp->fd_lastfile >= newfdp->fd_nfiles) {
FILEDESC_UNLOCK(fdp);
FILEDESC_LOCK(newfdp);
fdgrowtable(newfdp, fdp->fd_lastfile + 1);
FILEDESC_UNLOCK(newfdp);
FILEDESC_LOCK(fdp);
}
/* copy everything except kqueue descriptors */
@ -1441,7 +1442,6 @@ fdcopy(fdp)
fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE) {
newfdp->fd_ofiles[i] = fdp->fd_ofiles[i];
newfdp->fd_ofileflags[i] = fdp->fd_ofileflags[i];
fdused(newfdp, i);
fhold(newfdp->fd_ofiles[i]);
newfdp->fd_lastfile = i;
} else {
@ -1449,10 +1449,16 @@ fdcopy(fdp)
newfdp->fd_freefile = i;
}
}
FILEDESC_UNLOCK(fdp);
FILEDESC_LOCK(newfdp);
for (i = 0; i <= newfdp->fd_lastfile; ++i)
if (newfdp->fd_ofiles[i] != NULL)
fdused(newfdp, i);
FILEDESC_UNLOCK(newfdp);
FILEDESC_LOCK(fdp);
if (newfdp->fd_freefile == -1)
newfdp->fd_freefile = i;
newfdp->fd_cmask = fdp->fd_cmask;
FILEDESC_UNLOCK(newfdp);
return (newfdp);
}