summaryrefslogtreecommitdiffstats
path: root/main/xfsprogs/musl-fixes.patch
blob: a6283f849ae19ce60366ae6c3e044345b77a9156 (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
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
index 6f00b41..5b4af53 100644
--- a/fsr/xfs_fsr.c
+++ b/fsr/xfs_fsr.c
@@ -44,6 +44,10 @@
 #define _PATH_FSRLAST		"/var/tmp/.fsrlast_xfs"
 #define _PATH_PROC_MOUNTS	"/proc/mounts"
 
+#ifndef _PATH_MOUNTED
+#define _PATH_MOUNTED MOUNTED
+#endif
+
 
 char *progname;
 
diff --git a/include/platform_defs.h.in b/include/platform_defs.h.in
index ac260bc..0e7fccf 100644
--- a/include/platform_defs.h.in
+++ b/include/platform_defs.h.in
@@ -68,6 +68,32 @@ typedef __u64	__bitwise	__be64;
 
 typedef struct filldir		filldir_t;
 
+#ifndef __uint8_t
+#define __uint8_t uint8_t
+#endif
+#ifndef __uint16_t
+#define __uint16_t uint16_t
+#endif
+#ifndef __uint32_t
+#define __uint32_t uint32_t
+#endif
+#ifndef __uint64_t
+#define __uint64_t uint64_t
+#endif
+
+#ifndef __int8_t
+#define __int8_t int8_t
+#endif
+#ifndef __int16_t
+#define __int16_t int16_t
+#endif
+#ifndef __int32_t
+#define __int32_t int32_t
+#endif
+#ifndef __int64_t
+#define __int64_t int64_t
+#endif
+
 #if defined(__linux__)
 #include <xfs/linux.h>
 #elif defined(__FreeBSD__)
diff --git a/libhandle/handle.c b/libhandle/handle.c
index 9a232fa..1db7772 100644
--- a/libhandle/handle.c
+++ b/libhandle/handle.c
@@ -20,6 +20,9 @@
 #include <xfs/xfs.h>
 #include <xfs/handle.h>
 #include <xfs/parent.h>
+#if defined(__linux__)
+#include <linux/limits.h>
+#endif
 
 /* just pick a value we know is more than big enough */
 #define	MAXHANSIZ	64
diff --git a/libhandle/jdm.c b/libhandle/jdm.c
index 070407b..8dd6322 100644
--- a/libhandle/jdm.c
+++ b/libhandle/jdm.c
@@ -20,6 +20,9 @@
 #include <xfs/handle.h>
 #include <xfs/jdm.h>
 #include <xfs/parent.h>
+#if defined(__linux__)
+#include <linux/limits.h>
+#endif
 
 /* internal fshandle - typecast to a void for external use */
 #define FSHANDLE_SZ		8
diff --git a/libxfs/linux.c b/libxfs/linux.c
index 2e07d54..4075786 100644
--- a/libxfs/linux.c
+++ b/libxfs/linux.c
@@ -16,12 +16,9 @@
  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#define ustat __kernel_ustat
 #include <xfs/libxfs.h>
 #include <mntent.h>
 #include <sys/stat.h>
-#undef ustat
-#include <sys/ustat.h>
 #include <sys/mount.h>
 #include <sys/ioctl.h>
 #include <sys/sysinfo.h>
@@ -49,9 +46,12 @@ static int max_block_alignment;
 int
 platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose)
 {
-	/* Pad ust; pre-2.6.28 linux copies out too much in 32bit compat mode */
-	struct ustat	ust[2];
 	struct stat64	st;
+	FILE		*f;
+	struct stat64	mst;
+	struct mntent	*mnt;
+	char		mounts[MAXPATHLEN];
+	int		ismounted = 0;
 
 	if (!s) {
 		if (stat64(block, &st) < 0)
@@ -61,14 +61,25 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose)
 		s = &st;
 	}
 
-	if (ustat(s->st_rdev, ust) >= 0) {
+	strcpy(mounts, (!access(PROC_MOUNTED, R_OK)) ? PROC_MOUNTED : MOUNTED);
+	if ((f = setmntent(mounts, "r")) == NULL)
+		return 0;
+
+	while ((mnt = getmntent(f)) != NULL) {
+		if (stat64(mnt->mnt_dir, &mst) < 0)
+			continue;
+		if (mst.st_dev != s->st_rdev)
+			continue;
+
 		if (verbose)
 			fprintf(stderr,
 				_("%s: %s contains a mounted filesystem\n"),
 				progname, name);
-		return 1;
+		ismounted = 1;
+		break;
 	}
-	return 0;
+	endmntent(f);
+	return ismounted;
 }
 
 int