--- 2.6/drivers/char/mem.c 2004-02-08 13:08:30.000000000 +0100 +++ build-2.6/drivers/char/mem.c 2004-02-12 20:10:56.000000000 +0100 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -151,10 +152,41 @@ } } #endif +#if CONFIG_DEBUG_PAGEALLOC + while (count) { + size_t i; + struct page *page; + + i = PAGE_SIZE - (p%PAGE_SIZE); + if (i > count) + i = count; + if (virt_addr_valid(__va(p))) { + page = virt_to_page(__va(p)); + get_page(page); + kernel_map_pages(page, 1, 1); + } else { + page = NULL; + } + if (copy_to_user(buf, __va(p), i)) { + if (page) + put_page(page); + return -EFAULT; + } + if (page) + put_page(page); + buf += i; + p += i; + count -= i; + read += i; + } +#else if (copy_to_user(buf, __va(p), count)) return -EFAULT; + + p += count; read += count; - *ppos += read; +#endif + *ppos = p; return read; }