list_for_each_entry の定義を見てください
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h?id=refs/tags/v3.10-rc2#n418から
ご覧のとおり、これは単純な for ループとして定義されており、黒魔術はありません。continue/break を使用できます。
あなたの他の質問については、なぜそれをやろうとしているのかにかかっていると思います。最も簡単な方法は次のとおりです。
int iterateAgain = 0;
list_for_each_entry(pos, head, member) {
// (...)
if (something == pos.x) {
iterateAgain = 1;
break;
}
}
if (iterateAgain) {
list_for_each_entry(pos, head, member) {
// (...)
}
}
ただし、コードによっては、冗長すぎるなどの可能性があります。再帰関数も使用できます。これには多くの方法があります。
コメントの後に編集:
int keepIterating;
do {
keepIterating = 0;
list_for_each_entry(pos, head, member) {
// (...)
if (something == pos.x) {
keepIterating = 1;
break;
}
}
} while (keepIterating);