@@ -1264,6 +1264,15 @@ static s64 dax_zero_iter(struct iomap_iter *iter, bool *did_zero)
1264
1264
if (srcmap -> type == IOMAP_HOLE || srcmap -> type == IOMAP_UNWRITTEN )
1265
1265
return length ;
1266
1266
1267
+ /*
1268
+ * invalidate the pages whose sharing state is to be changed
1269
+ * because of CoW.
1270
+ */
1271
+ if (iomap -> flags & IOMAP_F_SHARED )
1272
+ invalidate_inode_pages2_range (iter -> inode -> i_mapping ,
1273
+ pos >> PAGE_SHIFT ,
1274
+ (pos + length - 1 ) >> PAGE_SHIFT );
1275
+
1267
1276
do {
1268
1277
unsigned offset = offset_in_page (pos );
1269
1278
unsigned size = min_t (u64 , PAGE_SIZE - offset , length );
@@ -1324,12 +1333,13 @@ static loff_t dax_iomap_iter(const struct iomap_iter *iomi,
1324
1333
struct iov_iter * iter )
1325
1334
{
1326
1335
const struct iomap * iomap = & iomi -> iomap ;
1327
- const struct iomap * srcmap = & iomi -> srcmap ;
1336
+ const struct iomap * srcmap = iomap_iter_srcmap ( iomi ) ;
1328
1337
loff_t length = iomap_length (iomi );
1329
1338
loff_t pos = iomi -> pos ;
1330
1339
struct dax_device * dax_dev = iomap -> dax_dev ;
1331
1340
loff_t end = pos + length , done = 0 ;
1332
1341
bool write = iov_iter_rw (iter ) == WRITE ;
1342
+ bool cow = write && iomap -> flags & IOMAP_F_SHARED ;
1333
1343
ssize_t ret = 0 ;
1334
1344
size_t xfer ;
1335
1345
int id ;
@@ -1356,7 +1366,7 @@ static loff_t dax_iomap_iter(const struct iomap_iter *iomi,
1356
1366
* into page tables. We have to tear down these mappings so that data
1357
1367
* written by write(2) is visible in mmap.
1358
1368
*/
1359
- if (iomap -> flags & IOMAP_F_NEW ) {
1369
+ if (iomap -> flags & IOMAP_F_NEW || cow ) {
1360
1370
invalidate_inode_pages2_range (iomi -> inode -> i_mapping ,
1361
1371
pos >> PAGE_SHIFT ,
1362
1372
(end - 1 ) >> PAGE_SHIFT );
@@ -1390,8 +1400,7 @@ static loff_t dax_iomap_iter(const struct iomap_iter *iomi,
1390
1400
break ;
1391
1401
}
1392
1402
1393
- if (write &&
1394
- srcmap -> type != IOMAP_HOLE && srcmap -> addr != iomap -> addr ) {
1403
+ if (cow ) {
1395
1404
ret = dax_iomap_cow_copy (pos , length , PAGE_SIZE , srcmap ,
1396
1405
kaddr );
1397
1406
if (ret )
0 commit comments