@@ -1550,10 +1550,14 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
1550
1550
unsigned int start_pgofs ;
1551
1551
int bidx = 0 ;
1552
1552
bool is_hole ;
1553
+ bool lfs_dio_write ;
1553
1554
1554
1555
if (!maxblocks )
1555
1556
return 0 ;
1556
1557
1558
+ lfs_dio_write = (flag == F2FS_GET_BLOCK_DIO && f2fs_lfs_mode (sbi ) &&
1559
+ map -> m_may_create );
1560
+
1557
1561
if (!map -> m_may_create && f2fs_map_blocks_cached (inode , map , flag ))
1558
1562
goto out ;
1559
1563
@@ -1600,7 +1604,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
1600
1604
/* use out-place-update for direct IO under LFS mode */
1601
1605
if (map -> m_may_create && (is_hole ||
1602
1606
(flag == F2FS_GET_BLOCK_DIO && f2fs_lfs_mode (sbi ) &&
1603
- !f2fs_is_pinned_file (inode )))) {
1607
+ !f2fs_is_pinned_file (inode ) && map -> m_last_pblk != blkaddr ))) {
1604
1608
if (unlikely (f2fs_cp_error (sbi ))) {
1605
1609
err = - EIO ;
1606
1610
goto sync_out ;
@@ -1684,10 +1688,15 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
1684
1688
1685
1689
if (map -> m_multidev_dio )
1686
1690
map -> m_bdev = FDEV (bidx ).bdev ;
1691
+
1692
+ if (lfs_dio_write )
1693
+ map -> m_last_pblk = NULL_ADDR ;
1687
1694
} else if (map_is_mergeable (sbi , map , blkaddr , flag , bidx , ofs )) {
1688
1695
ofs ++ ;
1689
1696
map -> m_len ++ ;
1690
1697
} else {
1698
+ if (lfs_dio_write && !f2fs_is_pinned_file (inode ))
1699
+ map -> m_last_pblk = blkaddr ;
1691
1700
goto sync_out ;
1692
1701
}
1693
1702
@@ -1712,14 +1721,6 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
1712
1721
dn .ofs_in_node = end_offset ;
1713
1722
}
1714
1723
1715
- if (flag == F2FS_GET_BLOCK_DIO && f2fs_lfs_mode (sbi ) &&
1716
- map -> m_may_create ) {
1717
- /* the next block to be allocated may not be contiguous. */
1718
- if (GET_SEGOFF_FROM_SEG0 (sbi , blkaddr ) % BLKS_PER_SEC (sbi ) ==
1719
- CAP_BLKS_PER_SEC (sbi ) - 1 )
1720
- goto sync_out ;
1721
- }
1722
-
1723
1724
if (pgofs >= end )
1724
1725
goto sync_out ;
1725
1726
else if (dn .ofs_in_node < end_offset )
@@ -4162,7 +4163,7 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
4162
4163
unsigned int flags , struct iomap * iomap ,
4163
4164
struct iomap * srcmap )
4164
4165
{
4165
- struct f2fs_map_blocks map = {};
4166
+ struct f2fs_map_blocks map = { NULL , };
4166
4167
pgoff_t next_pgofs = 0 ;
4167
4168
int err ;
4168
4169
@@ -4171,6 +4172,10 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
4171
4172
map .m_next_pgofs = & next_pgofs ;
4172
4173
map .m_seg_type = f2fs_rw_hint_to_seg_type (F2FS_I_SB (inode ),
4173
4174
inode -> i_write_hint );
4175
+ if (flags & IOMAP_WRITE && iomap -> private ) {
4176
+ map .m_last_pblk = (unsigned long )iomap -> private ;
4177
+ iomap -> private = NULL ;
4178
+ }
4174
4179
4175
4180
/*
4176
4181
* If the blocks being overwritten are already allocated,
@@ -4209,6 +4214,9 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
4209
4214
iomap -> flags |= IOMAP_F_MERGED ;
4210
4215
iomap -> bdev = map .m_bdev ;
4211
4216
iomap -> addr = F2FS_BLK_TO_BYTES (map .m_pblk );
4217
+
4218
+ if (flags & IOMAP_WRITE && map .m_last_pblk )
4219
+ iomap -> private = (void * )map .m_last_pblk ;
4212
4220
} else {
4213
4221
if (flags & IOMAP_WRITE )
4214
4222
return - ENOTBLK ;
0 commit comments