summaryrefslogtreecommitdiffstats
path: root/debian/patches/progress-linux/0001-overlayfs.patch
blob: 13d5ffbd7feac27dd3b132a84fb09a28ec347ca5 (plain)
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;