On Tue, Nov 10, 2020 at 05:14:39PM +0200, Mike Rapoport wrote:
> +static vm_fault_t secretmem_fault(struct vm_fault *vmf)
> +{
> +     struct address_space *mapping = vmf->vma->vm_file->f_mapping;
> +     struct inode *inode = file_inode(vmf->vma->vm_file);
> +     pgoff_t offset = vmf->pgoff;
> +     unsigned long addr;
> +     struct page *page;
> +     int ret = 0;
> +
> +     if (((loff_t)vmf->pgoff << PAGE_SHIFT) >= i_size_read(inode))
> +             return vmf_error(-EINVAL);
> +
> +     page = find_get_entry(mapping, offset);

Why did you decide to use find_get_entry() here?  You don't handle
swap or shadow entries.

> +     if (!page) {
> +             page = secretmem_alloc_page(vmf->gfp_mask);
> +             if (!page)
> +                     return vmf_error(-EINVAL);

Why is this EINVAL and not ENOMEM?

> +             ret = add_to_page_cache(page, mapping, offset, vmf->gfp_mask);
> +             if (unlikely(ret))
> +                     goto err_put_page;
> +
> +             ret = set_direct_map_invalid_noflush(page, 1);
> +             if (ret)
> +                     goto err_del_page_cache;
> +
> +             addr = (unsigned long)page_address(page);
> +             flush_tlb_kernel_range(addr, addr + PAGE_SIZE);
> +
> +             __SetPageUptodate(page);
> +
> +             ret = VM_FAULT_LOCKED;
> +     }
> +
> +     vmf->page = page;
> +     return ret;

Does sparse not warn you about this abuse of vm_fault_t?  Separate out
'ret' and 'err'.


Andrew, please fold in this fix.  I suspect Mike will want to fix
the other things I mention above.

diff --git a/mm/secretmem.c b/mm/secretmem.c
index 3dfdbd85ba00..09ca27f21661 100644
--- a/mm/secretmem.c
+++ b/mm/secretmem.c
@@ -172,7 +172,7 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)
        if (((loff_t)vmf->pgoff << PAGE_SHIFT) >= i_size_read(inode))
                return vmf_error(-EINVAL);
 
-       page = find_get_entry(mapping, offset);
+       page = find_get_page(mapping, offset);
        if (!page) {
                page = secretmem_alloc_page(ctx, vmf->gfp_mask);
                if (!page)
_______________________________________________
Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org
To unsubscribe send an email to linux-nvdimm-le...@lists.01.org

Reply via email to