bio_vec-backed iov_iter
[firefly-linux-kernel-4.4.55.git] / mm / page_io.c
index 313bfedb75d1f458d08ba1585659cdc3bb9e3ee1..33bb38c4aad716b326c299d63a6cb72b74759bbc 100644 (file)
@@ -259,23 +259,28 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
                struct kiocb kiocb;
                struct file *swap_file = sis->swap_file;
                struct address_space *mapping = swap_file->f_mapping;
-               struct iovec iov = {
-                       .iov_base = kmap(page),
-                       .iov_len  = PAGE_SIZE,
+               struct bio_vec bv = {
+                       .bv_page = page,
+                       .bv_len  = PAGE_SIZE,
+                       .bv_offset = 0
+               };
+               struct iov_iter from = {
+                       .type = ITER_BVEC | WRITE,
+                       .count = PAGE_SIZE,
+                       .iov_offset = 0,
+                       .nr_segs = 1,
+                       .bvec = &bv
                };
-               struct iov_iter from;
 
                init_sync_kiocb(&kiocb, swap_file);
                kiocb.ki_pos = page_file_offset(page);
                kiocb.ki_nbytes = PAGE_SIZE;
-               iov_iter_init(&from, KERNEL_WRITE, &iov, 1, PAGE_SIZE);
 
                set_page_writeback(page);
                unlock_page(page);
-               ret = mapping->a_ops->direct_IO(KERNEL_WRITE,
+               ret = mapping->a_ops->direct_IO(ITER_BVEC | WRITE,
                                                &kiocb, &from,
                                                kiocb.ki_pos);
-               kunmap(page);
                if (ret == PAGE_SIZE) {
                        count_vm_event(PSWPOUT);
                        ret = 0;