|
@@ -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);
|