From 97bd679f9de999fbf0e5eb439441f7147cbe5795 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Wed, 7 Apr 2010 00:29:44 +0100 Subject: [PATCH] Linux: kmap() not page_address() Using page_address() will return NULL if the page is in highmem. To avoid this, we must kmap() the page we're getting the address of, and kunmap() when we are done. If the page isn't in high memory, then kmap() is equivalent to page_address(). Change-Id: I42abfadaf3101bf5ad41bd7e5f720ba2583c4ee5 Reviewed-on: http://gerrit.openafs.org/1705 Reviewed-by: Russ Allbery Tested-by: Russ Allbery Reviewed-by: Marc Dionne Reviewed-by: Derrick Brashear (cherry picked from commit fdb9429eafda330bfdf1feefeb1a9ff61c7746b7) --- src/afs/LINUX/osi_fetchstore.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/afs/LINUX/osi_fetchstore.c b/src/afs/LINUX/osi_fetchstore.c index b272c96d2..8fb12f100 100644 --- a/src/afs/LINUX/osi_fetchstore.c +++ b/src/afs/LINUX/osi_fetchstore.c @@ -64,10 +64,12 @@ afs_linux_splice_actor(struct pipe_inode_info *pipe, size = sd->len; /* Eventually, this could be rx_WritePage */ - code = rx_Write(svar->call, page_address(buf->page), size); - if (code != size) { - return -33; /* Can't get a proper rx error out from here */ - } + code = rx_Write(svar->call, kmap(buf->page), size); + + if (code != size) + size = -33; /* Can't get a proper rx error out from here */ + + kunmap(buf->page); return size; } @@ -132,7 +134,8 @@ afs_linux_read_actor(read_descriptor_t *desc, struct page *page, size = count; /* Eventually, this could be rx_WritePage */ - code = rx_Write(svar->call, page_address(page) + offset, size); + code = rx_Write(svar->call, kmap(page) + offset, size); + kunmap(page); if (code != size) { return -33; /* Can't get a proper rx error out from here */ -- 2.39.5