aboutsummaryrefslogtreecommitdiff
path: root/filesystems/ufs_copy/files/patch-ufs_copy.c
blob: 3c5bfd367a81e01d8eec2eaed64dd86083960e6a (plain) (blame)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--- ufs_copy.c.orig	2006-09-21 06:28:09 UTC
+++ ufs_copy.c
@@ -111,9 +111,11 @@ int
 main(int argc, char *argv[])
 {
 	struct fstab *fs;
-	int ch, eval=0;
+	int ch, eval=0, md;
 	char *snapshot = NULL;
-	char *src, *dst;
+	char *src, *dst, *snap = NULL;
+	char mddev[256];
+	FILE *readp;
 
 #ifdef USEMMAP
 	while ((ch = getopt(argc, argv, "aBb:ceMms:v")) != -1)
@@ -174,6 +176,21 @@ main(int argc, char *argv[])
 		eval = system(buf);
 		if (eval)
 			errx(eval, "mksnap_ffs failed");
+		
+		snprintf(buf, sizeof(buf),
+			 "/sbin/mdconfig -a -n -t vnode -f %s", src);
+		fprintf(stderr, "%s\n", buf);
+		readp = popen(buf, "r");
+		if (readp == NULL)
+			errx(eval, "mdconfig failed");
+		eval = fscanf(readp, "%d", &md);
+		if (eval != 1)
+			errx(eval, "mdconfig failed");
+		pclose(readp);
+		snprintf(mddev, sizeof(mddev), "/dev/md%d", md);
+		snap = src;
+		src = mddev;
+		fprintf(stderr, "attached %s as memory disk %s\n", snap, mddev);
 	}
 
 	if ((fs = getfsfile(src)) == NULL) {
@@ -188,9 +205,19 @@ main(int argc, char *argv[])
 	}
 
 	if (snapshot) {
-		fprintf(stderr, "removing snapshot file %s ... ", src);
+		char buf[1024];
+
+		snprintf(buf, sizeof(buf),
+			 "/sbin/mdconfig -d -u %d", md);
+		fprintf(stderr, "%s\n", buf);
+		eval = system(buf);
+		if (eval)
+			errx(eval, "mdconfig failed");
+		fprintf(stderr, "detached memory disk %s\n", mddev);
+
+		fprintf(stderr, "removing snapshot file %s ... ", snap);
 		fflush(stderr);
-		if (unlink(src) == 0)
+		if (unlink(snap) == 0)
 			fprintf(stderr, "done\n");
 		else
 			fprintf(stderr, "failed\n");
@@ -262,6 +289,11 @@ copy_ufs(const char *src_path, const char *dst_path)
 		}
 	}
 	bcopy(&src, &dst, sizeof(dst));
+#if (defined(__FreeBSD_version) && __FreeBSD_version >= 1300100)
+	dst.d_si = NULL;
+#else
+	dst.d_sbcsum = NULL;
+#endif
 	dst.d_name = dst_path;
 	dst.d_fd = open(dst_path, O_CREAT | O_WRONLY,  S_IRUSR |  S_IWUSR );
 	if (dst.d_fd < 0) {