diff options
Diffstat (limited to 'drivers/block/xen-blkfront.c')
-rw-r--r-- | drivers/block/xen-blkfront.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index a6cbf7b808e6..c1996829d5ec 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
@@ -122,7 +122,7 @@ static DEFINE_SPINLOCK(blkif_io_lock); | |||
122 | static int get_id_from_freelist(struct blkfront_info *info) | 122 | static int get_id_from_freelist(struct blkfront_info *info) |
123 | { | 123 | { |
124 | unsigned long free = info->shadow_free; | 124 | unsigned long free = info->shadow_free; |
125 | BUG_ON(free > BLK_RING_SIZE); | 125 | BUG_ON(free >= BLK_RING_SIZE); |
126 | info->shadow_free = info->shadow[free].req.id; | 126 | info->shadow_free = info->shadow[free].req.id; |
127 | info->shadow[free].req.id = 0x0fffffee; /* debug */ | 127 | info->shadow[free].req.id = 0x0fffffee; /* debug */ |
128 | return free; | 128 | return free; |
@@ -231,7 +231,7 @@ static int blkif_queue_request(struct request *req) | |||
231 | info->shadow[id].request = (unsigned long)req; | 231 | info->shadow[id].request = (unsigned long)req; |
232 | 232 | ||
233 | ring_req->id = id; | 233 | ring_req->id = id; |
234 | ring_req->sector_number = (blkif_sector_t)req->sector; | 234 | ring_req->sector_number = (blkif_sector_t)blk_rq_pos(req); |
235 | ring_req->handle = info->handle; | 235 | ring_req->handle = info->handle; |
236 | 236 | ||
237 | ring_req->operation = rq_data_dir(req) ? | 237 | ring_req->operation = rq_data_dir(req) ? |
@@ -299,25 +299,25 @@ static void do_blkif_request(struct request_queue *rq) | |||
299 | 299 | ||
300 | queued = 0; | 300 | queued = 0; |
301 | 301 | ||
302 | while ((req = elv_next_request(rq)) != NULL) { | 302 | while ((req = blk_peek_request(rq)) != NULL) { |
303 | info = req->rq_disk->private_data; | 303 | info = req->rq_disk->private_data; |
304 | if (!blk_fs_request(req)) { | ||
305 | end_request(req, 0); | ||
306 | continue; | ||
307 | } | ||
308 | 304 | ||
309 | if (RING_FULL(&info->ring)) | 305 | if (RING_FULL(&info->ring)) |
310 | goto wait; | 306 | goto wait; |
311 | 307 | ||
312 | pr_debug("do_blk_req %p: cmd %p, sec %lx, " | 308 | blk_start_request(req); |
313 | "(%u/%li) buffer:%p [%s]\n", | ||
314 | req, req->cmd, (unsigned long)req->sector, | ||
315 | req->current_nr_sectors, | ||
316 | req->nr_sectors, req->buffer, | ||
317 | rq_data_dir(req) ? "write" : "read"); | ||
318 | 309 | ||
310 | if (!blk_fs_request(req)) { | ||
311 | __blk_end_request_all(req, -EIO); | ||
312 | continue; | ||
313 | } | ||
314 | |||
315 | pr_debug("do_blk_req %p: cmd %p, sec %lx, " | ||
316 | "(%u/%u) buffer:%p [%s]\n", | ||
317 | req, req->cmd, (unsigned long)blk_rq_pos(req), | ||
318 | blk_rq_cur_sectors(req), blk_rq_sectors(req), | ||
319 | req->buffer, rq_data_dir(req) ? "write" : "read"); | ||
319 | 320 | ||
320 | blkdev_dequeue_request(req); | ||
321 | if (blkif_queue_request(req)) { | 321 | if (blkif_queue_request(req)) { |
322 | blk_requeue_request(rq, req); | 322 | blk_requeue_request(rq, req); |
323 | wait: | 323 | wait: |
@@ -344,7 +344,7 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) | |||
344 | queue_flag_set_unlocked(QUEUE_FLAG_VIRT, rq); | 344 | queue_flag_set_unlocked(QUEUE_FLAG_VIRT, rq); |
345 | 345 | ||
346 | /* Hard sector size and max sectors impersonate the equiv. hardware. */ | 346 | /* Hard sector size and max sectors impersonate the equiv. hardware. */ |
347 | blk_queue_hardsect_size(rq, sector_size); | 347 | blk_queue_logical_block_size(rq, sector_size); |
348 | blk_queue_max_sectors(rq, 512); | 348 | blk_queue_max_sectors(rq, 512); |
349 | 349 | ||
350 | /* Each segment in a request is up to an aligned page in size. */ | 350 | /* Each segment in a request is up to an aligned page in size. */ |
@@ -551,7 +551,6 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) | |||
551 | 551 | ||
552 | for (i = info->ring.rsp_cons; i != rp; i++) { | 552 | for (i = info->ring.rsp_cons; i != rp; i++) { |
553 | unsigned long id; | 553 | unsigned long id; |
554 | int ret; | ||
555 | 554 | ||
556 | bret = RING_GET_RESPONSE(&info->ring, i); | 555 | bret = RING_GET_RESPONSE(&info->ring, i); |
557 | id = bret->id; | 556 | id = bret->id; |
@@ -578,8 +577,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) | |||
578 | dev_dbg(&info->xbdev->dev, "Bad return from blkdev data " | 577 | dev_dbg(&info->xbdev->dev, "Bad return from blkdev data " |
579 | "request: %x\n", bret->status); | 578 | "request: %x\n", bret->status); |
580 | 579 | ||
581 | ret = __blk_end_request(req, error, blk_rq_bytes(req)); | 580 | __blk_end_request_all(req, error); |
582 | BUG_ON(ret); | ||
583 | break; | 581 | break; |
584 | default: | 582 | default: |
585 | BUG(); | 583 | BUG(); |