Commit e62e26ac authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Chandan Babu R

xfs: don't allow highmem pages in xfile mappings

XFS is generally used on 64-bit, non-highmem platforms and xfile
mappings are accessed all the time.  Reduce our pain by not allowing
any highmem mappings in the xfile page cache and remove all the kmap
calls for it.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: default avatarChandan Babu R <chandanbabu@kernel.org>
parent 0e2a24af
...@@ -580,7 +580,7 @@ xfarray_sort_get_page( ...@@ -580,7 +580,7 @@ xfarray_sort_get_page(
* xfile pages must never be mapped into userspace, so we skip the * xfile pages must never be mapped into userspace, so we skip the
* dcache flush when mapping the page. * dcache flush when mapping the page.
*/ */
si->page_kaddr = kmap_local_page(si->xfpage.page); si->page_kaddr = page_address(si->xfpage.page);
return 0; return 0;
} }
...@@ -592,7 +592,6 @@ xfarray_sort_put_page( ...@@ -592,7 +592,6 @@ xfarray_sort_put_page(
if (!si->page_kaddr) if (!si->page_kaddr)
return 0; return 0;
kunmap_local(si->page_kaddr);
si->page_kaddr = NULL; si->page_kaddr = NULL;
return xfile_put_page(si->array->xfile, &si->xfpage); return xfile_put_page(si->array->xfile, &si->xfpage);
......
...@@ -77,6 +77,12 @@ xfile_create( ...@@ -77,6 +77,12 @@ xfile_create(
inode = file_inode(xf->file); inode = file_inode(xf->file);
lockdep_set_class(&inode->i_rwsem, &xfile_i_mutex_key); lockdep_set_class(&inode->i_rwsem, &xfile_i_mutex_key);
/*
* We don't want to bother with kmapping data during repair, so don't
* allow highmem pages to back this mapping.
*/
mapping_set_gfp_mask(inode->i_mapping, GFP_KERNEL);
trace_xfile_create(xf); trace_xfile_create(xf);
*xfilep = xf; *xfilep = xf;
...@@ -126,7 +132,6 @@ xfile_load( ...@@ -126,7 +132,6 @@ xfile_load(
pflags = memalloc_nofs_save(); pflags = memalloc_nofs_save();
while (count > 0) { while (count > 0) {
void *p, *kaddr;
unsigned int len; unsigned int len;
len = min_t(ssize_t, count, PAGE_SIZE - offset_in_page(pos)); len = min_t(ssize_t, count, PAGE_SIZE - offset_in_page(pos));
...@@ -153,10 +158,7 @@ xfile_load( ...@@ -153,10 +158,7 @@ xfile_load(
* xfile pages must never be mapped into userspace, so * xfile pages must never be mapped into userspace, so
* we skip the dcache flush. * we skip the dcache flush.
*/ */
kaddr = kmap_local_page(page); memcpy(buf, page_address(page) + offset_in_page(pos), len);
p = kaddr + offset_in_page(pos);
memcpy(buf, p, len);
kunmap_local(kaddr);
put_page(page); put_page(page);
advance: advance:
...@@ -221,14 +223,13 @@ xfile_store( ...@@ -221,14 +223,13 @@ xfile_store(
* the dcache flush. If the page is not uptodate, zero it * the dcache flush. If the page is not uptodate, zero it
* before writing data. * before writing data.
*/ */
kaddr = kmap_local_page(page); kaddr = page_address(page);
if (!PageUptodate(page)) { if (!PageUptodate(page)) {
memset(kaddr, 0, PAGE_SIZE); memset(kaddr, 0, PAGE_SIZE);
SetPageUptodate(page); SetPageUptodate(page);
} }
p = kaddr + offset_in_page(pos); p = kaddr + offset_in_page(pos);
memcpy(p, buf, len); memcpy(p, buf, len);
kunmap_local(kaddr);
ret = aops->write_end(NULL, mapping, pos, len, len, page, ret = aops->write_end(NULL, mapping, pos, len, len, page,
fsdata); fsdata);
...@@ -314,11 +315,7 @@ xfile_get_page( ...@@ -314,11 +315,7 @@ xfile_get_page(
* to the caller and make sure the backing store will hold on to them. * to the caller and make sure the backing store will hold on to them.
*/ */
if (!PageUptodate(page)) { if (!PageUptodate(page)) {
void *kaddr; memset(page_address(page), 0, PAGE_SIZE);
kaddr = kmap_local_page(page);
memset(kaddr, 0, PAGE_SIZE);
kunmap_local(kaddr);
SetPageUptodate(page); SetPageUptodate(page);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment