aboutsummaryrefslogtreecommitdiffstats
path: root/mm/shmem.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-11-17 10:54:32 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2015-12-08 22:41:55 -0500
commit6a6c99049635473b64c384135a6906a10df2c916 (patch)
tree6ecb841fe51e0643f37db146f14f374a9470a21e /mm/shmem.c
parentd3883d4f93449343be6296e2274360db39b6842a (diff)
teach shmem_get_link() to work in RCU mode
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'mm/shmem.c')
-rw-r--r--mm/shmem.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/mm/shmem.c b/mm/shmem.c
index 684dbc32e233..0605716aee06 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2501,12 +2501,20 @@ static const char *shmem_get_link(struct dentry *dentry,
2501{ 2501{
2502 struct page *page = NULL; 2502 struct page *page = NULL;
2503 int error; 2503 int error;
2504 if (!dentry) 2504 if (!dentry) {
2505 return ERR_PTR(-ECHILD); 2505 page = find_get_page(inode->i_mapping, 0);
2506 error = shmem_getpage(inode, 0, &page, SGP_READ, NULL); 2506 if (!page)
2507 if (error) 2507 return ERR_PTR(-ECHILD);
2508 return ERR_PTR(error); 2508 if (!PageUptodate(page)) {
2509 unlock_page(page); 2509 put_page(page);
2510 return ERR_PTR(-ECHILD);
2511 }
2512 } else {
2513 error = shmem_getpage(inode, 0, &page, SGP_READ, NULL);
2514 if (error)
2515 return ERR_PTR(error);
2516 unlock_page(page);
2517 }
2510 *cookie = page; 2518 *cookie = page;
2511 return page_address(page); 2519 return page_address(page);
2512} 2520}