diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-11-17 10:54:32 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-12-08 22:41:55 -0500 |
commit | 6a6c99049635473b64c384135a6906a10df2c916 (patch) | |
tree | 6ecb841fe51e0643f37db146f14f374a9470a21e /mm/shmem.c | |
parent | d3883d4f93449343be6296e2274360db39b6842a (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.c | 20 |
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 | } |