It doesn't make sense to continue to pin user pages when
bio can't hold more pages.
Also this patch fixes possible double page release issue
when get_user_pages_fast() failure happens just after some
of pages in last round weren't added in the bio.

Signed-off-by: Ming Lei <ming....@canonical.com>
---
 block/bio.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 471d738..fcf0b15 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1365,9 +1365,13 @@ static struct bio *__bio_map_user_iov(struct 
request_queue *q,
                cur_page = j;
                /*
                 * release the pages we didn't map into the bio, if any
+                * and stop to pin pages if page can't be added.
                 */
-               while (j < page_limit)
-                       page_cache_release(pages[j++]);
+               if (j < page_limit) {
+                       while (j < page_limit)
+                               page_cache_release(pages[j++]);
+                       break;
+               }
        }
 
        kfree(pages);
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to