Commit 3d1266c7 authored by Jens Axboe's avatar Jens Axboe

SG: audit of drivers that use blk_rq_map_sg()

They need to properly init the sg table, or blk_rq_map_sg() will
complain if CONFIG_DEBUG_SG is set.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 23464ffa
...@@ -4,7 +4,9 @@ ...@@ -4,7 +4,9 @@
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/virtio.h> #include <linux/virtio.h>
#include <linux/virtio_blk.h> #include <linux/virtio_blk.h>
#include <linux/virtio_blk.h> #include <linux/scatterlist.h>
#define VIRTIO_MAX_SG (3+MAX_PHYS_SEGMENTS)
static unsigned char virtblk_index = 'a'; static unsigned char virtblk_index = 'a';
struct virtio_blk struct virtio_blk
...@@ -23,7 +25,7 @@ struct virtio_blk ...@@ -23,7 +25,7 @@ struct virtio_blk
mempool_t *pool; mempool_t *pool;
/* Scatterlist: can be too big for stack. */ /* Scatterlist: can be too big for stack. */
struct scatterlist sg[3+MAX_PHYS_SEGMENTS]; struct scatterlist sg[VIRTIO_MAX_SG];
}; };
struct virtblk_req struct virtblk_req
...@@ -94,8 +96,8 @@ static bool do_req(struct request_queue *q, struct virtio_blk *vblk, ...@@ -94,8 +96,8 @@ static bool do_req(struct request_queue *q, struct virtio_blk *vblk,
if (blk_barrier_rq(vbr->req)) if (blk_barrier_rq(vbr->req))
vbr->out_hdr.type |= VIRTIO_BLK_T_BARRIER; vbr->out_hdr.type |= VIRTIO_BLK_T_BARRIER;
/* We have to zero this, otherwise blk_rq_map_sg gets upset. */ /* This init could be done at vblk creation time */
memset(vblk->sg, 0, sizeof(vblk->sg)); sg_init_table(vblk->sg, VIRTIO_MAX_SG);
sg_set_buf(&vblk->sg[0], &vbr->out_hdr, sizeof(vbr->out_hdr)); sg_set_buf(&vblk->sg[0], &vbr->out_hdr, sizeof(vbr->out_hdr));
num = blk_rq_map_sg(q, vbr->req, vblk->sg+1); num = blk_rq_map_sg(q, vbr->req, vblk->sg+1);
sg_set_buf(&vblk->sg[num+1], &vbr->in_hdr, sizeof(vbr->in_hdr)); sg_set_buf(&vblk->sg[num+1], &vbr->in_hdr, sizeof(vbr->in_hdr));
......
...@@ -41,9 +41,9 @@ ...@@ -41,9 +41,9 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/scatterlist.h>
#include <asm/vio.h> #include <asm/vio.h>
#include <asm/scatterlist.h>
#include <asm/iseries/hv_types.h> #include <asm/iseries/hv_types.h>
#include <asm/iseries/hv_lp_event.h> #include <asm/iseries/hv_lp_event.h>
#include <asm/iseries/vio.h> #include <asm/iseries/vio.h>
...@@ -258,6 +258,7 @@ static int send_request(struct request *req) ...@@ -258,6 +258,7 @@ static int send_request(struct request *req)
cmd = viomajorsubtype_cdio | viocdwrite; cmd = viomajorsubtype_cdio | viocdwrite;
} }
sg_init_table(&sg, 1);
if (blk_rq_map_sg(req->q, req, &sg) == 0) { if (blk_rq_map_sg(req->q, req, &sg) == 0) {
printk(VIOCD_KERN_WARNING printk(VIOCD_KERN_WARNING
"error setting up scatter/gather list\n"); "error setting up scatter/gather list\n");
......
...@@ -284,6 +284,7 @@ static inline struct i2o_block_request *i2o_block_request_alloc(void) ...@@ -284,6 +284,7 @@ static inline struct i2o_block_request *i2o_block_request_alloc(void)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
INIT_LIST_HEAD(&ireq->queue); INIT_LIST_HEAD(&ireq->queue);
sg_init_table(ireq->sg_table, I2O_MAX_PHYS_SEGMENTS);
return ireq; return ireq;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment