Loading block/bio.c +12 −8 Original line number Diff line number Diff line Loading @@ -1070,14 +1070,21 @@ struct bio_map_data { struct iovec iov[]; }; static struct bio_map_data *bio_alloc_map_data(unsigned int iov_count, static struct bio_map_data *bio_alloc_map_data(struct iov_iter *data, gfp_t gfp_mask) { if (iov_count > UIO_MAXIOV) struct bio_map_data *bmd; if (data->nr_segs > UIO_MAXIOV) return NULL; return kmalloc(sizeof(struct bio_map_data) + sizeof(struct iovec) * iov_count, gfp_mask); bmd = kmalloc(sizeof(struct bio_map_data) + sizeof(struct iovec) * data->nr_segs, gfp_mask); if (!bmd) return NULL; memcpy(bmd->iov, data->iov, sizeof(struct iovec) * data->nr_segs); bmd->iter = *data; bmd->iter.iov = bmd->iov; return bmd; } /** Loading Loading @@ -1206,7 +1213,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, unsigned int len = iter->count; unsigned int offset = map_data ? offset_in_page(map_data->offset) : 0; bmd = bio_alloc_map_data(iter->nr_segs, gfp_mask); bmd = bio_alloc_map_data(iter, gfp_mask); if (!bmd) return ERR_PTR(-ENOMEM); Loading @@ -1216,9 +1223,6 @@ struct bio *bio_copy_user_iov(struct request_queue *q, * shortlived one. */ bmd->is_our_pages = map_data ? 0 : 1; memcpy(bmd->iov, iter->iov, sizeof(struct iovec) * iter->nr_segs); bmd->iter = *iter; bmd->iter.iov = bmd->iov; nr_pages = DIV_ROUND_UP(offset + len, PAGE_SIZE); if (nr_pages > BIO_MAX_PAGES) Loading Loading
block/bio.c +12 −8 Original line number Diff line number Diff line Loading @@ -1070,14 +1070,21 @@ struct bio_map_data { struct iovec iov[]; }; static struct bio_map_data *bio_alloc_map_data(unsigned int iov_count, static struct bio_map_data *bio_alloc_map_data(struct iov_iter *data, gfp_t gfp_mask) { if (iov_count > UIO_MAXIOV) struct bio_map_data *bmd; if (data->nr_segs > UIO_MAXIOV) return NULL; return kmalloc(sizeof(struct bio_map_data) + sizeof(struct iovec) * iov_count, gfp_mask); bmd = kmalloc(sizeof(struct bio_map_data) + sizeof(struct iovec) * data->nr_segs, gfp_mask); if (!bmd) return NULL; memcpy(bmd->iov, data->iov, sizeof(struct iovec) * data->nr_segs); bmd->iter = *data; bmd->iter.iov = bmd->iov; return bmd; } /** Loading Loading @@ -1206,7 +1213,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, unsigned int len = iter->count; unsigned int offset = map_data ? offset_in_page(map_data->offset) : 0; bmd = bio_alloc_map_data(iter->nr_segs, gfp_mask); bmd = bio_alloc_map_data(iter, gfp_mask); if (!bmd) return ERR_PTR(-ENOMEM); Loading @@ -1216,9 +1223,6 @@ struct bio *bio_copy_user_iov(struct request_queue *q, * shortlived one. */ bmd->is_our_pages = map_data ? 0 : 1; memcpy(bmd->iov, iter->iov, sizeof(struct iovec) * iter->nr_segs); bmd->iter = *iter; bmd->iter.iov = bmd->iov; nr_pages = DIV_ROUND_UP(offset + len, PAGE_SIZE); if (nr_pages > BIO_MAX_PAGES) Loading