mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
This commit is contained in:
parent
0e2a24afb9
commit
e62e26acc9
2 changed files with 10 additions and 14 deletions
|
@ -580,7 +580,7 @@ xfarray_sort_get_page(
|
|||
* xfile pages must never be mapped into userspace, so we skip the
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
@ -592,7 +592,6 @@ xfarray_sort_put_page(
|
|||
if (!si->page_kaddr)
|
||||
return 0;
|
||||
|
||||
kunmap_local(si->page_kaddr);
|
||||
si->page_kaddr = NULL;
|
||||
|
||||
return xfile_put_page(si->array->xfile, &si->xfpage);
|
||||
|
|
|
@ -77,6 +77,12 @@ xfile_create(
|
|||
inode = file_inode(xf->file);
|
||||
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);
|
||||
|
||||
*xfilep = xf;
|
||||
|
@ -126,7 +132,6 @@ xfile_load(
|
|||
|
||||
pflags = memalloc_nofs_save();
|
||||
while (count > 0) {
|
||||
void *p, *kaddr;
|
||||
unsigned int len;
|
||||
|
||||
len = min_t(ssize_t, count, PAGE_SIZE - offset_in_page(pos));
|
||||
|
@ -153,10 +158,7 @@ xfile_load(
|
|||
* xfile pages must never be mapped into userspace, so
|
||||
* we skip the dcache flush.
|
||||
*/
|
||||
kaddr = kmap_local_page(page);
|
||||
p = kaddr + offset_in_page(pos);
|
||||
memcpy(buf, p, len);
|
||||
kunmap_local(kaddr);
|
||||
memcpy(buf, page_address(page) + offset_in_page(pos), len);
|
||||
put_page(page);
|
||||
|
||||
advance:
|
||||
|
@ -221,14 +223,13 @@ xfile_store(
|
|||
* the dcache flush. If the page is not uptodate, zero it
|
||||
* before writing data.
|
||||
*/
|
||||
kaddr = kmap_local_page(page);
|
||||
kaddr = page_address(page);
|
||||
if (!PageUptodate(page)) {
|
||||
memset(kaddr, 0, PAGE_SIZE);
|
||||
SetPageUptodate(page);
|
||||
}
|
||||
p = kaddr + offset_in_page(pos);
|
||||
memcpy(p, buf, len);
|
||||
kunmap_local(kaddr);
|
||||
|
||||
ret = aops->write_end(NULL, mapping, pos, len, len, page,
|
||||
fsdata);
|
||||
|
@ -314,11 +315,7 @@ xfile_get_page(
|
|||
* to the caller and make sure the backing store will hold on to them.
|
||||
*/
|
||||
if (!PageUptodate(page)) {
|
||||
void *kaddr;
|
||||
|
||||
kaddr = kmap_local_page(page);
|
||||
memset(kaddr, 0, PAGE_SIZE);
|
||||
kunmap_local(kaddr);
|
||||
memset(page_address(page), 0, PAGE_SIZE);
|
||||
SetPageUptodate(page);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue