Skip to content

Commit

Permalink
[SCSI] block: make blk_rq_map_user take a NULL user-space buffer for …
Browse files Browse the repository at this point in the history
…WRITE

The commit 8188276 (block: make
blk_rq_map_user take a NULL user-space buffer) extended
blk_rq_map_user to accept a NULL user-space buffer with a READ
command. It was necessary to convert sg to use the block layer mapping
API.

This patch extends blk_rq_map_user again for a WRITE command. It is
necessary to convert st and osst drivers to use the block layer
apping API.

Signed-off-by: FUJITA Tomonori <[email protected]>
Acked-by: Jens Axboe <[email protected]>
Signed-off-by: James Bottomley <[email protected]>
  • Loading branch information
fujita authored and James Bottomley committed Jan 2, 2009
1 parent 56c451f commit 97ae77a
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 10 deletions.
16 changes: 7 additions & 9 deletions block/blk-map.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static int __blk_rq_unmap_user(struct bio *bio)

static int __blk_rq_map_user(struct request_queue *q, struct request *rq,
struct rq_map_data *map_data, void __user *ubuf,
unsigned int len, int null_mapped, gfp_t gfp_mask)
unsigned int len, gfp_t gfp_mask)
{
unsigned long uaddr;
struct bio *bio, *orig_bio;
Expand All @@ -63,7 +63,7 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq,
if (IS_ERR(bio))
return PTR_ERR(bio);

if (null_mapped)
if (map_data && map_data->null_mapped)
bio->bi_flags |= (1 << BIO_NULL_MAPPED);

orig_bio = bio;
Expand Down Expand Up @@ -114,17 +114,15 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq,
{
unsigned long bytes_read = 0;
struct bio *bio = NULL;
int ret, null_mapped = 0;
int ret;

if (len > (q->max_hw_sectors << 9))
return -EINVAL;
if (!len)
return -EINVAL;
if (!ubuf) {
if (!map_data || rq_data_dir(rq) != READ)
return -EINVAL;
null_mapped = 1;
}

if (!ubuf && (!map_data || !map_data->null_mapped))
return -EINVAL;

while (bytes_read != len) {
unsigned long map_len, end, start;
Expand All @@ -143,7 +141,7 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq,
map_len -= PAGE_SIZE;

ret = __blk_rq_map_user(q, rq, map_data, ubuf, map_len,
null_mapped, gfp_mask);
gfp_mask);
if (ret < 0)
goto unmap_rq;
if (!bio)
Expand Down
1 change: 1 addition & 0 deletions drivers/scsi/sg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1670,6 +1670,7 @@ static int sg_start_req(Sg_request *srp, unsigned char *cmd)
md->page_order = req_schp->page_order;
md->nr_entries = req_schp->k_use_sg;
md->offset = 0;
md->null_mapped = hp->dxferp ? 0 : 1;
}

if (iov_count)
Expand Down
2 changes: 1 addition & 1 deletion fs/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
/*
* success
*/
if (!write_to_vm) {
if (!write_to_vm && (!map_data || !map_data->null_mapped)) {
ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 0);
if (ret)
goto cleanup;
Expand Down
1 change: 1 addition & 0 deletions include/linux/blkdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,7 @@ struct rq_map_data {
int page_order;
int nr_entries;
unsigned long offset;
int null_mapped;
};

struct req_iterator {
Expand Down

0 comments on commit 97ae77a

Please sign in to comment.