On Wed, May 15, 2024 at 03:28:11PM +0200, Mikulas Patocka wrote: > If we allocate a bio that is larger than NVMe maximum request size, attach > integrity metadata to it and send it to the NVMe subsystem, the integrity > metadata will be corrupted. > > Splitting the bio works correctly. The function bio_split will clone the > bio, trim the iterator of the first bio and advance the iterator of the > second bio. > > However, the function rq_integrity_vec has a bug - it returns the first > vector of the bio's metadata and completely disregards the metadata > iterator that was advanced when the bio was split. Thus, the second bio > uses the same metadata as the first bio and this leads to metadata > corruption. Wrt. NVMe, inside blk_mq_submit_bio(), bio_integrity_prep() is called after bio is split, ->bi_integrity is actually allocated for every split bio, so I am not sure if the issue is related with bio splitting. Or is it related with DM over NVMe? However, rq_integrity_vec() may not work correctly in case of bio merge. Thanks, Ming