teach shmem_get_link() to work in RCU mode
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 17 Nov 2015 15:54:32 +0000 (10:54 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 9 Dec 2015 03:41:55 +0000 (22:41 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
mm/shmem.c

index 684dbc3..0605716 100644 (file)
@@ -2501,12 +2501,20 @@ static const char *shmem_get_link(struct dentry *dentry,
 {
        struct page *page = NULL;
        int error;
-       if (!dentry)
-               return ERR_PTR(-ECHILD);
-       error = shmem_getpage(inode, 0, &page, SGP_READ, NULL);
-       if (error)
-               return ERR_PTR(error);
-       unlock_page(page);
+       if (!dentry) {
+               page = find_get_page(inode->i_mapping, 0);
+               if (!page)
+                       return ERR_PTR(-ECHILD);
+               if (!PageUptodate(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;
        return page_address(page);
 }