<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 21, 2014 at 4:54 AM, Pavel Emelyanov <span dir="ltr">&lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">On 08/21/2014 02:32 AM, Saied Kazemi wrote:<br>
&gt; OK, I used ppage_bitmap as aufs_fpath during dump to get rid of fixup_aufs_fd_path().  So, we scan the branches only once.<br>
&gt;<br>
&gt; I also got rid of --aufs command line option but kept opts.aufs which is automatically set in the .parse callback.<br>
&gt; Since opts.aufs is now used in only one place, it&#39;ll be easier to get rid of it in a future patch.<br>
&gt;<br>
&gt; I rebased my code to the head and made sure all comments correctly reflect the current state.  Please review the attached<br>
&gt; patch file and let me know what you think.<br>
<br>
</div>I have no more concerns, thanks :) I plan to make 1.3 release at the end of the<br>
next week. If this is the final version of the patch, I can merge it in 1.3<br>
<br>
Thanks,<br>
Pavel<br></blockquote><div><br></div><div>Great!  1.3 will be a feature-rich release.</div><div><br></div><div>I will let you know by the end of this week if there are any changes as I plan to test UnionFS which is similar to AUFS but not identical.</div>
<div><br></div><div>Also, I hope to find time before the end of next week to write an instruction page for <a href="http://criu.org">criu.org</a> on how to dump and restore Docker containers.</div><div><br></div><div>Cheers!</div>
<div><br></div><div>--Saied<br></div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">&gt; On Wed, Aug 20, 2014 at 11:00 AM, Pavel Emelyanov &lt;<a href="mailto:xemul@parallels.com">xemul@parallels.com</a> &lt;mailto:<a href="mailto:xemul@parallels.com">xemul@parallels.com</a>&gt;&gt; wrote:<br>

