<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From: Lars Ellenberg &lt;lars.ellenberg@linbit.com&gt;
X-Patchwork-Id: 83666

FIXME Missing header &amp; 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-&gt;merge_bvec_fn &amp;&amp; !ti-&gt;type-&gt;merge)
+	if (q-&gt;merge_bvec_fn &amp;&amp; !ti-&gt;type-&gt;merge) {
 		blk_limits_max_hw_sectors(limits,
 					  (unsigned int) (PAGE_SIZE &gt;&gt; 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-&gt;max_segments = 1;
+	}
+
 	return 0;
 }
 EXPORT_SYMBOL_GPL(dm_set_device_limits);
</pre></body></html>