<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div dir="auto">I'm sorry, but this patch can and has to be split into series of patches.</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">11 июля 2017 г. 20:48 пользователь Dmitry Safonov &lt;dsafonov@virtuozzo.com&gt; написал:<br type="attribution">
<blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><font size="2"><span style="font-size:10pt">
<div>Mainstream already has arch_prctl(MAP_VDSO_64), but this was<br>
ommited for simplicity and we only have arch_prctl(MAP_VDSO_32).<br>
This was not a problem as previously we needed MAP_VDSO_32 only<br>
for ia32 applications C/R.<br>
<br>
But as we've made vdso pages to be per-UTS-ns, pages differ between<br>
host and uts-ns. As CRIU restore starts from init-ns, vdso that's<br>
being preserved into restored application belongs to host and<br>
thou has host's ve_time_spec.<br>
<br>
Using this API we can map vdso in restored CT and it'll belong<br>
to uts-ns of CT.<br>
<br>
<a href="https://jira.sw.ru/browse/PSBM-67017">https://jira.sw.ru/browse/PSBM-67017</a><br>
<br>
Cc: Andrey Ryabinin &lt;aryabinin@virtuozzo.com&gt;<br>
Signed-off-by: Dmitry Safonov &lt;dsafonov@virtuozzo.com&gt;<br>
---<br>
&nbsp;arch/x86/include/asm/elf.h&nbsp;&nbsp; |&nbsp; 6 &#43;&#43;&#43;&#43;&#43;-<br>
&nbsp;arch/x86/kernel/process_64.c | 14 &#43;&#43;&#43;&#43;&#43;&#43;-------<br>
&nbsp;arch/x86/vdso/vdso32-setup.c | 12 &#43;----------<br>
&nbsp;arch/x86/vdso/vma.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 48 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;--------<br>
&nbsp;4 files changed, 53 insertions(&#43;), 27 deletions(-)<br>
<br>
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h<br>
index 8b0f63910b06..920690b3a5d5 100644<br>
--- a/arch/x86/include/asm/elf.h<br>
&#43;&#43;&#43; b/arch/x86/include/asm/elf.h<br>
@@ -353,7 &#43;353,11 @@ extern int syscall32_setup_pages(struct linux_binprm *, int exstack);<br>
&nbsp;#define compat_arch_setup_additional_pages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syscall32_setup_pages<br>
&nbsp;<br>
&nbsp;#ifdef CONFIG_X86_64<br>
-extern int do_map_compat_vdso(unsigned long addr);<br>
&#43;extern bool vdso_or_vvar_present(struct mm_struct *mm);<br>
&#43;extern int do_map_vdso_64(unsigned long addr);<br>
&#43;# ifdef CONFIG_COMPAT<br>
&#43;extern int do_map_vdso_32(unsigned long addr);<br>
&#43;# endif<br>
&nbsp;#endif<br>
&nbsp;<br>
&nbsp;extern unsigned long arch_randomize_brk(struct mm_struct *mm);<br>
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c<br>
index d2e444cb7209..252f9f0ecc0f 100644<br>
--- a/arch/x86/kernel/process_64.c<br>
&#43;&#43;&#43; b/arch/x86/kernel/process_64.c<br>
@@ -580,16 &#43;580,16 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;<br>
&nbsp;#ifdef CONFIG_CHECKPOINT_RESTORE<br>
&#43;# ifdef CONFIG_COMPAT<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ARCH_MAP_VDSO_32:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return do_map_compat_vdso(addr);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return do_map_vdso_32(addr);<br>
&#43;# endif<br>
&nbsp;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * x32 and 64 vDSO remap API is omitted for simplicity.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * We do need 32-bit vDSO blob mapping for compatible<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * applications Restore, but not x32/64 (at least, for now).<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ARCH_MAP_VDSO_X32:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ARCH_MAP_VDSO_64:<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return do_map_vdso_64(addr);<br>
&#43;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* x32 vDSO remap API is omitted for simplicity. */<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ARCH_MAP_VDSO_X32:<br>
&nbsp;#endif<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>
diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c<br>
index 81a16c803f11..30b99959daed 100644<br>
--- a/arch/x86/vdso/vdso32-setup.c<br>
&#43;&#43;&#43; b/arch/x86/vdso/vdso32-setup.c<br>
@@ -512,17 &#43;512,7 @@ up_fail:<br>
&nbsp;<br>
&nbsp;#ifdef CONFIG_X86_64<br>
&nbsp;<br>
-static bool vdso_or_vvar_present(struct mm_struct *mm)<br>
-{<!-- --><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct vm_area_struct *vma;<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (vma = mm-&gt;mmap; vma; vma = vma-&gt;vm_next)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (vma_is_vdso_or_vvar(vma, mm))<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>
-}<br>
-<br>
-int do_map_compat_vdso(unsigned long req_addr)<br>
&#43;int do_map_vdso_32(unsigned long req_addr)<br>
&nbsp;{<!-- --><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct mm_struct *mm = current-&gt;mm;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long vdso_addr;<br>
diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c<br>
index ad0e0ac14f83..accca8edc62b 100644<br>
--- a/arch/x86/vdso/vma.c<br>
&#43;&#43;&#43; b/arch/x86/vdso/vma.c<br>
@@ -171,28 &#43;171,52 @@ static unsigned long vdso_addr(unsigned long start, unsigned len)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return addr;<br>
&nbsp;}<br>
&nbsp;<br>
&#43;bool vdso_or_vvar_present(struct mm_struct *mm)<br>
&#43;{<!-- --><br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct vm_area_struct *vma;<br>
&#43;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (vma = mm-&gt;mmap; vma; vma = vma-&gt;vm_next)<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (vma_is_vdso_or_vvar(vma, mm))<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>
&#43;}<br>
&#43;<br>
&nbsp;/* Setup a VMA at program startup for the vsyscall page.<br>
&nbsp;&nbsp;&nbsp; Not called for compat tasks */<br>
&nbsp;static int setup_additional_pages(struct linux_binprm *bprm,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int uses_interp,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct page **pages,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned size)<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned size,<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long req_addr)<br>
&nbsp;{<!-- --><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct mm_struct *mm = current-&gt;mm;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long addr;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long addr = req_addr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ret;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!vdso_enabled)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; down_write(&amp;mm-&gt;mmap_sem);<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addr = vdso_addr(mm-&gt;start_stack, size);<br>
&#43;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (vdso_or_vvar_present(mm)) {<!-- --><br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = -EEXIST;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto up_fail;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&#43;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!req_addr)<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addr = vdso_addr(mm-&gt;start_stack, size);<br>
&#43;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addr = get_unmapped_area(NULL, addr, size, 0, 0);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IS_ERR_VALUE(addr)) {<!-- --><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = addr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto up_fail;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req_addr &amp;&amp; req_addr != addr) {<!-- --><br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = -EFAULT;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto up_fail;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&#43;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current-&gt;mm-&gt;context.vdso = (void *)addr;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = install_special_mapping(mm, addr, size,<br>
@@ -211,7 &#43;235,8 @@ up_fail:<br>
&nbsp;<br>
&nbsp;static DEFINE_MUTEX(vdso_mutex);<br>
&nbsp;<br>
-static int uts_arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)<br>
&#43;static int uts_arch_setup_additional_pages(struct linux_binprm *bprm,<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int uses_interp, unsigned long addr)<br>
&nbsp;{<!-- --><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct uts_namespace *uts_ns = current-&gt;nsproxy-&gt;uts_ns;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct ve_struct *ve = get_exec_env();<br>
@@ -303,9 &#43;328,11 @@ static int uts_arch_setup_additional_pages(struct linux_binprm *bprm, int uses_i<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LINUX_VERSION_CODE, new_version, ve-&gt;veid);<br>
&nbsp;<br>
&nbsp;map_uts:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return setup_additional_pages(bprm, uses_interp, uts_ns-&gt;vdso.pages, uts_ns-&gt;vdso.size);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return setup_additional_pages(bprm, uses_interp, uts_ns-&gt;vdso.pages,<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uts_ns-&gt;vdso.size, addr);<br>
&nbsp;map_init_uts:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return setup_additional_pages(bprm, uses_interp, init_uts_ns.vdso.pages, init_uts_ns.vdso.size);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return setup_additional_pages(bprm, uses_interp, init_uts_ns.vdso.pages,<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init_uts_ns.vdso.size, addr);<br>
&nbsp;out_unlock:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mutex_unlock(&amp;vdso_mutex);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -ENOMEM;<br>
@@ -313,14 &#43;340,19 @@ out_unlock:<br>
&nbsp;<br>
&nbsp;int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)<br>
&nbsp;{<!-- --><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return uts_arch_setup_additional_pages(bprm, uses_interp);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return uts_arch_setup_additional_pages(bprm, uses_interp, 0);<br>
&#43;}<br>
&#43;<br>
&#43;int do_map_vdso_64(unsigned long req_addr)<br>
&#43;{<!-- --><br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return uts_arch_setup_additional_pages(0, 0, req_addr);<br>
&nbsp;}<br>
&nbsp;<br>
&nbsp;#ifdef CONFIG_X86_X32_ABI<br>
&nbsp;int x32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)<br>
&nbsp;{<!-- --><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return setup_additional_pages(bprm, uses_interp, vdsox32_pages,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vdsox32_size);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vdsox32_size, 0);<br>
&nbsp;}<br>
&nbsp;#endif<br>
&nbsp;<br>
-- <br>
2.13.1<br>
<br>
_______________________________________________<br>
Devel mailing list<br>
Devel@openvz.org<br>
<a href="https://lists.openvz.org/mailman/listinfo/devel">https://lists.openvz.org/mailman/listinfo/devel</a><br>
</div>
</span></font></div>
</blockquote>
</div>
<br>
</div>
</body>
</html>