[RHEL7,COMMIT] list: introduce list_for_each_continue()

Submitted by Vasily Averin on March 3, 2021, 6:12 a.m.


Message ID 202103030612.1236CYTc030896@vz7build.vvs.sw.ru
State New
Series "proc/mounts: fix missing mounts in mountinfo"
Headers show

Commit Message

Vasily Averin March 3, 2021, 6:12 a.m.
The commit is pushed to "branch-rh7-3.10.0-1160.15.2.vz7.173.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.15.2.vz7.173.1
commit d97fb1c6695090cad8cce767cd056d46dc4f7af2
Author: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Date:   Wed Mar 3 09:12:34 2021 +0300

    list: introduce list_for_each_continue()
    Patch-set description:
    We see a race when reading mountinfo from criu line-by-line. When we
    read mountinfo line-by-line and some mounts which were already printed
    were umounted before printing next mounts we can see some of next mounts
    skipped from output (consequent cat /proc/<pid>/mountinfo shows them).
    This leads to situations where the mount tree is inconsistend without
    those missing mounts and criu fails.
    So mountinfo printing based on numeric position in mounts list is racy.
    We can switch to new mainstream approach witch adds mountinfo "cursor"
    to mount namespace mounts list so that even if some mounts are deleted
    from the list, we can still continue reading next mounts after "cursor"
    Original patch description:
    From: Pavel Begunkov <asml.silence@gmail.com>
    As other *continue() helpers, this continues iteration from a given
    Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    (cherry-picked from 28ca0d6d39ab1d01c86762c82a585b7cedd2920c)
    Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
 include/linux/list.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

Patch hide | download patch | download mbox

diff --git a/include/linux/list.h b/include/linux/list.h
index 328d12d..b59d578 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -442,6 +442,16 @@  static inline void list_splice_tail_init(struct list_head *list,
 	for (pos = (head)->next; pos != (head); pos = pos->next)
+ * list_for_each_continue - continue iteration over a list
+ * @pos:	the &struct list_head to use as a loop cursor.
+ * @head:	the head for your list.
+ *
+ * Continue to iterate over a list, continuing after the current position.
+ */
+#define list_for_each_continue(pos, head) \
+	for (pos = pos->next; pos != (head); pos = pos->next)
  * list_for_each_prev	-	iterate over a list backwards
  * @pos:	the &struct list_head to use as a loop cursor.
  * @head:	the head for your list.