Bug 1670191

Summary: Invalid cross-device link
Product: [Community] Virtualization Tools Reporter: Sam <shmuel.eiderman>
Component: superminAssignee: Richard W.M. Jones <rjones>
Status: CLOSED UPSTREAM QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: medium Docs Contact:
Priority: unspecified    
Version: unspecifiedCC: ptoscano, rjones
Target Milestone: ---   
Target Release: ---   
Hardware: x86_64   
OS: Mac OS   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of:
: 1670210 1670211 (view as bug list) Environment:
Last Closed: 2019-01-28 22:44:13 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1670210, 1670211    
Attachments:
Description Flags
0001-Use-external-command-mv-to-rename-old-output-directo.patch none

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.