summaryrefslogtreecommitdiffstats
path: root/fs/dax.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/dax.c')
-rw-r--r--fs/dax.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/fs/dax.c b/fs/dax.c
index 432b9e6dd63b..993dc6fe0416 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -75,13 +75,13 @@ static long dax_map_atomic(struct block_device *bdev, struct blk_dax_ctl *dax)
75 struct request_queue *q = bdev->bd_queue; 75 struct request_queue *q = bdev->bd_queue;
76 long rc = -EIO; 76 long rc = -EIO;
77 77
78 dax->addr = (void __pmem *) ERR_PTR(-EIO); 78 dax->addr = ERR_PTR(-EIO);
79 if (blk_queue_enter(q, true) != 0) 79 if (blk_queue_enter(q, true) != 0)
80 return rc; 80 return rc;
81 81
82 rc = bdev_direct_access(bdev, dax); 82 rc = bdev_direct_access(bdev, dax);
83 if (rc < 0) { 83 if (rc < 0) {
84 dax->addr = (void __pmem *) ERR_PTR(rc); 84 dax->addr = ERR_PTR(rc);
85 blk_queue_exit(q); 85 blk_queue_exit(q);
86 return rc; 86 return rc;
87 } 87 }
@@ -147,12 +147,12 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
147 struct buffer_head *bh) 147 struct buffer_head *bh)
148{ 148{
149 loff_t pos = start, max = start, bh_max = start; 149 loff_t pos = start, max = start, bh_max = start;
150 bool hole = false, need_wmb = false; 150 bool hole = false;
151 struct block_device *bdev = NULL; 151 struct block_device *bdev = NULL;
152 int rw = iov_iter_rw(iter), rc; 152 int rw = iov_iter_rw(iter), rc;
153 long map_len = 0; 153 long map_len = 0;
154 struct blk_dax_ctl dax = { 154 struct blk_dax_ctl dax = {
155 .addr = (void __pmem *) ERR_PTR(-EIO), 155 .addr = ERR_PTR(-EIO),
156 }; 156 };
157 unsigned blkbits = inode->i_blkbits; 157 unsigned blkbits = inode->i_blkbits;
158 sector_t file_blks = (i_size_read(inode) + (1 << blkbits) - 1) 158 sector_t file_blks = (i_size_read(inode) + (1 << blkbits) - 1)
@@ -218,7 +218,6 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
218 218
219 if (iov_iter_rw(iter) == WRITE) { 219 if (iov_iter_rw(iter) == WRITE) {
220 len = copy_from_iter_pmem(dax.addr, max - pos, iter); 220 len = copy_from_iter_pmem(dax.addr, max - pos, iter);
221 need_wmb = true;
222 } else if (!hole) 221 } else if (!hole)
223 len = copy_to_iter((void __force *) dax.addr, max - pos, 222 len = copy_to_iter((void __force *) dax.addr, max - pos,
224 iter); 223 iter);
@@ -235,8 +234,6 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
235 dax.addr += len; 234 dax.addr += len;
236 } 235 }
237 236
238 if (need_wmb)
239 wmb_pmem();
240 dax_unmap_atomic(bdev, &dax); 237 dax_unmap_atomic(bdev, &dax);
241 238
242 return (pos == start) ? rc : pos - start; 239 return (pos == start) ? rc : pos - start;
@@ -788,7 +785,6 @@ int dax_writeback_mapping_range(struct address_space *mapping,
788 return ret; 785 return ret;
789 } 786 }
790 } 787 }
791 wmb_pmem();
792 return 0; 788 return 0;
793} 789}
794EXPORT_SYMBOL_GPL(dax_writeback_mapping_range); 790EXPORT_SYMBOL_GPL(dax_writeback_mapping_range);
@@ -1187,7 +1183,6 @@ int __dax_zero_page_range(struct block_device *bdev, sector_t sector,
1187 if (dax_map_atomic(bdev, &dax) < 0) 1183 if (dax_map_atomic(bdev, &dax) < 0)
1188 return PTR_ERR(dax.addr); 1184 return PTR_ERR(dax.addr);
1189 clear_pmem(dax.addr + offset, length); 1185 clear_pmem(dax.addr + offset, length);
1190 wmb_pmem();
1191 dax_unmap_atomic(bdev, &dax); 1186 dax_unmap_atomic(bdev, &dax);
1192 } 1187 }
1193 return 0; 1188 return 0;