On Fri, Mar 14, 2014 at 05:03:19PM -0600, Toshi Kani wrote: > +void dax_map_pages(struct vm_area_struct *vma, struct vm_fault *vmf, > + get_block_t get_block) > +{ > + struct file *file = vma->vm_file; > + struct inode *inode = file_inode(file); > + struct buffer_head bh; > + struct address_space *mapping = file->f_mapping; > + unsigned long vaddr = (unsigned long)vmf->virtual_address; > + pgoff_t pgoff = vmf->pgoff; > + sector_t block; > + pgoff_t size; > + unsigned long pfn; > + pte_t *pte = vmf->pte; > + int error; > + > + while (pgoff < vmf->max_pgoff) { > + size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; > + if (pgoff >= size) > + return; > + > + memset(&bh, 0, sizeof(bh)); > + block = (sector_t)pgoff << (PAGE_SHIFT - inode->i_blkbits); > + bh.b_size = PAGE_SIZE; > + error = get_block(inode, block, &bh, 0); > + if (error || bh.b_size < PAGE_SIZE) > + goto next; > + > + if (!buffer_mapped(&bh) || buffer_unwritten(&bh) || > + buffer_new(&bh)) > + goto next; > + > + /* Recheck i_size under i_mmap_mutex */ > + mutex_lock(&mapping->i_mmap_mutex); NAK. Have you tested this with lockdep enabled? ->map_pages() called with page table lock taken and ->i_mmap_mutex should be taken before it. It seems we need to take ->i_mmap_mutex in do_read_fault() before calling ->map_pages(). Side note: I'm sceptical about whole idea to use i_mmap_mutux to protect against truncate. It will not scale good enough comparing lock_page() with its granularity. > + size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; > + if (unlikely(pgoff >= size)) { > + mutex_unlock(&mapping->i_mmap_mutex); > + return; > + } > + > + error = dax_get_pfn(inode, &bh, &pfn); > + if (error > 0) > + dax_set_pte(vma, vaddr, pfn, pte); > + > + mutex_unlock(&mapping->i_mmap_mutex); > +next: > + vaddr += PAGE_SIZE; > + pgoff++; > + pte++; > + } > +} > +EXPORT_SYMBOL_GPL(dax_map_pages); -- Kirill A. Shutemov -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html