<div dir="ltr"><div>Hi, Christian!</div><div><br></div><div>Thanks for your attention to the patch!</div><div>This field is introduced with aufs (a3a49a17226f99a5e5dbdcbd328398cbf3c2959e) and it allows to have two struct files connected with</div><div>vma. One for memory management needs and seconds for things like proc/&lt;pid&gt;/map_files, numa_maps and so on.</div><div><br></div><div>Alex<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 27, 2021 at 12:47 PM Christian Brauner &lt;<a href="mailto:christian.brauner@ubuntu.com">christian.brauner@ubuntu.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Mon, Apr 26, 2021 at 11:11:21AM +0300, <a href="mailto:alexander@mihalicyn.com" target="_blank">alexander@mihalicyn.com</a> wrote:<br>
&gt; From: Alexander Mikhalitsyn &lt;<a href="mailto:alexander@mihalicyn.com" target="_blank">alexander@mihalicyn.com</a>&gt;<br>
&gt; <br>
&gt; BugLink: <a href="https://bugs.launchpad.net/bugs/1857257" rel="noreferrer" target="_blank">https://bugs.launchpad.net/bugs/1857257</a><br>
&gt; <br>
&gt; The hack was introduced in (&quot;UBUNTU: SAUCE: overlayfs: allow with<br>
&gt; shiftfs as underlay&quot;) and it broke checkpoint/restore of docker<br>
&gt; contains:<br>
&gt; <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1857257" rel="noreferrer" target="_blank">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1857257</a><br>
&gt; <br>
&gt; The following script can be used to trigger the issue:<br>
&gt;   #!/bin/bash<br>
&gt; <br>
&gt;   cat &gt; test.py &lt;&lt; EOF<br>
&gt;   import sys<br>
&gt; <br>
&gt;   f = open(&quot;/proc/self/maps&quot;)<br>
&gt; <br>
&gt;   for l in f.readlines():<br>
&gt;     if &quot;python&quot; not in l:<br>
&gt;       continue<br>
&gt;     print(l)<br>
&gt;     s = l.split()<br>
&gt;     start, end = s[0].split(&quot;-&quot;)<br>
&gt;     fname = s[-1]<br>
&gt;     print(start, end, fname)<br>
&gt;     break<br>
&gt;   else:<br>
&gt;     sys.exit(1)<br>
&gt; <br>
&gt;   test_file1 = open(fname)<br>
&gt;   test_file2 = open(&quot;/proc/self/map_files/%s-%s&quot; % (start, end))<br>
&gt; <br>
&gt;   fdinfo1 = open(&quot;/proc/self/fdinfo/%d&quot; % test_file1.fileno()).read()<br>
&gt;   fdinfo2 = open(&quot;/proc/self/fdinfo/%d&quot; % test_file2.fileno()).read()<br>
&gt; <br>
&gt;   if fdinfo1 != fdinfo2:<br>
&gt;     print(&quot;FAIL&quot;)<br>
&gt;     print(test_file1)<br>
&gt;     print(fdinfo1)<br>
&gt;     print(test_file2)<br>
&gt;     print(fdinfo2)<br>
&gt;     sys.exit(1)<br>
&gt;   print(&quot;PASS&quot;)<br>
&gt;   EOF<br>
&gt;   sudo docker run -it --privileged --rm -v `pwd`:/mnt python python /mnt/test.py<br>
&gt; <br>
&gt; Thanks to Andrei Vagin for the reproducer and investigation of this problem.<br>
&gt; <br>
&gt; Cc: Andrei Vagin &lt;<a href="mailto:avagin@gmail.com" target="_blank">avagin@gmail.com</a>&gt;<br>
&gt; Cc: Adrian Reber &lt;<a href="mailto:areber@redhat.com" target="_blank">areber@redhat.com</a>&gt;<br>
&gt; Cc: Christian Brauner &lt;<a href="mailto:christian.brauner@ubuntu.com" target="_blank">christian.brauner@ubuntu.com</a>&gt;<br>
&gt; Cc: Stefan Bader &lt;<a href="mailto:stefan.bader@canonical.com" target="_blank">stefan.bader@canonical.com</a>&gt;<br>
&gt; Cc: Kleber Sacilotto de Souza &lt;<a href="mailto:kleber.souza@canonical.com" target="_blank">kleber.souza@canonical.com</a>&gt;<br>
&gt; Cc: Krzysztof Kozlowski &lt;<a href="mailto:krzysztof.kozlowski@canonical.com" target="_blank">krzysztof.kozlowski@canonical.com</a>&gt;<br>
&gt; <br>
&gt; Fixes: d24b8a5 (&quot;UBUNTU: SAUCE: overlayfs: allow with shiftfs as underlay&quot;)<br>
&gt; Signed-off-by: Alexander Mikhalitsyn &lt;<a href="mailto:alexander@mihalicyn.com" target="_blank">alexander@mihalicyn.com</a>&gt;<br>
&gt; ---<br>
<br>
Hey,<br>
<br>
Thanks for the patch!<br>
Fwiw, Andrei already tried to fix this a while ago but it caused another<br>
regression which forced us to revert the fix for this issue.<br>
<br>
&gt;  fs/overlayfs/file.c | 29 +++++++++++++++++++++++++++++<br>
&gt;  1 file changed, 29 insertions(+)<br>
&gt; <br>
&gt; diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c<br>
&gt; index 0d3ea0cf3e98..5fa520d0798e 100644<br>
&gt; --- a/fs/overlayfs/file.c<br>
&gt; +++ b/fs/overlayfs/file.c<br>
&gt; @@ -325,6 +325,18 @@ static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync)<br>
&gt;       return ret;<br>
&gt;  }<br>
&gt;  <br>
&gt; +/* handle vma-&gt;vm_prfile */<br>
&gt; +static void ovl_vm_prfile_set(struct vm_area_struct *vma,<br>
&gt; +                           struct file *file)<br>
&gt; +{<br>
&gt; +     get_file(file);<br>
&gt; +     vma-&gt;vm_prfile = file;<br>
&gt; +#ifndef CONFIG_MMU<br>
&gt; +     get_file(file);<br>
&gt; +     vma-&gt;vm_region-&gt;vm_prfile = file;<br>
&gt; +#endif<br>
&gt; +}<br>
<br>
I&#39;m confused struct vm_area_struct doesn&#39;t have a vm_prfile entry. Can<br>
you explain, please?<br>
<br>
&gt; +<br>
&gt;  static int ovl_mmap(struct file *file, struct vm_area_struct *vma)<br>
&gt;  {<br>
&gt;       struct file *realfile = file-&gt;private_data;<br>
&gt; @@ -351,6 +363,23 @@ static int ovl_mmap(struct file *file, struct vm_area_struct *vma)<br>
&gt;               vma-&gt;vm_file = file;<br>
&gt;               fput(realfile);<br>
&gt;       } else {<br>
&gt; +             /*<br>
&gt; +              * In map_files_get_link() (fs/proc/base.c)<br>
&gt; +              * we need to determine correct path from overlayfs.<br>
&gt; +              * But real_mount(realfile-&gt;f_path.mnt) may be not<br>
&gt; +              * equal to real_mount(file-&gt;f_path.mnt). In such case<br>
&gt; +              * fdinfo of the same file which was opened from<br>
&gt; +              * /proc/&lt;pid&gt;/map_files/... and &quot;usual&quot; path<br>
&gt; +              * will show different mnt_id.<br>
&gt; +              *<br>
&gt; +              * We solve issue like in aufs by using additional<br>
&gt; +              * field on struct vm_area_struct called &quot;vm_prfile&quot;<br>
&gt; +              * which is used only for fdinfo/&quot;printing&quot; needs.<br>
&gt; +              *<br>
&gt; +              * See also mm/prfile.c<br>
&gt; +              */<br>
&gt; +             ovl_vm_prfile_set(vma, file);<br>
&gt; +<br>
&gt;               /* Drop reference count from previous vm_file value */<br>
&gt;               fput(file);<br>
&gt;       }<br>
&gt; -- <br>
&gt; 2.30.2<br>
&gt; <br>
</blockquote></div>