}
 EXPORT_SYMBOL(blk_rq_append_bio);
 
-static int __blk_rq_unmap_user(struct bio *bio)
-{
-       int ret = 0;
-
-       if (bio) {
-               if (bio_flagged(bio, BIO_USER_MAPPED))
-                       bio_unmap_user(bio);
-               else
-                       ret = bio_uncopy_user(bio);
-       }
-
-       return ret;
-}
-
 static int __blk_rq_map_user_iov(struct request *rq,
                struct rq_map_data *map_data, struct iov_iter *iter,
                gfp_t gfp_mask, bool copy)
         */
        ret = blk_rq_append_bio(rq, &bio);
        if (ret) {
-               __blk_rq_unmap_user(orig_bio);
+               if (copy)
+                       bio_uncopy_user(orig_bio);
+               else
+                       bio_unmap_user(orig_bio);
                return ret;
        }
        bio_get(bio);
                if (unlikely(bio_flagged(bio, BIO_BOUNCED)))
                        mapped_bio = bio->bi_private;
 
-               ret2 = __blk_rq_unmap_user(mapped_bio);
-               if (ret2 && !ret)
-                       ret = ret2;
+               if (bio_flagged(mapped_bio, BIO_USER_MAPPED)) {
+                       bio_unmap_user(mapped_bio);
+               } else {
+                       ret2 = bio_uncopy_user(mapped_bio);
+                       if (ret2 && !ret)
+                               ret = ret2;
+               }
 
                mapped_bio = bio;
                bio = bio->bi_next;