aboutsummaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c36
1 files changed, 7 insertions, 29 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 7b9cd49622b1..39b3a174a425 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1730,43 +1730,25 @@ static int blkdev_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1730 return __dax_fault(vma, vmf, blkdev_get_block, NULL); 1730 return __dax_fault(vma, vmf, blkdev_get_block, NULL);
1731} 1731}
1732 1732
1733static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, 1733static int blkdev_dax_pfn_mkwrite(struct vm_area_struct *vma,
1734 pmd_t *pmd, unsigned int flags) 1734 struct vm_fault *vmf)
1735{
1736 return __dax_pmd_fault(vma, addr, pmd, flags, blkdev_get_block, NULL);
1737}
1738
1739static void blkdev_vm_open(struct vm_area_struct *vma)
1740{ 1735{
1741 struct inode *bd_inode = bdev_file_inode(vma->vm_file); 1736 return dax_pfn_mkwrite(vma, vmf);
1742 struct block_device *bdev = I_BDEV(bd_inode);
1743
1744 inode_lock(bd_inode);
1745 bdev->bd_map_count++;
1746 inode_unlock(bd_inode);
1747} 1737}
1748 1738
1749static void blkdev_vm_close(struct vm_area_struct *vma) 1739static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
1740 pmd_t *pmd, unsigned int flags)
1750{ 1741{
1751 struct inode *bd_inode = bdev_file_inode(vma->vm_file); 1742 return __dax_pmd_fault(vma, addr, pmd, flags, blkdev_get_block, NULL);
1752 struct block_device *bdev = I_BDEV(bd_inode);
1753
1754 inode_lock(bd_inode);
1755 bdev->bd_map_count--;
1756 inode_unlock(bd_inode);
1757} 1743}
1758 1744
1759static const struct vm_operations_struct blkdev_dax_vm_ops = { 1745static const struct vm_operations_struct blkdev_dax_vm_ops = {
1760 .open = blkdev_vm_open,
1761 .close = blkdev_vm_close,
1762 .fault = blkdev_dax_fault, 1746 .fault = blkdev_dax_fault,
1763 .pmd_fault = blkdev_dax_pmd_fault, 1747 .pmd_fault = blkdev_dax_pmd_fault,
1764 .pfn_mkwrite = blkdev_dax_fault, 1748 .pfn_mkwrite = blkdev_dax_pfn_mkwrite,
1765}; 1749};
1766 1750
1767static const struct vm_operations_struct blkdev_default_vm_ops = { 1751static const struct vm_operations_struct blkdev_default_vm_ops = {
1768 .open = blkdev_vm_open,
1769 .close = blkdev_vm_close,
1770 .fault = filemap_fault, 1752 .fault = filemap_fault,
1771 .map_pages = filemap_map_pages, 1753 .map_pages = filemap_map_pages,
1772}; 1754};
@@ -1774,18 +1756,14 @@ static const struct vm_operations_struct blkdev_default_vm_ops = {
1774static int blkdev_mmap(struct file *file, struct vm_area_struct *vma) 1756static int blkdev_mmap(struct file *file, struct vm_area_struct *vma)
1775{ 1757{
1776 struct inode *bd_inode = bdev_file_inode(file); 1758 struct inode *bd_inode = bdev_file_inode(file);
1777 struct block_device *bdev = I_BDEV(bd_inode);
1778 1759
1779 file_accessed(file); 1760 file_accessed(file);
1780 inode_lock(bd_inode);
1781 bdev->bd_map_count++;
1782 if (IS_DAX(bd_inode)) { 1761 if (IS_DAX(bd_inode)) {
1783 vma->vm_ops = &blkdev_dax_vm_ops; 1762 vma->vm_ops = &blkdev_dax_vm_ops;
1784 vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE; 1763 vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE;
1785 } else { 1764 } else {
1786 vma->vm_ops = &blkdev_default_vm_ops; 1765 vma->vm_ops = &blkdev_default_vm_ops;
1787 } 1766 }
1788 inode_unlock(bd_inode);
1789 1767
1790 return 0; 1768 return 0;
1791} 1769}