From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH] virtio_blk: don't blindly derefence req->rq_disk Date: Mon, 11 May 2009 10:35:19 +0200 Message-ID: <20090511083519.GA20082@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org To: Rusty Russell Return-path: Received: from verein.lst.de ([213.95.11.210]:57428 "EHLO verein.lst.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754792AbZEKIf0 (ORCPT ); Mon, 11 May 2009 04:35:26 -0400 Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: request->rq_disk is only set for FS requests or BLOCK_PC requests originating from the generic block layer scsi ioctls. It's not set for requests origination from other soures or internal cache flush commands implemented by the patch I'll send after this. So instead of using it to get at the private data in do_virtblk_request setup queue->queuedata and use it. Signed-off-by: Christoph Hellwig Index: xfs/drivers/block/virtio_blk.c =================================================================== --- xfs.orig/drivers/block/virtio_blk.c 2009-05-11 10:09:59.833784412 +0200 +++ xfs/drivers/block/virtio_blk.c 2009-05-11 10:33:31.099659254 +0200 @@ -153,12 +153,11 @@ static bool do_req(struct request_queue static void do_virtblk_request(struct request_queue *q) { - struct virtio_blk *vblk = NULL; + struct virtio_blk *vblk = q->queuedata; struct request *req; unsigned int issued = 0; while ((req = elv_next_request(q)) != NULL) { - vblk = req->rq_disk->private_data; BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); /* If this request fails, stop queue and wait for something to @@ -286,6 +285,7 @@ static int virtblk_probe(struct virtio_d goto out_put_disk; } + vblk->disk->queue->queuedata = vblk; queue_flag_set_unlocked(QUEUE_FLAG_VIRT, vblk->disk->queue); if (index < 26) {