Re: PAGE_SIZE Availability Inconsistency

From: Anton Blanchard
Date: Thu Mar 08 2007 - 16:47:22 EST



Hi,

> Our current swap layout has issues with variable page size kernels.
> Instead of using the page size at runtime, base it on the minimum page
> size the architecture supports.

A hacked up patch to userspace utilities to test the kernel patch. BTW
It looks like there are some real bugs here:

int pagesize = getpagesize();
int rd;
char buf[32768];

rd = pagesize;
if (rd < 8192)
rd = 8192;
if (rd > sizeof(buf))
rd = sizeof(buf);
if (lseek(fd, 0, SEEK_SET) != 0
|| read(fd, buf, rd) != rd)
goto io_error;
if (may_be_swap(buf+pagesize) ||
may_be_swap(buf+4096) || may_be_swap(buf+8192))
type = "swap";

If page size == 64kB wont we read past the end of buf?

Anton

Index: util-linux-2.12r/disk-utils/mkswap.c
===================================================================
--- util-linux-2.12r.orig/disk-utils/mkswap.c 2007-03-08 14:52:53.000000000 -0600
+++ util-linux-2.12r/disk-utils/mkswap.c 2007-03-08 14:58:09.000000000 -0600
@@ -169,7 +158,11 @@
#ifdef PAGE_SIZE
defined_pagesize = PAGE_SIZE;
#endif
+#ifdef __powerpc__
+ kernel_pagesize = 4096;
+#else
kernel_pagesize = getpagesize();
+#endif
pagesize = kernel_pagesize;

if (user_pagesize) {
Index: util-linux-2.12r/mount/get_label_uuid.c
===================================================================
--- util-linux-2.12r.orig/mount/get_label_uuid.c 2007-03-08 14:52:53.000000000 -0600
+++ util-linux-2.12r/mount/get_label_uuid.c 2007-03-08 14:58:09.000000000 -0600
@@ -79,7 +79,11 @@

static int
is_v1_swap_partition(int fd, char **label, char *uuid) {
+#ifdef __powerpc__
+ int n = 4096;
+#else
int n = getpagesize();
+#endif
char *buf = xmalloc(n);
struct swap_header_v1_2 *p = (struct swap_header_v1_2 *) buf;

Index: util-linux-2.12r/mount/mount_guess_fstype.c
===================================================================
--- util-linux-2.12r.orig/mount/mount_guess_fstype.c 2007-03-08 14:52:53.000000000 -0600
+++ util-linux-2.12r/mount/mount_guess_fstype.c 2007-03-08 14:54:25.000000000 -0600
@@ -462,7 +462,11 @@
if (!type) {
/* perhaps the user tries to mount the swap space
on a new disk; warn her before she does mke2fs on it */
+#ifdef __powerpc__
+ int pagesize = 4096;
+#else
int pagesize = getpagesize();
+#endif
int rd;
char buf[32768];

Index: util-linux-2.12r/rescuept/rescuept.c
===================================================================
--- util-linux-2.12r.orig/rescuept/rescuept.c 2007-03-08 14:52:53.000000000 -0600
+++ util-linux-2.12r/rescuept/rescuept.c 2007-03-08 14:55:49.000000000 -0600
@@ -510,7 +510,11 @@
size = s.st_size / 512;
}

+#ifdef __powerpc__
+ pagesize = 4096;
+#else
pagesize = getpagesize();
+#endif
if (pagesize <= 0)
pagesize = 4096;
else if (pagesize > MAXPAGESZ) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/