pfs_fileno_alloc(pn);
pfs_lock(parent);
- pn->pn_next = parent->pn_nodes;
if ((parent->pn_flags & PFS_PROCDEP) != 0)
pn->pn_flags |= PFS_PROCDEP;
- parent->pn_nodes = pn;
+ if (parent->pn_nodes == NULL) {
+ KASSERT(parent->pn_last_node == NULL,
+ ("%s(): pn_last_node not NULL", __func__));
+ parent->pn_nodes = pn;
+ parent->pn_last_node = pn;
+ } else {
+ KASSERT(parent->pn_last_node != NULL,
+ ("%s(): pn_last_node is NULL", __func__));
+ KASSERT(parent->pn_last_node->pn_next == NULL,
+ ("%s(): pn_last_node->pn_next not NULL", __func__));
+ parent->pn_last_node->pn_next = pn;
+ parent->pn_last_node = pn;
+ }
pfs_unlock(parent);
}
static void
pfs_detach_node(struct pfs_node *pn)
{
- struct pfs_node *parent = pn->pn_parent;
+ struct pfs_node *node, *parent = pn->pn_parent;
struct pfs_node **iter;
KASSERT(parent != NULL, ("%s(): node has no parent", __func__));
("%s(): parent has different pn_info", __func__));
pfs_lock(parent);
+ if (pn == parent->pn_last_node) {
+ if (pn == pn->pn_nodes) {
+ parent->pn_last_node = NULL;
+ } else {
+ for (node = parent->pn_nodes;
+ node->pn_next != pn; node = node->pn_next)
+ continue;
+ parent->pn_last_node = node;
+ }
+ }
iter = &parent->pn_nodes;
while (*iter != NULL) {
if (*iter == pn) {