@@ -1465,10 +1465,15 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
14651465 struct extent_info ei = {0 , };
14661466 block_t blkaddr ;
14671467 unsigned int start_pgofs ;
1468+ int bidx = 0 ;
14681469
14691470 if (!maxblocks )
14701471 return 0 ;
14711472
1473+ map -> m_bdev = inode -> i_sb -> s_bdev ;
1474+ map -> m_multidev_dio =
1475+ f2fs_allow_multi_device_dio (F2FS_I_SB (inode ), flag );
1476+
14721477 map -> m_len = 0 ;
14731478 map -> m_flags = 0 ;
14741479
@@ -1491,6 +1496,21 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
14911496 if (flag == F2FS_GET_BLOCK_DIO )
14921497 f2fs_wait_on_block_writeback_range (inode ,
14931498 map -> m_pblk , map -> m_len );
1499+
1500+ if (map -> m_multidev_dio ) {
1501+ block_t blk_addr = map -> m_pblk ;
1502+
1503+ bidx = f2fs_target_device_index (sbi , map -> m_pblk );
1504+
1505+ map -> m_bdev = FDEV (bidx ).bdev ;
1506+ map -> m_pblk -= FDEV (bidx ).start_blk ;
1507+ map -> m_len = min (map -> m_len ,
1508+ FDEV (bidx ).end_blk + 1 - map -> m_pblk );
1509+
1510+ if (map -> m_may_create )
1511+ f2fs_update_device_state (sbi , inode -> i_ino ,
1512+ blk_addr , map -> m_len );
1513+ }
14941514 goto out ;
14951515 }
14961516
@@ -1609,6 +1629,9 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
16091629 if (flag == F2FS_GET_BLOCK_PRE_AIO )
16101630 goto skip ;
16111631
1632+ if (map -> m_multidev_dio )
1633+ bidx = f2fs_target_device_index (sbi , blkaddr );
1634+
16121635 if (map -> m_len == 0 ) {
16131636 /* preallocated unwritten block should be mapped for fiemap. */
16141637 if (blkaddr == NEW_ADDR )
@@ -1617,10 +1640,15 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
16171640
16181641 map -> m_pblk = blkaddr ;
16191642 map -> m_len = 1 ;
1643+
1644+ if (map -> m_multidev_dio )
1645+ map -> m_bdev = FDEV (bidx ).bdev ;
16201646 } else if ((map -> m_pblk != NEW_ADDR &&
16211647 blkaddr == (map -> m_pblk + ofs )) ||
16221648 (map -> m_pblk == NEW_ADDR && blkaddr == NEW_ADDR ) ||
16231649 flag == F2FS_GET_BLOCK_PRE_DIO ) {
1650+ if (map -> m_multidev_dio && map -> m_bdev != FDEV (bidx ).bdev )
1651+ goto sync_out ;
16241652 ofs ++ ;
16251653 map -> m_len ++ ;
16261654 } else {
@@ -1673,11 +1701,31 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
16731701
16741702sync_out :
16751703
1676- /* for hardware encryption, but to avoid potential issue in future */
1677- if (flag == F2FS_GET_BLOCK_DIO && map -> m_flags & F2FS_MAP_MAPPED )
1704+ if (flag == F2FS_GET_BLOCK_DIO && map -> m_flags & F2FS_MAP_MAPPED ) {
1705+ /*
1706+ * for hardware encryption, but to avoid potential issue
1707+ * in future
1708+ */
16781709 f2fs_wait_on_block_writeback_range (inode ,
16791710 map -> m_pblk , map -> m_len );
16801711
1712+ if (map -> m_multidev_dio ) {
1713+ block_t blk_addr = map -> m_pblk ;
1714+
1715+ bidx = f2fs_target_device_index (sbi , map -> m_pblk );
1716+
1717+ map -> m_bdev = FDEV (bidx ).bdev ;
1718+ map -> m_pblk -= FDEV (bidx ).start_blk ;
1719+
1720+ if (map -> m_may_create )
1721+ f2fs_update_device_state (sbi , inode -> i_ino ,
1722+ blk_addr , map -> m_len );
1723+
1724+ f2fs_bug_on (sbi , blk_addr + map -> m_len >
1725+ FDEV (bidx ).end_blk + 1 );
1726+ }
1727+ }
1728+
16811729 if (flag == F2FS_GET_BLOCK_PRECACHE ) {
16821730 if (map -> m_flags & F2FS_MAP_MAPPED ) {
16831731 unsigned int ofs = start_pgofs - map -> m_lblk ;
@@ -1696,7 +1744,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
16961744 f2fs_balance_fs (sbi , dn .node_changed );
16971745 }
16981746out :
1699- trace_f2fs_map_blocks (inode , map , err );
1747+ trace_f2fs_map_blocks (inode , map , create , flag , err );
17001748 return err ;
17011749}
17021750
@@ -1755,6 +1803,9 @@ static int __get_data_block(struct inode *inode, sector_t iblock,
17551803 map_bh (bh , inode -> i_sb , map .m_pblk );
17561804 bh -> b_state = (bh -> b_state & ~F2FS_MAP_FLAGS ) | map .m_flags ;
17571805 bh -> b_size = blks_to_bytes (inode , map .m_len );
1806+
1807+ if (map .m_multidev_dio )
1808+ bh -> b_bdev = map .m_bdev ;
17581809 }
17591810 return err ;
17601811}
0 commit comments