|
@@ -139,6 +139,23 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq,
|
|
|
ubuf += ret;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * __blk_rq_map_user() copies the buffers if starting address
|
|
|
+ * or length isn't aligned. As the copied buffer is always
|
|
|
+ * page aligned, we know that there's enough room for padding.
|
|
|
+ * Extend the last bio and update rq->data_len accordingly.
|
|
|
+ *
|
|
|
+ * On unmap, bio_uncopy_user() will use unmodified
|
|
|
+ * bio_map_data pointed to by bio->bi_private.
|
|
|
+ */
|
|
|
+ if (len & queue_dma_alignment(q)) {
|
|
|
+ unsigned int pad_len = (queue_dma_alignment(q) & ~len) + 1;
|
|
|
+ struct bio *bio = rq->biotail;
|
|
|
+
|
|
|
+ bio->bi_io_vec[bio->bi_vcnt - 1].bv_len += pad_len;
|
|
|
+ bio->bi_size += pad_len;
|
|
|
+ }
|
|
|
+
|
|
|
rq->buffer = rq->data = NULL;
|
|
|
return 0;
|
|
|
unmap_rq:
|