aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorEspen Fjellvær Olsen <espen@mrfjo.org>2013-01-08 21:30:59 +0100
committerEspen Fjellvær Olsen <espen@mrfjo.org>2013-01-09 18:46:56 +0100
commit49017aa9e80dbdb44cbfe8f4aa3b5edd9466705c (patch)
tree8a22b8d121d4ce41c2f4a590eb9fbf186af5f368 /fs
parent5528b5d5c43f0c38903db0e672581ec4176ae523 (diff)
downloadkernel_samsung_smdk4412-49017aa9e80dbdb44cbfe8f4aa3b5edd9466705c.zip
kernel_samsung_smdk4412-49017aa9e80dbdb44cbfe8f4aa3b5edd9466705c.tar.gz
kernel_samsung_smdk4412-49017aa9e80dbdb44cbfe8f4aa3b5edd9466705c.tar.bz2
Update to the exynos-mem security issue from Samsung I9300 Update7
p2: includes the secmem changes as well as Andreis MFC addition as well Change-Id: I144c2b42586f07b737fba09742315683cbab36ef
Diffstat (limited to 'fs')
-rw-r--r--fs/fuse/file.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 82a6646..5f0d466 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -648,6 +648,42 @@ static int fuse_readpages_fill(void *_data, struct page *page)
return PTR_ERR(req);
}
}
+
+#ifdef CONFIG_DMA_CMA
+ if (is_cma_pageblock(page)) {
+ struct page *oldpage = page, *newpage;
+ int err;
+
+ /* make sure that old page is not free in-between the calls */
+ page_cache_get(oldpage);
+
+ newpage = alloc_page(GFP_HIGHUSER);
+ if (!newpage) {
+ page_cache_release(oldpage);
+ return -ENOMEM;
+ }
+
+ err = replace_page_cache_page(oldpage, newpage, GFP_KERNEL);
+ if (err) {
+ __free_page(newpage);
+ page_cache_release(oldpage);
+ return err;
+ }
+
+ /*
+ * Decrement the count on new page to make page cache the only
+ * owner of it
+ */
+ lock_page(newpage);
+ put_page(newpage);
+
+ /* finally release the old page and swap pointers */
+ unlock_page(oldpage);
+ page_cache_release(oldpage);
+ page = newpage;
+ }
+#endif
+
page_cache_get(page);
req->pages[req->num_pages] = page;
req->num_pages++;