Page MenuHomeFreeBSD

D21550.id61832.diff
No OneTemporary

D21550.id61832.diff

Index: sys/fs/pseudofs/pseudofs.h
===================================================================
--- sys/fs/pseudofs/pseudofs.h
+++ sys/fs/pseudofs/pseudofs.h
@@ -237,6 +237,7 @@
struct pfs_node *pn_parent; /* (o) */
struct pfs_node *pn_nodes; /* (o) */
+ struct pfs_node *pn_last_node; /* (o) */
struct pfs_node *pn_next; /* (p) */
};
Index: sys/fs/pseudofs/pseudofs.c
===================================================================
--- sys/fs/pseudofs/pseudofs.c
+++ sys/fs/pseudofs/pseudofs.c
@@ -135,10 +135,21 @@
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);
}
@@ -148,7 +159,7 @@
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__));
@@ -156,6 +167,16 @@
("%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) {

File Metadata

Mime Type
text/plain
Expires
Sun, Dec 21, 2:54 AM (7 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27105699
Default Alt Text
D21550.id61832.diff (1 KB)

Event Timeline