Bug 1670191 - Invalid cross-device link
Summary: Invalid cross-device link
Keywords:
Status: CLOSED UPSTREAM
Alias: None
Product: Virtualization Tools
Classification: Community
Component: supermin
Version: unspecified
Hardware: x86_64
OS: Mac OS
unspecified
medium
Target Milestone: ---
Assignee: Richard W.M. Jones
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks: 1670210 1670211
TreeView+ depends on / blocked
 
Reported: 2019-01-28 21:42 UTC by Sam
Modified: 2019-01-28 22:46 UTC (History)
2 users (show)

Fixed In Version:
Clone Of:
: 1670210 1670211 (view as bug list)
Environment:
Last Closed: 2019-01-28 22:44:13 UTC
Embargoed:


Attachments (Terms of Use)
0001-Use-external-command-mv-to-rename-old-output-directo.patch (1.16 KB, text/plain)
2019-01-28 22:23 UTC, Richard W.M. Jones
no flags Details

Description Sam 2019-01-28 21:42:51 UTC
Description of problem:

Libguestfs "make" fails with when building inside a docker with

"supermin: error: rename: Directory not empty: supermin.d.ibactpan"

Version-Release number of selected component (if applicable):
libguestfs-1.38.6
supermin-5.1.20

How reproducible:

Happens 100% on my MacOS setup
Happens 10% on my Ubuntu setup


Steps to Reproduce:
1. MacOS High Sierra
2. Docker version 18.09.0, build 4d60db4

Actual results:
"supermin: error: rename: Directory not empty: supermin.d.ibactpan"

Expected results:
Build succeeds

Additional info:

After debugging supermin (building it from source and changing some lines) the actual problem is not here:

  if debug >= 1 then
    printf "supermin: renaming %s to %s\n%!" new_outputdir outputdir;
  rename new_outputdir outputdir;

But actually in the previous rename:

  let old_outputdir =
    try
      let old_outputdir = outputdir ^ "." ^ string_random8 () in
      rename outputdir old_outputdir;
      Some old_outputdir
    with
      Unix_error _ -> None in

It fails with Unix_error: supermin: error: rename: Invalid cross-device link: supermin.d

But it is not propagated.

According to docker with OverlayFS: https://docs.docker.com/storage/storagedriver/overlayfs-driver/

Renaming directories: Calling rename(2) for a directory is allowed only when both the source and the destination path are on the top layer. Otherwise, it returns EXDEV error (“cross-device link not permitted”). Your application needs to be designed to handle EXDEV and fall back to a “copy and unlink” strategy.

Should we handle this to support building libguestfs inside a docker?

Comment 1 Richard W.M. Jones 2019-01-28 22:23:10 UTC
Created attachment 1524382 [details]
0001-Use-external-command-mv-to-rename-old-output-directo.patch

Yes we should handle EXDEV as it suggests.  Could you see if
the attached patch fixes it?  I only compile tested it, and
I'm just guessing that 'mv' works on Docker.

Comment 2 Sam 2019-01-28 22:35:38 UTC
That was fast.

Yes, it works perfectly!

Comment 3 Richard W.M. Jones 2019-01-28 22:44:13 UTC
Thanks for testing, it's upstream in git now and will appear in supermin >= 5.1.21.


Note You need to log in before you can comment on or make changes to this bug.