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:
parent
9a69494e8b
commit
653fae1761
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user