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; |