+#define LQUEUE_INIT \
+ TCON_WRAP_INIT({ NULL, })
+
+/**
+ * lqueue_entry - convert an lqueue_link back into the structure containing it.
+ * @q: the queue
+ * @l: the lqueue_link
+ *
+ * Example:
+ * struct waiter {
+ * char *name;
+ * struct lqueue_link ql;
+ * } w;
+ * LQUEUE(struct waiter, ql) my_queue;
+ * assert(lqueue_entry(&my_queue, &w.ql) == &w);
+ */
+#define lqueue_entry(q_, l_) tcon_container_of((q_), canary, (l_))
+
+/**
+ * lqueue_init_from_back - initialize a queue with a specific back element
+ * @s: the lqueue to initialize
+ * @e: pointer to the back element of the new queue
+ *
+ * USE WITH CAUTION: This is for handling unusual cases where you have
+ * a pointer to an element in a previously constructed queue but can't
+ * conveniently pass around a normal struct lqueue. Usually you
+ * should use lqueue_init().
+ *
+ * Example:
+ * struct element {
+ * int value;
+ * struct lqueue_link link;
+ * } el;
+ * LQUEUE(struct element, link) queue1;
+ * LQUEUE(struct element, link) queue2;
+ *
+ * lqueue_enqueue(&queue1, &el);
+ *
+ * lqueue_init_from_back(&queue2, lqueue_back(&queue1));
+ */
+#define lqueue_init_from_back(q_, e_) \
+ (lqueue_init_(tcon_unwrap(q_), tcon_member_of((q_), canary, (e_))))