diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 36 |
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 | ||
1733 | static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | 1733 | static 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 | |||
1739 | static 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 | ||
1749 | static void blkdev_vm_close(struct vm_area_struct *vma) | 1739 | static 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 | ||
1759 | static const struct vm_operations_struct blkdev_dax_vm_ops = { | 1745 | static 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 | ||
1767 | static const struct vm_operations_struct blkdev_default_vm_ops = { | 1751 | static 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 = { | |||
1774 | static int blkdev_mmap(struct file *file, struct vm_area_struct *vma) | 1756 | static 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 | } |