Linuxのlinux/list.hに

#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

こういう個所があったのですが、このdo{...}while何を意味しているんでしょうか?