--- 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 @@ -7,2 +7,3 @@ #include +#include #include @@ -137,10 +138,26 @@ 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; + for (i = 0; i < numSwaps; i++) + if (swapFiles[i] && !stat(swapFiles[i], &swapstatbuf) && \ + swapstatbuf.st_rdev == fstatbuf.st_rdev) + return 1; + } + return 0; }