summaryrefslogtreecommitdiffstats
path: root/sys-apps/util-linux/files/util-linux-2.12p-swapon-check-symlinks.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/util-linux/files/util-linux-2.12p-swapon-check-symlinks.patch')
-rw-r--r--sys-apps/util-linux/files/util-linux-2.12p-swapon-check-symlinks.patch34
1 files changed, 34 insertions, 0 deletions
diff --git a/sys-apps/util-linux/files/util-linux-2.12p-swapon-check-symlinks.patch b/sys-apps/util-linux/files/util-linux-2.12p-swapon-check-symlinks.patch
new file mode 100644
index 0000000..f421458
--- /dev/null
+++ b/sys-apps/util-linux/files/util-linux-2.12p-swapon-check-symlinks.patch
@@ -0,0 +1,34 @@
+--- util-linux-2.12b/mount/swapon.c
++++ util-linux-2.12b/mount/swapon.c
+@@ -7,2 +7,3 @@
+ #include <stdlib.h>
++#include <sys/param.h>
+ #include <stdio.h>
+@@ -137,10 +138,27 @@
+ static int
+ is_in_proc_swaps(const char *fname) {
+ int i;
++ struct stat fstatbuf;
+
+ for (i = 0; i < numSwaps; i++)
+ if (swapFiles[i] && !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;
++ stat(fname, &fstatbuf);
++ for (i = 0; i < numSwaps; i++)
++ if (swapFiles[i] && !stat(swapFiles[i], &swapstatbuf) && \
++ swapstatbuf.st_rdev == fstatbuf.st_rdev)
++ return 1;
++ }
++
+ return 0;
+ }
+