Rework pfs_iterate() a bit to eliminate a bug related to process

directories.  Previously, pfs_iterate() would return -1 when it
reached the end of the process list while processing a process
directory node, even if the parent directory contained further nodes
(which is the case for the linprocfs root directory, where the process
directory node is actually first in the list).  With this patch,
pfs_iterate() will continue to traverse the parent directory's node
list after exhausting the process list (as was the intention all
along).  The code should hopefully be easier to read as well.

While I'm here, have pfs_iterate() assert that the allproc lock is
held.
This commit is contained in:
Dag-Erling Smørgrav 2003-08-18 13:36:09 +00:00
parent 9a69494e8b
commit 653fae1761
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=119069

View file

@ -543,21 +543,24 @@ static int
pfs_iterate(struct thread *td, pid_t pid, struct pfs_node *pd,
struct pfs_node **pn, struct proc **p)
{
if ((*pn) == NULL)
*pn = pd->pn_nodes;
else
mtx_assert(&allproc, MA_OWNED);
again:
if ((*pn)->pn_type != pfstype_procdir)
if (*pn == NULL) {
/* first node */
*pn = pd->pn_nodes;
} else if ((*pn)->pn_type != pfstype_procdir) {
/* next node */
*pn = (*pn)->pn_next;
while (*pn != NULL && (*pn)->pn_type == pfstype_procdir) {
}
if (*pn != NULL && (*pn)->pn_type == pfstype_procdir) {
/* next process */
if (*p == NULL)
*p = LIST_FIRST(&allproc);
else
*p = LIST_NEXT(*p, p_list);
if (*p != NULL)
break;
*pn = (*pn)->pn_next;
/* out of processes: next node */
if (*p == NULL)
*pn = (*pn)->pn_next;
}
if ((*pn) == NULL)