From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=38222 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OBZSF-00084C-1p for qemu-devel@nongnu.org; Mon, 10 May 2010 16:19:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OBZSB-0000K1-Ou for qemu-devel@nongnu.org; Mon, 10 May 2010 16:19:54 -0400 Received: from mail-qy0-f188.google.com ([209.85.221.188]:40793) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OBZSA-0000FE-4S for qemu-devel@nongnu.org; Mon, 10 May 2010 16:19:51 -0400 Received: by mail-qy0-f188.google.com with SMTP id 26so6469139qyk.19 for ; Mon, 10 May 2010 13:19:49 -0700 (PDT) Message-ID: <4BE86A62.8090809@codemonkey.ws> Date: Mon, 10 May 2010 15:19:46 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 1/5] SCSI: Add disk reset handler References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Anthony Liguori , qemu-devel@nongnu.org, Gerd Hoffmann On 05/04/2010 07:20 AM, Jan Kiszka wrote: > Ensure that pending requests of an SCSI disk are purged on system reset > and also restore max_lba. The latter is no only present in the reset > handler as that one is called after init as well. > > Signed-off-by: Jan Kiszka > Applied all (including v2 of 5/5). Thanks. Regards, Anthony Liguori > --- > hw/scsi-disk.c | 35 +++++++++++++++++++++++++++-------- > 1 files changed, 27 insertions(+), 8 deletions(-) > > diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c > index 77cb1da..b8d805f 100644 > --- a/hw/scsi-disk.c > +++ b/hw/scsi-disk.c > @@ -1010,22 +1010,45 @@ 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)); > + if (r->req.aiocb) { > + bdrv_aio_cancel(r->req.aiocb); > + } > 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 +1069,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 +1077,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, >