pagelistinfo->num_pages, pagelistinfo->dma_dir);
        }
 
-       if (pagelistinfo->pages_need_release) {
-               unsigned int i;
-
-               for (i = 0; i < pagelistinfo->num_pages; i++)
-                       put_page(pagelistinfo->pages[i]);
-       }
+       if (pagelistinfo->pages_need_release)
+               unpin_user_pages(pagelistinfo->pages, pagelistinfo->num_pages);
 
        dma_free_coherent(g_dev, pagelistinfo->pagelist_buffer_size,
                          pagelistinfo->pagelist, pagelistinfo->dma_addr);
                }
                /* do not try and release vmalloc pages */
        } else {
-               actual_pages = get_user_pages_fast(
+               actual_pages = pin_user_pages_fast(
                                          (unsigned long)buf & PAGE_MASK,
                                          num_pages,
                                          type == PAGELIST_READ,
                                       __func__, actual_pages, num_pages);
 
                        /* This is probably due to the process being killed */
-                       while (actual_pages > 0) {
-                               actual_pages--;
-                               put_page(pages[actual_pages]);
-                       }
+                       if (actual_pages > 0)
+                               unpin_user_pages(pages, actual_pages);
                        cleanup_pagelistinfo(pagelistinfo);
                        return NULL;
                }