On Sat, 2014-03-15 at 01:32 +0200, Kirill A. Shutemov wrote: > 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(). Thanks for pointing this out! I will make sure to test with lockdep next time. > 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. I see. I will think about it as well. Thanks, -Toshi -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>