diff options
| -rw-r--r-- | include/linux/klist.h | 2 | ||||
| -rw-r--r-- | lib/klist.c | 33 |
2 files changed, 35 insertions, 0 deletions
diff --git a/include/linux/klist.h b/include/linux/klist.h index a119c0da8977..b49385f13419 100644 --- a/include/linux/klist.h +++ b/include/linux/klist.h | |||
| @@ -46,6 +46,8 @@ struct klist_node { | |||
| 46 | 46 | ||
| 47 | extern void klist_add_tail(struct klist_node * n, struct klist * k); | 47 | extern void klist_add_tail(struct klist_node * n, struct klist * k); |
| 48 | extern void klist_add_head(struct klist_node * n, struct klist * k); | 48 | extern void klist_add_head(struct klist_node * n, struct klist * k); |
| 49 | extern void klist_add_after(struct klist_node *n, struct klist_node *pos); | ||
| 50 | extern void klist_add_before(struct klist_node *n, struct klist_node *pos); | ||
| 49 | 51 | ||
| 50 | extern void klist_del(struct klist_node * n); | 52 | extern void klist_del(struct klist_node * n); |
| 51 | extern void klist_remove(struct klist_node * n); | 53 | extern void klist_remove(struct klist_node * n); |
diff --git a/lib/klist.c b/lib/klist.c index 120bd175aa78..ebba9488046e 100644 --- a/lib/klist.c +++ b/lib/klist.c | |||
| @@ -120,6 +120,39 @@ void klist_add_tail(struct klist_node * n, struct klist * k) | |||
| 120 | EXPORT_SYMBOL_GPL(klist_add_tail); | 120 | EXPORT_SYMBOL_GPL(klist_add_tail); |
| 121 | 121 | ||
| 122 | 122 | ||
| 123 | /** | ||
| 124 | * klist_add_after - Init a klist_node and add it after an existing node | ||
| 125 | * @n: node we're adding. | ||
| 126 | * @pos: node to put @n after | ||
| 127 | */ | ||
| 128 | void klist_add_after(struct klist_node *n, struct klist_node *pos) | ||
| 129 | { | ||
| 130 | struct klist *k = pos->n_klist; | ||
| 131 | |||
| 132 | klist_node_init(k, n); | ||
| 133 | spin_lock(&k->k_lock); | ||
| 134 | list_add(&n->n_node, &pos->n_node); | ||
| 135 | spin_unlock(&k->k_lock); | ||
| 136 | } | ||
| 137 | EXPORT_SYMBOL_GPL(klist_add_after); | ||
| 138 | |||
| 139 | /** | ||
| 140 | * klist_add_before - Init a klist_node and add it before an existing node | ||
| 141 | * @n: node we're adding. | ||
| 142 | * @pos: node to put @n after | ||
| 143 | */ | ||
| 144 | void klist_add_before(struct klist_node *n, struct klist_node *pos) | ||
| 145 | { | ||
| 146 | struct klist *k = pos->n_klist; | ||
| 147 | |||
| 148 | klist_node_init(k, n); | ||
| 149 | spin_lock(&k->k_lock); | ||
| 150 | list_add_tail(&n->n_node, &pos->n_node); | ||
| 151 | spin_unlock(&k->k_lock); | ||
| 152 | } | ||
| 153 | EXPORT_SYMBOL_GPL(klist_add_before); | ||
| 154 | |||
| 155 | |||
| 123 | static void klist_release(struct kref * kref) | 156 | static void klist_release(struct kref * kref) |
| 124 | { | 157 | { |
| 125 | struct klist_node * n = container_of(kref, struct klist_node, n_ref); | 158 | struct klist_node * n = container_of(kref, struct klist_node, n_ref); |
