Author: Raphaƫl Hertzog Description: Fallback on /bin/mv when rename syscall fails with EXDEV (Closes: #836211). Work-around EXDEV error returned by overlayfs when trying to move away a directory by calling "mv" which will do a full copy of the tree followed by a removal of the source tree. diff -Naurp dpkg.orig/src/main/archives.c dpkg/src/main/archives.c --- dpkg.orig/src/main/archives.c +++ dpkg/src/main/archives.c @@ -1034,6 +1034,25 @@ tarobject(struct tar_archive *tar, struc if (rename(fnamevb.buf,fnametmpvb.buf)) ohshite(_("unable to move aside '%.255s' to install new version"), ti->name); + if (rename(fnamevb.buf,fnametmpvb.buf)) { + if (errno == EXDEV) { + struct command cmd; + pid_t pid; + + command_init(&cmd, "mv", "move directory aside"); + command_add_args(&cmd, "mv", fnamevb.buf, fnametmpvb.buf, NULL); + pid = subproc_fork(); + + if (pid == 0) + command_exec(&cmd); + + subproc_reap(pid, "mv", 0); + command_destroy(&cmd); + } else { + ohshite(_("unable to move aside '%.255s' to install new version"), + ti->name); + } + } } else if (S_ISLNK(stab.st_mode)) { int rc;