From patchwork Tue Apr 13 12:42:06 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 50065 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 02558B7D15 for ; Tue, 13 Apr 2010 23:00:15 +1000 (EST) Received: from localhost ([127.0.0.1]:41430 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O1fTB-0005UT-HE for incoming@patchwork.ozlabs.org; Tue, 13 Apr 2010 08:43:57 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O1fRa-0005Px-2w for qemu-devel@nongnu.org; Tue, 13 Apr 2010 08:42:18 -0400 Received: from [140.186.70.92] (port=60757 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O1fRU-0005Ee-Kd for qemu-devel@nongnu.org; Tue, 13 Apr 2010 08:42:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O1fRS-0004dS-Di for qemu-devel@nongnu.org; Tue, 13 Apr 2010 08:42:12 -0400 Received: from thoth.sbs.de ([192.35.17.2]:20454) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O1fRS-0004cl-3F for qemu-devel@nongnu.org; Tue, 13 Apr 2010 08:42:10 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by thoth.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id o3DCg7Nu031814 for ; Tue, 13 Apr 2010 14:42:07 +0200 Received: from [139.25.109.167] (mchn012c.mchp.siemens.de [139.25.109.167] (may be forged)) by mail1.siemens.de (8.12.11.20060308/8.12.11) with ESMTP id o3DCg6Db018246 for ; Tue, 13 Apr 2010 14:42:07 +0200 Message-ID: <4BC4669E.6040004@siemens.com> Date: Tue, 13 Apr 2010 14:42:06 +0200 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4-2.6 Subject: [Qemu-devel] [PATCH] SCSI: Add disk reset handler X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Ensure that pending requests of an SCSI disk are purged on system reset and also restore max_lba. The latter is now only present in the reset handler as that one is already automatically called during init. Signed-off-by: Jan Kiszka --- hw/scsi-disk.c | 32 ++++++++++++++++++++++++-------- 1 files changed, 24 insertions(+), 8 deletions(-) This should be applied to stable as well. I can provide a corresponding patch once this one is acceptable. diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 77cb1da..50d5e9c 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -1010,22 +1010,42 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, } } -static void scsi_destroy(SCSIDevice *dev) +static void scsi_disk_purge_requests(SCSIDiskState *s) { - SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); SCSIDiskReq *r; while (!QTAILQ_EMPTY(&s->qdev.requests)) { r = DO_UPCAST(SCSIDiskReq, req, QTAILQ_FIRST(&s->qdev.requests)); scsi_remove_request(r); } +} + +static void scsi_disk_reset(DeviceState *dev) +{ + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev); + uint64_t nb_sectors; + + scsi_disk_purge_requests(s); + + bdrv_get_geometry(s->bs, &nb_sectors); + nb_sectors /= s->cluster_size; + if (nb_sectors) { + nb_sectors--; + } + s->max_lba = nb_sectors; +} + +static void scsi_destroy(SCSIDevice *dev) +{ + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); + + scsi_disk_purge_requests(s); drive_uninit(s->qdev.conf.dinfo); } static int scsi_disk_initfn(SCSIDevice *dev) { SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); - uint64_t nb_sectors; if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) { error_report("scsi-disk: drive property not set"); @@ -1046,11 +1066,6 @@ static int scsi_disk_initfn(SCSIDevice *dev) s->cluster_size = s->qdev.blocksize / 512; s->qdev.type = TYPE_DISK; - bdrv_get_geometry(s->bs, &nb_sectors); - nb_sectors /= s->cluster_size; - if (nb_sectors) - nb_sectors--; - s->max_lba = nb_sectors; qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s); return 0; } @@ -1059,6 +1074,7 @@ static SCSIDeviceInfo scsi_disk_info = { .qdev.name = "scsi-disk", .qdev.desc = "virtual scsi disk or cdrom", .qdev.size = sizeof(SCSIDiskState), + .qdev.reset = scsi_disk_reset, .init = scsi_disk_initfn, .destroy = scsi_destroy, .send_command = scsi_send_command,