Skip to content

Commit

Permalink
[SCSI] block: fix bio_add_page misuse with rq_map_data
Browse files Browse the repository at this point in the history
This fixes bio_add_page misuse in bio_copy_user_iov with rq_map_data,
which only sg uses now.

rq_map_data carries page frames for bio_add_pc_page. bio_copy_user_iov
uses bio_add_pc_page with a larger size than PAGE_SIZE. It's clearly
wrong.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
FUJITA Tomonori authored and James Bottomley committed Jan 2, 2009
1 parent 4f10aae commit e623ddb
Showing 1 changed file with 14 additions and 12 deletions.
26 changes: 14 additions & 12 deletions fs/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -815,28 +815,30 @@ struct bio *bio_copy_user_iov(struct request_queue *q,

ret = 0;
i = 0;
if (map_data)
nr_pages = 1 << map_data->page_order;
while (len) {
unsigned int bytes;

if (map_data)
bytes = 1U << (PAGE_SHIFT + map_data->page_order);
else
bytes = PAGE_SIZE;
unsigned int bytes = PAGE_SIZE;

if (bytes > len)
bytes = len;

if (map_data) {
if (i == map_data->nr_entries) {
if (i == map_data->nr_entries * nr_pages) {
ret = -ENOMEM;
break;
}
page = map_data->pages[i++];
} else

page = map_data->pages[i / nr_pages];
page += (i % nr_pages);

i++;
} else {
page = alloc_page(q->bounce_gfp | gfp_mask);
if (!page) {
ret = -ENOMEM;
break;
if (!page) {
ret = -ENOMEM;
break;
}
}

if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes)
Expand Down

0 comments on commit e623ddb

Please sign in to comment.