提交 14417799 编写于 作者: N Namhyung Kim 提交者: Jens Axboe

block: fix an address space warning in blk-map.c

Change type of 2nd parameter of blk_rq_aligned() into unsigned long
and remove unnecessary casting. Now we can call it with 'uaddr'
instead of 'ubuf' in __blk_rq_map_user() so that it can remove
following warnings from sparse:

 block/blk-map.c:57:31: warning: incorrect type in argument 2 (different address spaces)
 block/blk-map.c:57:31:    expected void *addr
 block/blk-map.c:57:31:    got void [noderef] <asn:1>*ubuf

However blk_rq_map_kern() needs one more local variable to handle it.
Signed-off-by: NNamhyung Kim <namhyung@gmail.com>
Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
上级 8dcbdc74
...@@ -54,7 +54,7 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq, ...@@ -54,7 +54,7 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq,
* direct dma. else, set up kernel bounce buffers * direct dma. else, set up kernel bounce buffers
*/ */
uaddr = (unsigned long) ubuf; uaddr = (unsigned long) ubuf;
if (blk_rq_aligned(q, ubuf, len) && !map_data) if (blk_rq_aligned(q, uaddr, len) && !map_data)
bio = bio_map_user(q, NULL, uaddr, len, reading, gfp_mask); bio = bio_map_user(q, NULL, uaddr, len, reading, gfp_mask);
else else
bio = bio_copy_user(q, map_data, uaddr, len, reading, gfp_mask); bio = bio_copy_user(q, map_data, uaddr, len, reading, gfp_mask);
...@@ -288,6 +288,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, ...@@ -288,6 +288,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
unsigned int len, gfp_t gfp_mask) unsigned int len, gfp_t gfp_mask)
{ {
int reading = rq_data_dir(rq) == READ; int reading = rq_data_dir(rq) == READ;
unsigned long addr = (unsigned long) kbuf;
int do_copy = 0; int do_copy = 0;
struct bio *bio; struct bio *bio;
int ret; int ret;
...@@ -297,7 +298,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, ...@@ -297,7 +298,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
if (!len || !kbuf) if (!len || !kbuf)
return -EINVAL; return -EINVAL;
do_copy = !blk_rq_aligned(q, kbuf, len) || object_is_on_stack(kbuf); do_copy = !blk_rq_aligned(q, addr, len) || object_is_on_stack(kbuf);
if (do_copy) if (do_copy)
bio = bio_copy_kern(q, kbuf, len, gfp_mask, reading); bio = bio_copy_kern(q, kbuf, len, gfp_mask, reading);
else else
......
...@@ -1097,11 +1097,11 @@ static inline int queue_dma_alignment(struct request_queue *q) ...@@ -1097,11 +1097,11 @@ static inline int queue_dma_alignment(struct request_queue *q)
return q ? q->dma_alignment : 511; return q ? q->dma_alignment : 511;
} }
static inline int blk_rq_aligned(struct request_queue *q, void *addr, static inline int blk_rq_aligned(struct request_queue *q, unsigned long addr,
unsigned int len) unsigned int len)
{ {
unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask; unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask;
return !((unsigned long)addr & alignment) && !(len & alignment); return !(addr & alignment) && !(len & alignment);
} }
/* assumes size > 256 */ /* assumes size > 256 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册