From 7fabaddd09ab32a7c0c08da80315758a2245189d Mon Sep 17 00:00:00 2001 From: Wu Fengguang Date: Mon, 14 Dec 2009 17:58:09 -0800 Subject: [PATCH] /dev/mem: make size_inside_page() logic straight Also convert more size_inside_page() users. Signed-off-by: Wu Fengguang Cc: Andi Kleen Cc: Avi Kivity Cc: Greg Kroah-Hartman Cc: Johannes Berg Cc: Marcelo Tosatti Cc: Mark Brown Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/char/mem.c | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/drivers/char/mem.c b/drivers/char/mem.c index c6b2fbc5ed470..192af59afc139 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -39,12 +39,9 @@ static inline unsigned long size_inside_page(unsigned long start, { unsigned long sz; - if (-start & (PAGE_SIZE - 1)) - sz = -start & (PAGE_SIZE - 1); - else - sz = PAGE_SIZE; + sz = PAGE_SIZE - (start & (PAGE_SIZE - 1)); - return min_t(unsigned long, sz, size); + return min(sz, size); } /* @@ -139,9 +136,7 @@ static ssize_t read_mem(struct file * file, char __user * buf, #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED /* we don't have page 0 mapped on sparc and m68k.. */ if (p < PAGE_SIZE) { - sz = PAGE_SIZE - p; - if (sz > count) - sz = count; + sz = size_inside_page(p, count); if (sz > 0) { if (clear_user(buf, sz)) return -EFAULT; @@ -201,9 +196,7 @@ static ssize_t write_mem(struct file * file, const char __user * buf, #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED /* we don't have page 0 mapped on sparc and m68k.. */ if (p < PAGE_SIZE) { - unsigned long sz = PAGE_SIZE - p; - if (sz > count) - sz = count; + sz = size_inside_page(p, count); /* Hmm. Do something? */ buf += sz; p += sz; @@ -412,15 +405,14 @@ static ssize_t read_kmem(struct file *file, char __user *buf, #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED /* we don't have page 0 mapped on sparc and m68k.. */ if (p < PAGE_SIZE && low_count > 0) { - size_t tmp = PAGE_SIZE - p; - if (tmp > low_count) tmp = low_count; - if (clear_user(buf, tmp)) + sz = size_inside_page(p, low_count); + if (clear_user(buf, sz)) return -EFAULT; - buf += tmp; - p += tmp; - read += tmp; - low_count -= tmp; - count -= tmp; + buf += sz; + p += sz; + read += sz; + low_count -= sz; + count -= sz; } #endif while (low_count > 0) { @@ -480,9 +472,7 @@ do_write_kmem(void *p, unsigned long realp, const char __user * buf, #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED /* we don't have page 0 mapped on sparc and m68k.. */ if (realp < PAGE_SIZE) { - unsigned long sz = PAGE_SIZE - realp; - if (sz > count) - sz = count; + sz = size_inside_page(realp, count); /* Hmm. Do something? */ buf += sz; p += sz; -- 2.39.5