diff options
author | Jan Kara <jack@suse.cz> | 2016-05-11 05:58:48 -0400 |
---|---|---|
committer | Vishal Verma <vishal.l.verma@intel.com> | 2016-05-16 20:11:51 -0400 |
commit | 02fbd139759feb1f331cebd858523b5d774082e6 (patch) | |
tree | 841ff90012518ce3c37ecb1cca0367db7568d18a | |
parent | e4b2749158631e6d74bf14d2ef3804d780e2f770 (diff) |
dax: Remove complete_unwritten argument
Fault handlers currently take complete_unwritten argument to convert
unwritten extents after PTEs are updated. However no filesystem uses
this anymore as the code is racy. Remove the unused argument.
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
-rw-r--r-- | fs/block_dev.c | 4 | ||||
-rw-r--r-- | fs/dax.c | 43 | ||||
-rw-r--r-- | fs/ext2/file.c | 4 | ||||
-rw-r--r-- | fs/ext4/file.c | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_file.c | 7 | ||||
-rw-r--r-- | include/linux/dax.h | 17 | ||||
-rw-r--r-- | include/linux/fs.h | 1 |
7 files changed, 25 insertions, 55 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 20a2c02b77c4..b25bb230b28a 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -1746,7 +1746,7 @@ static const struct address_space_operations def_blk_aops = { | |||
1746 | */ | 1746 | */ |
1747 | static int blkdev_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 1747 | static int blkdev_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
1748 | { | 1748 | { |
1749 | return __dax_fault(vma, vmf, blkdev_get_block, NULL); | 1749 | return __dax_fault(vma, vmf, blkdev_get_block); |
1750 | } | 1750 | } |
1751 | 1751 | ||
1752 | static int blkdev_dax_pfn_mkwrite(struct vm_area_struct *vma, | 1752 | static int blkdev_dax_pfn_mkwrite(struct vm_area_struct *vma, |
@@ -1758,7 +1758,7 @@ static int blkdev_dax_pfn_mkwrite(struct vm_area_struct *vma, | |||
1758 | static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | 1758 | static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, |
1759 | pmd_t *pmd, unsigned int flags) | 1759 | pmd_t *pmd, unsigned int flags) |
1760 | { | 1760 | { |
1761 | return __dax_pmd_fault(vma, addr, pmd, flags, blkdev_get_block, NULL); | 1761 | return __dax_pmd_fault(vma, addr, pmd, flags, blkdev_get_block); |
1762 | } | 1762 | } |
1763 | 1763 | ||
1764 | static const struct vm_operations_struct blkdev_dax_vm_ops = { | 1764 | static const struct vm_operations_struct blkdev_dax_vm_ops = { |
@@ -612,19 +612,13 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, | |||
612 | * @vma: The virtual memory area where the fault occurred | 612 | * @vma: The virtual memory area where the fault occurred |
613 | * @vmf: The description of the fault | 613 | * @vmf: The description of the fault |
614 | * @get_block: The filesystem method used to translate file offsets to blocks | 614 | * @get_block: The filesystem method used to translate file offsets to blocks |
615 | * @complete_unwritten: The filesystem method used to convert unwritten blocks | ||
616 | * to written so the data written to them is exposed. This is required for | ||
617 | * required by write faults for filesystems that will return unwritten | ||
618 | * extent mappings from @get_block, but it is optional for reads as | ||
619 | * dax_insert_mapping() will always zero unwritten blocks. If the fs does | ||
620 | * not support unwritten extents, the it should pass NULL. | ||
621 | * | 615 | * |
622 | * When a page fault occurs, filesystems may call this helper in their | 616 | * When a page fault occurs, filesystems may call this helper in their |
623 | * fault handler for DAX files. __dax_fault() assumes the caller has done all | 617 | * fault handler for DAX files. __dax_fault() assumes the caller has done all |
624 | * the necessary locking for the page fault to proceed successfully. | 618 | * the necessary locking for the page fault to proceed successfully. |
625 | */ | 619 | */ |
626 | int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | 620 | int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, |
627 | get_block_t get_block, dax_iodone_t complete_unwritten) | 621 | get_block_t get_block) |
628 | { | 622 | { |
629 | struct file *file = vma->vm_file; | 623 | struct file *file = vma->vm_file; |
630 | struct address_space *mapping = file->f_mapping; | 624 | struct address_space *mapping = file->f_mapping; |
@@ -727,23 +721,9 @@ int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | |||
727 | page = NULL; | 721 | page = NULL; |
728 | } | 722 | } |
729 | 723 | ||
730 | /* | 724 | /* Filesystem should not return unwritten buffers to us! */ |
731 | * If we successfully insert the new mapping over an unwritten extent, | 725 | WARN_ON_ONCE(buffer_unwritten(&bh)); |
732 | * we need to ensure we convert the unwritten extent. If there is an | ||
733 | * error inserting the mapping, the filesystem needs to leave it as | ||
734 | * unwritten to prevent exposure of the stale underlying data to | ||
735 | * userspace, but we still need to call the completion function so | ||
736 | * the private resources on the mapping buffer can be released. We | ||
737 | * indicate what the callback should do via the uptodate variable, same | ||
738 | * as for normal BH based IO completions. | ||
739 | */ | ||
740 | error = dax_insert_mapping(inode, &bh, vma, vmf); | 726 | error = dax_insert_mapping(inode, &bh, vma, vmf); |
741 | if (buffer_unwritten(&bh)) { | ||
742 | if (complete_unwritten) | ||
743 | complete_unwritten(&bh, !error); | ||
744 | else | ||
745 | WARN_ON_ONCE(!(vmf->flags & FAULT_FLAG_WRITE)); | ||
746 | } | ||
747 | 727 | ||
748 | out: | 728 | out: |
749 | if (error == -ENOMEM) | 729 | if (error == -ENOMEM) |
@@ -772,7 +752,7 @@ EXPORT_SYMBOL(__dax_fault); | |||
772 | * fault handler for DAX files. | 752 | * fault handler for DAX files. |
773 | */ | 753 | */ |
774 | int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | 754 | int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, |
775 | get_block_t get_block, dax_iodone_t complete_unwritten) | 755 | get_block_t get_block) |
776 | { | 756 | { |
777 | int result; | 757 | int result; |
778 | struct super_block *sb = file_inode(vma->vm_file)->i_sb; | 758 | struct super_block *sb = file_inode(vma->vm_file)->i_sb; |
@@ -781,7 +761,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | |||
781 | sb_start_pagefault(sb); | 761 | sb_start_pagefault(sb); |
782 | file_update_time(vma->vm_file); | 762 | file_update_time(vma->vm_file); |
783 | } | 763 | } |
784 | result = __dax_fault(vma, vmf, get_block, complete_unwritten); | 764 | result = __dax_fault(vma, vmf, get_block); |
785 | if (vmf->flags & FAULT_FLAG_WRITE) | 765 | if (vmf->flags & FAULT_FLAG_WRITE) |
786 | sb_end_pagefault(sb); | 766 | sb_end_pagefault(sb); |
787 | 767 | ||
@@ -815,8 +795,7 @@ static void __dax_dbg(struct buffer_head *bh, unsigned long address, | |||
815 | #define dax_pmd_dbg(bh, address, reason) __dax_dbg(bh, address, reason, "dax_pmd") | 795 | #define dax_pmd_dbg(bh, address, reason) __dax_dbg(bh, address, reason, "dax_pmd") |
816 | 796 | ||
817 | int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, | 797 | int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, |
818 | pmd_t *pmd, unsigned int flags, get_block_t get_block, | 798 | pmd_t *pmd, unsigned int flags, get_block_t get_block) |
819 | dax_iodone_t complete_unwritten) | ||
820 | { | 799 | { |
821 | struct file *file = vma->vm_file; | 800 | struct file *file = vma->vm_file; |
822 | struct address_space *mapping = file->f_mapping; | 801 | struct address_space *mapping = file->f_mapping; |
@@ -875,6 +854,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, | |||
875 | if (get_block(inode, block, &bh, 1) != 0) | 854 | if (get_block(inode, block, &bh, 1) != 0) |
876 | return VM_FAULT_SIGBUS; | 855 | return VM_FAULT_SIGBUS; |
877 | alloc = true; | 856 | alloc = true; |
857 | WARN_ON_ONCE(buffer_unwritten(&bh)); | ||
878 | } | 858 | } |
879 | 859 | ||
880 | bdev = bh.b_bdev; | 860 | bdev = bh.b_bdev; |
@@ -1020,9 +1000,6 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, | |||
1020 | out: | 1000 | out: |
1021 | i_mmap_unlock_read(mapping); | 1001 | i_mmap_unlock_read(mapping); |
1022 | 1002 | ||
1023 | if (buffer_unwritten(&bh)) | ||
1024 | complete_unwritten(&bh, !(result & VM_FAULT_ERROR)); | ||
1025 | |||
1026 | return result; | 1003 | return result; |
1027 | 1004 | ||
1028 | fallback: | 1005 | fallback: |
@@ -1042,8 +1019,7 @@ EXPORT_SYMBOL_GPL(__dax_pmd_fault); | |||
1042 | * pmd_fault handler for DAX files. | 1019 | * pmd_fault handler for DAX files. |
1043 | */ | 1020 | */ |
1044 | int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, | 1021 | int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, |
1045 | pmd_t *pmd, unsigned int flags, get_block_t get_block, | 1022 | pmd_t *pmd, unsigned int flags, get_block_t get_block) |
1046 | dax_iodone_t complete_unwritten) | ||
1047 | { | 1023 | { |
1048 | int result; | 1024 | int result; |
1049 | struct super_block *sb = file_inode(vma->vm_file)->i_sb; | 1025 | struct super_block *sb = file_inode(vma->vm_file)->i_sb; |
@@ -1052,8 +1028,7 @@ int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, | |||
1052 | sb_start_pagefault(sb); | 1028 | sb_start_pagefault(sb); |
1053 | file_update_time(vma->vm_file); | 1029 | file_update_time(vma->vm_file); |
1054 | } | 1030 | } |
1055 | result = __dax_pmd_fault(vma, address, pmd, flags, get_block, | 1031 | result = __dax_pmd_fault(vma, address, pmd, flags, get_block); |
1056 | complete_unwritten); | ||
1057 | if (flags & FAULT_FLAG_WRITE) | 1032 | if (flags & FAULT_FLAG_WRITE) |
1058 | sb_end_pagefault(sb); | 1033 | sb_end_pagefault(sb); |
1059 | 1034 | ||
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index c1400b109805..868c02317b05 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c | |||
@@ -51,7 +51,7 @@ static int ext2_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
51 | } | 51 | } |
52 | down_read(&ei->dax_sem); | 52 | down_read(&ei->dax_sem); |
53 | 53 | ||
54 | ret = __dax_fault(vma, vmf, ext2_get_block, NULL); | 54 | ret = __dax_fault(vma, vmf, ext2_get_block); |
55 | 55 | ||
56 | up_read(&ei->dax_sem); | 56 | up_read(&ei->dax_sem); |
57 | if (vmf->flags & FAULT_FLAG_WRITE) | 57 | if (vmf->flags & FAULT_FLAG_WRITE) |
@@ -72,7 +72,7 @@ static int ext2_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | |||
72 | } | 72 | } |
73 | down_read(&ei->dax_sem); | 73 | down_read(&ei->dax_sem); |
74 | 74 | ||
75 | ret = __dax_pmd_fault(vma, addr, pmd, flags, ext2_get_block, NULL); | 75 | ret = __dax_pmd_fault(vma, addr, pmd, flags, ext2_get_block); |
76 | 76 | ||
77 | up_read(&ei->dax_sem); | 77 | up_read(&ei->dax_sem); |
78 | if (flags & FAULT_FLAG_WRITE) | 78 | if (flags & FAULT_FLAG_WRITE) |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 37e28082885a..7a6398867ff2 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
@@ -207,7 +207,7 @@ static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
207 | if (IS_ERR(handle)) | 207 | if (IS_ERR(handle)) |
208 | result = VM_FAULT_SIGBUS; | 208 | result = VM_FAULT_SIGBUS; |
209 | else | 209 | else |
210 | result = __dax_fault(vma, vmf, ext4_dax_get_block, NULL); | 210 | result = __dax_fault(vma, vmf, ext4_dax_get_block); |
211 | 211 | ||
212 | if (write) { | 212 | if (write) { |
213 | if (!IS_ERR(handle)) | 213 | if (!IS_ERR(handle)) |
@@ -243,7 +243,7 @@ static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | |||
243 | result = VM_FAULT_SIGBUS; | 243 | result = VM_FAULT_SIGBUS; |
244 | else | 244 | else |
245 | result = __dax_pmd_fault(vma, addr, pmd, flags, | 245 | result = __dax_pmd_fault(vma, addr, pmd, flags, |
246 | ext4_dax_get_block, NULL); | 246 | ext4_dax_get_block); |
247 | 247 | ||
248 | if (write) { | 248 | if (write) { |
249 | if (!IS_ERR(handle)) | 249 | if (!IS_ERR(handle)) |
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 569938a4a357..c2946f436a3a 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
@@ -1558,7 +1558,7 @@ xfs_filemap_page_mkwrite( | |||
1558 | xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); | 1558 | xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); |
1559 | 1559 | ||
1560 | if (IS_DAX(inode)) { | 1560 | if (IS_DAX(inode)) { |
1561 | ret = __dax_mkwrite(vma, vmf, xfs_get_blocks_dax_fault, NULL); | 1561 | ret = __dax_mkwrite(vma, vmf, xfs_get_blocks_dax_fault); |
1562 | } else { | 1562 | } else { |
1563 | ret = block_page_mkwrite(vma, vmf, xfs_get_blocks); | 1563 | ret = block_page_mkwrite(vma, vmf, xfs_get_blocks); |
1564 | ret = block_page_mkwrite_return(ret); | 1564 | ret = block_page_mkwrite_return(ret); |
@@ -1592,7 +1592,7 @@ xfs_filemap_fault( | |||
1592 | * changes to xfs_get_blocks_direct() to map unwritten extent | 1592 | * changes to xfs_get_blocks_direct() to map unwritten extent |
1593 | * ioend for conversion on read-only mappings. | 1593 | * ioend for conversion on read-only mappings. |
1594 | */ | 1594 | */ |
1595 | ret = __dax_fault(vma, vmf, xfs_get_blocks_dax_fault, NULL); | 1595 | ret = __dax_fault(vma, vmf, xfs_get_blocks_dax_fault); |
1596 | } else | 1596 | } else |
1597 | ret = filemap_fault(vma, vmf); | 1597 | ret = filemap_fault(vma, vmf); |
1598 | xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); | 1598 | xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); |
@@ -1629,8 +1629,7 @@ xfs_filemap_pmd_fault( | |||
1629 | } | 1629 | } |
1630 | 1630 | ||
1631 | xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); | 1631 | xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); |
1632 | ret = __dax_pmd_fault(vma, addr, pmd, flags, xfs_get_blocks_dax_fault, | 1632 | ret = __dax_pmd_fault(vma, addr, pmd, flags, xfs_get_blocks_dax_fault); |
1633 | NULL); | ||
1634 | xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); | 1633 | xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); |
1635 | 1634 | ||
1636 | if (flags & FAULT_FLAG_WRITE) | 1635 | if (flags & FAULT_FLAG_WRITE) |
diff --git a/include/linux/dax.h b/include/linux/dax.h index 636dd59ab505..7c45ac7ea1d1 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h | |||
@@ -10,10 +10,8 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, | |||
10 | int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); | 10 | int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); |
11 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); | 11 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); |
12 | int dax_truncate_page(struct inode *, loff_t from, get_block_t); | 12 | int dax_truncate_page(struct inode *, loff_t from, get_block_t); |
13 | int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, | 13 | int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); |
14 | dax_iodone_t); | 14 | int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); |
15 | int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, | ||
16 | dax_iodone_t); | ||
17 | 15 | ||
18 | #ifdef CONFIG_FS_DAX | 16 | #ifdef CONFIG_FS_DAX |
19 | struct page *read_dax_sector(struct block_device *bdev, sector_t n); | 17 | struct page *read_dax_sector(struct block_device *bdev, sector_t n); |
@@ -27,21 +25,20 @@ static inline struct page *read_dax_sector(struct block_device *bdev, | |||
27 | 25 | ||
28 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 26 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
29 | int dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, | 27 | int dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, |
30 | unsigned int flags, get_block_t, dax_iodone_t); | 28 | unsigned int flags, get_block_t); |
31 | int __dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, | 29 | int __dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, |
32 | unsigned int flags, get_block_t, dax_iodone_t); | 30 | unsigned int flags, get_block_t); |
33 | #else | 31 | #else |
34 | static inline int dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | 32 | static inline int dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, |
35 | pmd_t *pmd, unsigned int flags, get_block_t gb, | 33 | pmd_t *pmd, unsigned int flags, get_block_t gb) |
36 | dax_iodone_t di) | ||
37 | { | 34 | { |
38 | return VM_FAULT_FALLBACK; | 35 | return VM_FAULT_FALLBACK; |
39 | } | 36 | } |
40 | #define __dax_pmd_fault dax_pmd_fault | 37 | #define __dax_pmd_fault dax_pmd_fault |
41 | #endif | 38 | #endif |
42 | int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); | 39 | int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); |
43 | #define dax_mkwrite(vma, vmf, gb, iod) dax_fault(vma, vmf, gb, iod) | 40 | #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) |
44 | #define __dax_mkwrite(vma, vmf, gb, iod) __dax_fault(vma, vmf, gb, iod) | 41 | #define __dax_mkwrite(vma, vmf, gb) __dax_fault(vma, vmf, gb) |
45 | 42 | ||
46 | static inline bool vma_is_dax(struct vm_area_struct *vma) | 43 | static inline bool vma_is_dax(struct vm_area_struct *vma) |
47 | { | 44 | { |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 70e61b58baaf..9f2813090d1b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -74,7 +74,6 @@ typedef int (get_block_t)(struct inode *inode, sector_t iblock, | |||
74 | struct buffer_head *bh_result, int create); | 74 | struct buffer_head *bh_result, int create); |
75 | typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | 75 | typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, |
76 | ssize_t bytes, void *private); | 76 | ssize_t bytes, void *private); |
77 | typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); | ||
78 | 77 | ||
79 | #define MAY_EXEC 0x00000001 | 78 | #define MAY_EXEC 0x00000001 |
80 | #define MAY_WRITE 0x00000002 | 79 | #define MAY_WRITE 0x00000002 |