summaryrefslogtreecommitdiffstats
path: root/sys-apps/util-linux/files/util-linux-2.12i-swapon-check-symlinks.patch
blob: b9ed3466e70308f4c574d2cd2e492ee7c50363d1 (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
--- util-linux-2.12b/mount/swapon.c.orig	2004-10-28 10:02:44.320023600 -0400
+++ util-linux-2.12b/mount/swapon.c	2004-10-28 10:02:14.384574000 -0400
@@ -22,2 +22,3 @@
 #include <stdlib.h>
+#include <sys/param.h>
 #include <stdio.h>
@@ -143,10 +144,26 @@
 static int
 is_in_proc_swaps(char *fname) {
 	int i;
+	struct stat fstatbuf;
 
 	for (i = 0; i < numSwaps; i++)
 		if (!strcmp(fname, swapFiles[i]))
 			return 1;
+
+	/* fallback:
+	 * if the device in /etc/fstab is a symlink, the entry
+	 * in /proc/swaps won't match because the kernel stores
+	 * absolute pathnames.  Here we compare dev_t's.
+	 */
+	if (!lstat(fname, &fstatbuf))
+		if (S_ISLNK(fstatbuf.st_mode)) {
+			struct stat swapstatbuf;
+			for (i = 0; i < numSwaps; i++)
+				if (!stat(swapFiles[i], &swapstatbuf) && \
+				    swapstatbuf.st_dev == fstatbuf.st_dev)
+					return 1;
+		}
+
 	return 0;
 }