aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-05-11 05:58:48 -0400
committerVishal Verma <vishal.l.verma@intel.com>2016-05-16 20:11:51 -0400
commit02fbd139759feb1f331cebd858523b5d774082e6 (patch)
tree841ff90012518ce3c37ecb1cca0367db7568d18a
parente4b2749158631e6d74bf14d2ef3804d780e2f770 (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.c4
-rw-r--r--fs/dax.c43
-rw-r--r--fs/ext2/file.c4
-rw-r--r--fs/ext4/file.c4
-rw-r--r--fs/xfs/xfs_file.c7
-rw-r--r--include/linux/dax.h17
-rw-r--r--include/linux/fs.h1
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 */
1747static int blkdev_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1747static 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
1752static int blkdev_dax_pfn_mkwrite(struct vm_area_struct *vma, 1752static 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,
1758static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, 1758static 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
1764static const struct vm_operations_struct blkdev_dax_vm_ops = { 1764static const struct vm_operations_struct blkdev_dax_vm_ops = {
diff --git a/fs/dax.c b/fs/dax.c
index 7ef5aef78442..83e7894d86d8 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -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 */
626int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, 620int __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 */
774int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, 754int 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
817int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, 797int __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 */
1044int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, 1021int 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,
10int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); 10int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size);
11int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); 11int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t);
12int dax_truncate_page(struct inode *, loff_t from, get_block_t); 12int dax_truncate_page(struct inode *, loff_t from, get_block_t);
13int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, 13int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t);
14 dax_iodone_t); 14int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t);
15int __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
19struct page *read_dax_sector(struct block_device *bdev, sector_t n); 17struct 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
29int dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, 27int 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);
31int __dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, 29int __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
34static inline int dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, 32static 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
42int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); 39int 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
46static inline bool vma_is_dax(struct vm_area_struct *vma) 43static 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);
75typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, 75typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
76 ssize_t bytes, void *private); 76 ssize_t bytes, void *private);
77typedef 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