summaryrefslogtreecommitdiff
path: root/net/rds/page.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-10-18 13:04:33 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-18 13:04:33 -0700
commit822a2e452423e71fd9743cedf0b0fa8ac1ee6d12 (patch)
tree560086641836bafb7b528115f2a00415c68d5965 /net/rds/page.c
parent2b666ca4a68cbc22483b0f2e1ba3c0e59b01ae9e (diff)
parent3e645d6b485446c54c6745c5e2cf5c528fe4deec (diff)
Merge branch 'fixes'
* fixes: v4l1: fix 32-bit compat microcode loading translation De-pessimize rds_page_copy_user
Diffstat (limited to 'net/rds/page.c')
-rw-r--r--net/rds/page.c27
1 files changed, 7 insertions, 20 deletions
diff --git a/net/rds/page.c b/net/rds/page.c
index 595a952d4b17..1dfbfea12e9b 100644
--- a/net/rds/page.c
+++ b/net/rds/page.c
@@ -57,30 +57,17 @@ int rds_page_copy_user(struct page *page, unsigned long offset,
unsigned long ret;
void *addr;
- if (to_user)
+ addr = kmap(page);
+ if (to_user) {
rds_stats_add(s_copy_to_user, bytes);
- else
+ ret = copy_to_user(ptr, addr + offset, bytes);
+ } else {
rds_stats_add(s_copy_from_user, bytes);
-
- addr = kmap_atomic(page, KM_USER0);
- if (to_user)
- ret = __copy_to_user_inatomic(ptr, addr + offset, bytes);
- else
- ret = __copy_from_user_inatomic(addr + offset, ptr, bytes);
- kunmap_atomic(addr, KM_USER0);
-
- if (ret) {
- addr = kmap(page);
- if (to_user)
- ret = copy_to_user(ptr, addr + offset, bytes);
- else
- ret = copy_from_user(addr + offset, ptr, bytes);
- kunmap(page);
- if (ret)
- return -EFAULT;
+ ret = copy_from_user(addr + offset, ptr, bytes);
}
+ kunmap(page);
- return 0;
+ return ret ? -EFAULT : 0;
}
EXPORT_SYMBOL_GPL(rds_page_copy_user);