|
@@ -1383,6 +1383,7 @@ struct bio *bio_map_user_iov(struct request_queue *q,
|
|
|
offset = offset_in_page(uaddr);
|
|
|
for (j = cur_page; j < page_limit; j++) {
|
|
|
unsigned int bytes = PAGE_SIZE - offset;
|
|
|
+ unsigned short prev_bi_vcnt = bio->bi_vcnt;
|
|
|
|
|
|
if (len <= 0)
|
|
|
break;
|
|
@@ -1397,6 +1398,13 @@ struct bio *bio_map_user_iov(struct request_queue *q,
|
|
|
bytes)
|
|
|
break;
|
|
|
|
|
|
+ /*
|
|
|
+ * check if vector was merged with previous
|
|
|
+ * drop page reference if needed
|
|
|
+ */
|
|
|
+ if (bio->bi_vcnt == prev_bi_vcnt)
|
|
|
+ put_page(pages[j]);
|
|
|
+
|
|
|
len -= bytes;
|
|
|
offset = 0;
|
|
|
}
|