diff --git a/[refs] b/[refs] index d501b123c109..91c3ae5bc592 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1da43e4a9ee942c9c967dbe8839476571df0c3ed +refs/heads/master: 93dd40013f4f7f4b18d19d0d77855f025bcc57c3 diff --git a/trunk/include/linux/klist.h b/trunk/include/linux/klist.h index a119c0da8977..b49385f13419 100644 --- a/trunk/include/linux/klist.h +++ b/trunk/include/linux/klist.h @@ -46,6 +46,8 @@ struct klist_node { extern void klist_add_tail(struct klist_node * n, struct klist * k); extern void klist_add_head(struct klist_node * n, struct klist * k); +extern void klist_add_after(struct klist_node *n, struct klist_node *pos); +extern void klist_add_before(struct klist_node *n, struct klist_node *pos); extern void klist_del(struct klist_node * n); extern void klist_remove(struct klist_node * n); diff --git a/trunk/lib/klist.c b/trunk/lib/klist.c index 120bd175aa78..ebba9488046e 100644 --- a/trunk/lib/klist.c +++ b/trunk/lib/klist.c @@ -120,6 +120,39 @@ void klist_add_tail(struct klist_node * n, struct klist * k) EXPORT_SYMBOL_GPL(klist_add_tail); +/** + * klist_add_after - Init a klist_node and add it after an existing node + * @n: node we're adding. + * @pos: node to put @n after + */ +void klist_add_after(struct klist_node *n, struct klist_node *pos) +{ + struct klist *k = pos->n_klist; + + klist_node_init(k, n); + spin_lock(&k->k_lock); + list_add(&n->n_node, &pos->n_node); + spin_unlock(&k->k_lock); +} +EXPORT_SYMBOL_GPL(klist_add_after); + +/** + * klist_add_before - Init a klist_node and add it before an existing node + * @n: node we're adding. + * @pos: node to put @n after + */ +void klist_add_before(struct klist_node *n, struct klist_node *pos) +{ + struct klist *k = pos->n_klist; + + klist_node_init(k, n); + spin_lock(&k->k_lock); + list_add_tail(&n->n_node, &pos->n_node); + spin_unlock(&k->k_lock); +} +EXPORT_SYMBOL_GPL(klist_add_before); + + static void klist_release(struct kref * kref) { struct klist_node * n = container_of(kref, struct klist_node, n_ref);