|
@@ -968,7 +968,8 @@ static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone);
|
|
|
|
|
|
/*
|
|
|
* Generate a new unfragmented bio with the given size
|
|
|
- * This should never violate the device limitations
|
|
|
+ * This should never violate the device limitations (but only because
|
|
|
+ * max_segment_size is being constrained to PAGE_SIZE).
|
|
|
*
|
|
|
* This function may be called concurrently. If we allocate from the mempool
|
|
|
* concurrently, there is a possibility of deadlock. For example, if we have
|
|
@@ -2045,9 +2046,20 @@ static int crypt_iterate_devices(struct dm_target *ti,
|
|
|
return fn(ti, cc->dev, cc->start, ti->len, data);
|
|
|
}
|
|
|
|
|
|
+static void crypt_io_hints(struct dm_target *ti, struct queue_limits *limits)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Unfortunate constraint that is required to avoid the potential
|
|
|
+ * for exceeding underlying device's max_segments limits -- due to
|
|
|
+ * crypt_alloc_buffer() possibly allocating pages for the encryption
|
|
|
+ * bio that are not as physically contiguous as the original bio.
|
|
|
+ */
|
|
|
+ limits->max_segment_size = PAGE_SIZE;
|
|
|
+}
|
|
|
+
|
|
|
static struct target_type crypt_target = {
|
|
|
.name = "crypt",
|
|
|
- .version = {1, 14, 0},
|
|
|
+ .version = {1, 14, 1},
|
|
|
.module = THIS_MODULE,
|
|
|
.ctr = crypt_ctr,
|
|
|
.dtr = crypt_dtr,
|
|
@@ -2058,6 +2070,7 @@ static struct target_type crypt_target = {
|
|
|
.resume = crypt_resume,
|
|
|
.message = crypt_message,
|
|
|
.iterate_devices = crypt_iterate_devices,
|
|
|
+ .io_hints = crypt_io_hints,
|
|
|
};
|
|
|
|
|
|
static int __init dm_crypt_init(void)
|