1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
Author: Raphaël Hertzog <hertzog@debian.org>
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/archives.c dpkg/src/archives.c
--- dpkg.orig/src/archives.c
+++ dpkg/src/archives.c
@@ -1029,6 +1029,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;
|