Use the stream count reported by the data and realtime block devices where they have one, falling back to the geometry-derived count. The count is capped at the group count so that every stream backs onto at least one group; a device with more streams than the filesystem has groups loses the excess, so mkfs should create at least as many groups as the device has streams. Set iomap->write_stream from the inode so that the id reaches the device. Signed-off-by: Kanchan Joshi Signed-off-by: Anuj Gupta --- fs/xfs/xfs_buf.c | 7 ++++++- fs/xfs/xfs_iomap.c | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 4e84528b05cb..1748be9aa7d6 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1709,8 +1709,13 @@ xfs_buftarg_init_streams( unsigned int nr_groups) { unsigned int nr_streams; + unsigned int hw_streams; - nr_streams = xfs_sw_write_stream_count(nr_groups); + hw_streams = bdev_max_write_streams(btp->bt_bdev); + if (hw_streams) + nr_streams = min(hw_streams, nr_groups); + else + nr_streams = xfs_sw_write_stream_count(nr_groups); return write_stream_pool_init(&btp->bt_stream_pool, nr_streams); } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 7c6238fed61e..3e9df790a544 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -144,6 +144,7 @@ xfs_bmbt_to_iomap( } iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); + iomap->write_stream = READ_ONCE(VFS_I(ip)->i_write_stream); if (mapping_flags & IOMAP_DAX) { iomap->dax_dev = target->bt_daxdev; } else { -- 2.25.1