/* bioset used to allocate the gc_bios */
struct bio_set bio_set;
+ /* bioset used when writes need to be split to hardware limits */
+ struct bio_set split_bio_set;
+
/*
* Scratchpad to buffer GC data, organized as a ring buffer over
* discontiguous folios. scratch_head is where the buffer is filled,
if (bioset_init(&data->bio_set, 16, offsetof(struct xfs_gc_bio, bio),
BIOSET_NEED_BVECS))
goto out_free_recs;
+ if (bioset_init(&data->split_bio_set, 16,
+ offsetof(struct xfs_gc_bio, bio), 0))
+ goto out_exit_bio_set;
for (i = 0; i < XFS_GC_NR_BUFS; i++) {
data->scratch_folios[i] =
folio_alloc(GFP_KERNEL, get_order(XFS_GC_BUF_SIZE));
out_free_scratch:
while (--i >= 0)
folio_put(data->scratch_folios[i]);
+ bioset_exit(&data->split_bio_set);
+out_exit_bio_set:
bioset_exit(&data->bio_set);
out_free_recs:
kfree(data->iter.recs);
for (i = 0; i < XFS_GC_NR_BUFS; i++)
folio_put(data->scratch_folios[i]);
+ bioset_exit(&data->split_bio_set);
bioset_exit(&data->bio_set);
kfree(data->iter.recs);
kfree(data);
data->mp->m_sb.sb_blocksize) >> SECTOR_SHIFT;
split_len = split_sectors << SECTOR_SHIFT;
- split = bio_split(&chunk->bio, split_sectors, GFP_NOFS, &data->bio_set);
+ split = bio_split(&chunk->bio, split_sectors, GFP_NOFS,
+ &data->split_bio_set);
split_chunk = container_of(split, struct xfs_gc_bio, bio);
split_chunk->data = data;
ihold(VFS_I(chunk->ip));