&gt;<br>
&gt;     On 08/20/2014 08:54 PM, Saied Kazemi wrote:<br>
&gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt; @@ -240,6 +244,31 @@ static int vma_get_mapfile(struct vma_area *vma, DIR *mfd,<br>
&gt;     &gt;     &gt;                       vma-&gt;vm_socket_id = buf.st_ino;<br>
&gt;     &gt;     &gt;               } else if (errno != ENOENT)<br>
&gt;     &gt;     &gt;                       return -1;<br>
&gt;     &gt;     &gt; +     } else if (opts.aufs) {<br>
&gt;     &gt;     &gt; +             /*<br>
&gt;     &gt;     &gt; +              * AUFS support to compensate for the kernel bug<br>
&gt;     &gt;     &gt; +              * exposing branch pathnames in map_files.<br>
&gt;     &gt;     &gt; +              *<br>
&gt;     &gt;     &gt; +              * If the link points inside a branch, replace it<br>
&gt;     &gt;     &gt; +              * with a pathname from the root for later use in<br>
&gt;     &gt;     &gt; +              * dump_filemap().<br>
&gt;     &gt;     &gt; +              */<br>
&gt;     &gt;     &gt; +             char p[PATH_MAX];<br>
&gt;     &gt;     &gt; +             int n;<br>
&gt;     &gt;     &gt; +<br>
&gt;     &gt;     &gt; +             p[0] = &#39;.&#39;;<br>
&gt;     &gt;     &gt; +             n = read_fd_link(vma-&gt;vm_file_fd, &amp;p[1], sizeof p - 1);<br>
&gt;     &gt;     &gt; +             if (n &lt; 0)<br>
&gt;     &gt;     &gt; +                     return -1;<br>
&gt;     &gt;     &gt; +             n = fixup_aufs_path(&amp;p[1], sizeof p - 1, true);<br>
&gt;     &gt;     &gt; +             if (n &lt; 0)<br>
&gt;     &gt;     &gt; +                     return -1;<br>
&gt;     &gt;     &gt; +             if (n &gt; 0) {<br>
&gt;     &gt;     &gt; +                     vma-&gt;aufs_rpath = xmalloc(n + 2);<br>
&gt;     &gt;     &gt; +                     if (!vma-&gt;aufs_rpath)<br>
&gt;     &gt;     &gt; +                             return -1;<br>
&gt;     &gt;     &gt; +                     strcpy(vma-&gt;aufs_rpath, p);<br>
&gt;     &gt;     &gt; +             }<br>
&gt;     &gt;     &gt;       }<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;       return 0;<br>
&gt;     &gt;     &gt; @@ -450,12 +479,24 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file<br>
&gt;     &gt;     &gt;                       vma_area-&gt;st = prev-&gt;st;<br>
&gt;     &gt;     &gt;               } else if (vma_area-&gt;vm_file_fd &gt;= 0) {<br>
&gt;     &gt;     &gt;                       struct stat *st_buf;<br>
&gt;     &gt;     &gt; +                     char *f;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;                       st_buf = vma_area-&gt;st = xmalloc(sizeof(*st_buf));<br>
&gt;     &gt;     &gt;                       if (!st_buf)<br>
&gt;     &gt;     &gt;                               goto err;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; -                     if (fstat(vma_area-&gt;vm_file_fd, st_buf) &lt; 0) {<br>
&gt;     &gt;     &gt; +                     /*<br>
&gt;     &gt;     &gt; +                      * For AUFS support, we cannot fstat() a file descriptor that<br>
&gt;     &gt;     &gt; +                      * is a symbolic link to a branch.  Instead, we obtain the<br>
&gt;     &gt;     &gt; +                      * pathname of the file from the root and use stat().<br>
&gt;     &gt;     &gt; +                      */<br>
&gt;     &gt;     &gt; +                     if (opts.aufs &amp;&amp; (f = fixup_aufs_fd_path(vma_area-&gt;vm_file_fd))) {<br>
&gt;     &gt;     &gt; +                             if (stat(f, st_buf) &lt; 0) {<br>
&gt;     &gt;     &gt; +                                     pr_perror(&quot;Failed stat on %d&#39;s map %lu (%s)&quot;,<br>
&gt;     &gt;     &gt; +                                             pid, start, f);<br>
&gt;     &gt;     &gt; +                                     goto err;<br>
&gt;     &gt;     &gt; +                             }<br>
&gt;     &gt;     &gt; +                     } else if (fstat(vma_area-&gt;vm_file_fd, st_buf) &lt; 0) {<br>
&gt;     &gt;     &gt;                               pr_perror(&quot;Failed fstat on %d&#39;s map %lu&quot;, pid, start);<br>
&gt;     &gt;     &gt;                               goto err;<br>
&gt;     &gt;     &gt;                       }<br>
&gt;     &gt;<br>
&gt;     &gt;     Why do we need the 2nd call to fixup branch name? Can&#39;t we just stat<br>
&gt;     &gt;     the vma-&gt;aufs_rpath here?<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; That&#39;s because vma-&gt;aufs_rpath is relative from the root of the mount namespace (e.g., ./bin/busybox) but we are not in that directory (we&#39;re in /).  To avoid calling fixup we can construct the full path by prepending aufs_root as follows:<br>

&gt;     &gt;<br>
&gt;     &gt;     -                       if (opts.aufs &amp;&amp; (f = fixup_aufs_fd_path(vma_area-&gt;vm_file_fd))) {<br>
&gt;     &gt;     -                               if (stat(f, st_buf) &lt; 0) {<br>
&gt;     &gt;     +                       if (opts.aufs &amp;&amp; vma_area-&gt;aufs_rpath &amp;&amp; opts.aufs_root) {<br>
&gt;     &gt;     +                               char path[PATH_MAX];<br>
&gt;     &gt;     +                               int n;<br>
&gt;     &gt;     +<br>
&gt;     &gt;     +                               n = snprintf(path, PATH_MAX, &quot;%s/%s&quot;, opts.aufs_root, vma_area-&gt;aufs_rpath);<br>
&gt;     &gt;     +                               if (n &gt;= PATH_MAX) {<br>
&gt;     &gt;     +                                       pr_err(&quot;Path %s/%s too long\n&quot;, opts.aufs_root, vma_area-&gt;aufs_rpath);<br>
&gt;     &gt;     +                                       goto err;<br>
&gt;     &gt;     +                               }<br>
&gt;     &gt;     +                               if (stat(path, st_buf) &lt; 0) {<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; If you prefer this approach, I will send you a new patch with this change and removal of fixup_aufs_fd_path().<br>
&gt;<br>
&gt;     Well yes :) I was confused by the 2nd call to fixup_aufs_path from inside<br>
&gt;     fixup_aufs_fd_path. It would call read_fd_link and walk the array of branches<br>
&gt;     again, which is not necessary, since we did it already in parse_smaps(). So<br>
&gt;     it&#39;s better, from my perspective, not to do extra work.<br>
&gt;<br>
&gt;     Just an optimization suggestion -- since we see the full path in parse_smaps(),<br>
&gt;     we can save one on vma-&gt;ppage_bitmap (it&#39;s also restore-only field) and just<br>
&gt;     re-use one here.<br>
&gt;<br>
&gt;     Thanks,<br>
&gt;     Pavel<br>
&gt;<br>
&gt;<br>
<br>
</div></div></blockquote></div><br></div></div>