teach shmem_get_link() to work in RCU mode
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
+14
-6
@@ -2501,12 +2501,20 @@ static const char *shmem_get_link(struct dentry *dentry,
|
|||||||
{
|
{
|
||||||
struct page *page = NULL;
|
struct page *page = NULL;
|
||||||
int error;
|
int error;
|
||||||
if (!dentry)
|
if (!dentry) {
|
||||||
return ERR_PTR(-ECHILD);
|
page = find_get_page(inode->i_mapping, 0);
|
||||||
error = shmem_getpage(inode, 0, &page, SGP_READ, NULL);
|
if (!page)
|
||||||
if (error)
|
return ERR_PTR(-ECHILD);
|
||||||
return ERR_PTR(error);
|
if (!PageUptodate(page)) {
|
||||||
unlock_page(page);
|
put_page(page);
|
||||||
|
return ERR_PTR(-ECHILD);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error = shmem_getpage(inode, 0, &page, SGP_READ, NULL);
|
||||||
|
if (error)
|
||||||
|
return ERR_PTR(error);
|
||||||
|
unlock_page(page);
|
||||||
|
}
|
||||||
*cookie = page;
|
*cookie = page;
|
||||||
return page_address(page);
|
return page_address(page);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user