Commit 4d8ab62e087d9300883b82c2662e73e6eef803a3

Authored by FUJITA Tomonori
Committed by Jens Axboe
1 parent 10db10d144

bio: convert bio_copy_kern to use bio_copy_user

bio_copy_kern and bio_copy_user are very similar. This converts
bio_copy_kern to use bio_copy_user.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

Showing 1 changed file with 4 additions and 50 deletions Side-by-side Diff

... ... @@ -995,49 +995,14 @@
995 995 struct bio *bio_copy_kern(struct request_queue *q, void *data, unsigned int len,
996 996 gfp_t gfp_mask, int reading)
997 997 {
998   - unsigned long kaddr = (unsigned long)data;
999   - unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
1000   - unsigned long start = kaddr >> PAGE_SHIFT;
1001   - const int nr_pages = end - start;
1002 998 struct bio *bio;
1003 999 struct bio_vec *bvec;
1004   - struct bio_map_data *bmd;
1005   - int i, ret;
1006   - struct sg_iovec iov;
  1000 + int i;
1007 1001  
1008   - iov.iov_base = data;
1009   - iov.iov_len = len;
  1002 + bio = bio_copy_user(q, NULL, (unsigned long)data, len, 1, gfp_mask);
  1003 + if (IS_ERR(bio))
  1004 + return bio;
1010 1005  
1011   - bmd = bio_alloc_map_data(nr_pages, 1, gfp_mask);
1012   - if (!bmd)
1013   - return ERR_PTR(-ENOMEM);
1014   -
1015   - ret = -ENOMEM;
1016   - bio = bio_alloc(gfp_mask, nr_pages);
1017   - if (!bio)
1018   - goto out_bmd;
1019   -
1020   - while (len) {
1021   - struct page *page;
1022   - unsigned int bytes = PAGE_SIZE;
1023   -
1024   - if (bytes > len)
1025   - bytes = len;
1026   -
1027   - page = alloc_page(q->bounce_gfp | gfp_mask);
1028   - if (!page) {
1029   - ret = -ENOMEM;
1030   - goto cleanup;
1031   - }
1032   -
1033   - if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes) {
1034   - ret = -EINVAL;
1035   - goto cleanup;
1036   - }
1037   -
1038   - len -= bytes;
1039   - }
1040   -
1041 1006 if (!reading) {
1042 1007 void *p = data;
1043 1008  
1044 1009  
1045 1010  
... ... @@ -1049,20 +1014,9 @@
1049 1014 }
1050 1015 }
1051 1016  
1052   - bio->bi_private = bmd;
1053 1017 bio->bi_end_io = bio_copy_kern_endio;
1054 1018  
1055   - bio_set_map_data(bmd, bio, &iov, 1, 1);
1056 1019 return bio;
1057   -cleanup:
1058   - bio_for_each_segment(bvec, bio, i)
1059   - __free_page(bvec->bv_page);
1060   -
1061   - bio_put(bio);
1062   -out_bmd:
1063   - bio_free_map_data(bmd);
1064   -
1065   - return ERR_PTR(ret);
1066 1020 }
1067 1021  
1068 1022 /*