diff options
Diffstat (limited to 'fs/bio.c')
| -rw-r--r-- | fs/bio.c | 17 |
1 files changed, 5 insertions, 12 deletions
| @@ -77,11 +77,8 @@ struct bio_vec *bvec_alloc_bs(gfp_t gfp_mask, int nr, unsigned long *idx, struct | |||
| 77 | */ | 77 | */ |
| 78 | 78 | ||
| 79 | bvl = mempool_alloc(bs->bvec_pools[*idx], gfp_mask); | 79 | bvl = mempool_alloc(bs->bvec_pools[*idx], gfp_mask); |
| 80 | if (bvl) { | 80 | if (bvl) |
| 81 | struct biovec_slab *bp = bvec_slabs + *idx; | 81 | memset(bvl, 0, bvec_nr_vecs(*idx) * sizeof(struct bio_vec)); |
| 82 | |||
| 83 | memset(bvl, 0, bp->nr_vecs * sizeof(struct bio_vec)); | ||
| 84 | } | ||
| 85 | 82 | ||
| 86 | return bvl; | 83 | return bvl; |
| 87 | } | 84 | } |
| @@ -149,7 +146,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs) | |||
| 149 | goto out; | 146 | goto out; |
| 150 | } | 147 | } |
| 151 | bio->bi_flags |= idx << BIO_POOL_OFFSET; | 148 | bio->bi_flags |= idx << BIO_POOL_OFFSET; |
| 152 | bio->bi_max_vecs = bvec_slabs[idx].nr_vecs; | 149 | bio->bi_max_vecs = bvec_nr_vecs(idx); |
| 153 | } | 150 | } |
| 154 | bio->bi_io_vec = bvl; | 151 | bio->bi_io_vec = bvl; |
| 155 | } | 152 | } |
| @@ -721,12 +718,8 @@ static struct bio *__bio_map_user_iov(struct request_queue *q, | |||
| 721 | const int local_nr_pages = end - start; | 718 | const int local_nr_pages = end - start; |
| 722 | const int page_limit = cur_page + local_nr_pages; | 719 | const int page_limit = cur_page + local_nr_pages; |
| 723 | 720 | ||
| 724 | down_read(¤t->mm->mmap_sem); | 721 | ret = get_user_pages_fast(uaddr, local_nr_pages, |
| 725 | ret = get_user_pages(current, current->mm, uaddr, | 722 | write_to_vm, &pages[cur_page]); |
| 726 | local_nr_pages, | ||
| 727 | write_to_vm, 0, &pages[cur_page], NULL); | ||
| 728 | up_read(¤t->mm->mmap_sem); | ||
| 729 | |||
| 730 | if (ret < local_nr_pages) { | 723 | if (ret < local_nr_pages) { |
| 731 | ret = -EFAULT; | 724 | ret = -EFAULT; |
| 732 | goto out_unmap; | 725 | goto out_unmap; |
