From: Lars Ellenberg X-Patchwork-Id: 83666 FIXME Missing header & signoff FIXME Needs recent test evidence of failure without the patch Speaking of... dm_set_device_limits is still doing things wrong here, I think. I posted this about two years ago, but somehow it got lost and I lost it from my focus as well. Reading this post reminded me ... there was something: --- drivers/md/dm-table.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) Index: linux/drivers/md/dm-table.c =================================================================== --- linux.orig/drivers/md/dm-table.c +++ linux/drivers/md/dm-table.c @@ -518,9 +518,21 @@ int dm_set_device_limits(struct dm_targe * smaller I/O, just to be safe. */ - if (q->merge_bvec_fn && !ti->type->merge) + if (q->merge_bvec_fn && !ti->type->merge) { blk_limits_max_hw_sectors(limits, (unsigned int) (PAGE_SIZE >> 9)); + + /* Restricting max_sectors is not enough. + * If someone uses bio_add_page to add 8 disjunct 512 byte + * partial pages to a bio, it would succeed, + * but could still cross a border of whatever restrictions + * are below us (raid0 stripe boundary). An attempted + * bio_split would not succeed, because bi_vcnt is 8. + * E.g. the xen io layer is known to trigger this. + */ + limits->max_segments = 1; + } + return 0; } EXPORT_SYMBOL_GPL(dm_set_device_limits);