diff --git a/[refs] b/[refs] index b94a4207df59..91432e5f373c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0abf40c1ac3f25d264c019e1cfe155d590defb87 +refs/heads/master: d44ed4f86892e350f4b16a3489b7e7c1a9bb7ead diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c index edc54436fa94..88611928e71f 100644 --- a/trunk/mm/filemap.c +++ b/trunk/mm/filemap.c @@ -1504,8 +1504,12 @@ int filemap_populate(struct vm_area_struct *vma, unsigned long addr, return -EINVAL; page = filemap_getpage(file, pgoff, nonblock); + + /* XXX: This is wrong, a filesystem I/O error may have happened. Fix that as + * done in shmem_populate calling shmem_getpage */ if (!page && !nonblock) return -ENOMEM; + if (page) { err = install_page(mm, vma, addr, page, prot); if (err) { @@ -1513,6 +1517,9 @@ int filemap_populate(struct vm_area_struct *vma, unsigned long addr, return err; } } else { + /* No page was found just because we can't read it in now (being + * here implies nonblock != 0), but the page may exist, so set + * the PTE to fault it in later. */ err = install_file_pte(mm, vma, addr, pgoff, prot); if (err) return err; diff --git a/trunk/mm/shmem.c b/trunk/mm/shmem.c index 5a81b1ee4f7a..08a3bc2fba61 100644 --- a/trunk/mm/shmem.c +++ b/trunk/mm/shmem.c @@ -1195,6 +1195,7 @@ static int shmem_populate(struct vm_area_struct *vma, err = shmem_getpage(inode, pgoff, &page, sgp, NULL); if (err) return err; + /* Page may still be null, but only if nonblock was set. */ if (page) { mark_page_accessed(page); err = install_page(mm, vma, addr, page, prot); @@ -1202,7 +1203,10 @@ static int shmem_populate(struct vm_area_struct *vma, page_cache_release(page); return err; } - } else if (nonblock) { + } else { + /* No page was found just because we can't read it in + * now (being here implies nonblock != 0), but the page + * may exist, so set the PTE to fault it in later. */ err = install_file_pte(mm, vma, addr, pgoff, prot); if (err) return err;