diff options
author | Espen Fjellvær Olsen <espen@mrfjo.org> | 2013-01-08 21:30:59 +0100 |
---|---|---|
committer | Espen Fjellvær Olsen <espen@mrfjo.org> | 2013-01-09 18:46:56 +0100 |
commit | 49017aa9e80dbdb44cbfe8f4aa3b5edd9466705c (patch) | |
tree | 8a22b8d121d4ce41c2f4a590eb9fbf186af5f368 /fs | |
parent | 5528b5d5c43f0c38903db0e672581ec4176ae523 (diff) | |
download | kernel_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.c | 36 |
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++; |