# Refer bsc#1235682#c101
Index: oracleasm-2.0.8/drivers/block/oracleasm/driver.c
===================================================================
--- oracleasm-2.0.8.orig/drivers/block/oracleasm/driver.c
+++ oracleasm-2.0.8/drivers/block/oracleasm/driver.c
@@ -1139,8 +1139,6 @@ static void asm_end_bio_io(struct bio *b
  *      Map the user space address into a bio suitable for io to a block
  *      device. Returns an error pointer in case of error.
  */
-
-
 static struct bio *asm_bio_map_user_iov(struct request_queue *q,
                 struct iov_iter *iter, gfp_t gfp_mask, int rw)
 {
@@ -1158,6 +1156,8 @@ static struct bio *asm_bio_map_user_iov(
                 return ERR_PTR(-ENOMEM);
 	}
 	bio_init(bio, NULL, bio->bi_inline_vecs, nr_vecs, rw);
+        if (user_backed_iter(iter))
+                bio_set_flag(bio, BIO_PAGE_REFFED);
 
         while (iov_iter_count(iter)) {
                 struct page **pages;
Index: oracleasm-2.0.8/drivers/block/oracleasm/integrity.c
===================================================================
--- oracleasm-2.0.8.orig/drivers/block/oracleasm/integrity.c
+++ oracleasm-2.0.8/drivers/block/oracleasm/integrity.c
@@ -188,6 +188,10 @@ int asm_integrity_map(struct oracleasm_i
 	ret = get_user_pages_fast(uaddr, nr_pages, write_to_vm, &pages[0]);
 	if (unlikely(ret < nr_pages)) {
 		pr_err("%s: could not get user pages\n", __func__);
+		if (ret > 0) {
+			for (i = 0; i < ret; ++i)
+				put_page(pages[i]);
+		}
 		kfree(pages);
 		return -EFAULT;
 	}
@@ -209,6 +213,7 @@ int asm_integrity_map(struct oracleasm_i
 
 		if (unlikely(added < bytes)) {
 			ret = -1;
+			i = 0;
 			pr_err("%s: bio %p added %u bytes, wanted %u\n",
 			       __func__, bio, added, bytes);
 			break;
