From patchwork Fri Jul 6 06:58:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Markus Armbruster X-Patchwork-Id: 169350 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 88B8A2C01D3 for ; Fri, 6 Jul 2012 17:04:44 +1000 (EST) Received: from localhost ([::1]:40077 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sn2ao-0000Ym-AC for incoming@patchwork.ozlabs.org; Fri, 06 Jul 2012 03:04:42 -0400 Received: from eggs.gnu.org ([208.118.235.92]:60443) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sn2aR-0000Fx-PV for qemu-devel@nongnu.org; Fri, 06 Jul 2012 03:04:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sn2aM-00052o-38 for qemu-devel@nongnu.org; Fri, 06 Jul 2012 03:04:19 -0400 Received: from oxygen.pond.sub.org ([78.46.104.156]:50659) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sn2aL-000523-QA for qemu-devel@nongnu.org; Fri, 06 Jul 2012 03:04:14 -0400 Received: from blackfin.pond.sub.org (p5B32A0DA.dip.t-dialin.net [91.50.160.218]) by oxygen.pond.sub.org (Postfix) with ESMTPA id 2041DA5A57; Fri, 6 Jul 2012 09:04:12 +0200 (CEST) Received: by blackfin.pond.sub.org (Postfix, from userid 500) id 20148600B7; Fri, 6 Jul 2012 08:58:12 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Fri, 6 Jul 2012 08:58:05 +0200 Message-Id: <1341557890-17464-28-git-send-email-armbru@redhat.com> X-Mailer: git-send-email 1.7.6.5 In-Reply-To: <1341557890-17464-1-git-send-email-armbru@redhat.com> References: <1341557890-17464-1-git-send-email-armbru@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 78.46.104.156 Cc: kwolf@redhat.com, blauwirbel@gmail.com, stefanha@linux.vnet.ibm.com, pbonzini@redhat.com Subject: [Qemu-devel] [PATCH 27/32] block: Geometry and translation hints are now useless, purge them X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org There are two producers of these hints: drive_init() on behalf of -drive, and hd_geometry_guess(). The only consumer of the hint is hd_geometry_guess(). The callers of hd_geometry_guess() call it only when drive_init() didn't set the hints. Therefore, drive_init()'s hints are never used. Thus, hd_geometry_guess() only ever sees hints it produced itself in a prior call. Only the first call computes something, subsequent calls just repeat the first call's results. However, hd_geometry_guess() is never called more than once: the device models don't, and the block device is destroyed on unplug. Thus, dropping the repeat feature doesn't break anything now. If a block device wasn't destroyed on unplug and could be reused with a new device, then repeating old results would be wrong. Thus, dropping the repeat feature prevents future breakage. This renders the hints unused. Purge them from the block layer. Signed-off-by: Markus Armbruster --- block.c | 32 -------------------------------- block.h | 12 ------------ block_int.h | 1 - blockdev.c | 14 ++------------ hw/block-common.h | 6 ++++++ hw/hd-geometry.c | 20 +------------------- hw/pc.c | 1 + hw/qdev-properties.c | 1 + vl.c | 2 +- 9 files changed, 12 insertions(+), 77 deletions(-) diff --git a/block.c b/block.c index d021fd0..1eb5897 100644 --- a/block.c +++ b/block.c @@ -1013,12 +1013,6 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top) tmp.block_timer = bs_top->block_timer; tmp.io_limits_enabled = bs_top->io_limits_enabled; - /* geometry */ - tmp.cyls = bs_top->cyls; - tmp.heads = bs_top->heads; - tmp.secs = bs_top->secs; - tmp.translation = bs_top->translation; - /* r/w error */ tmp.on_read_error = bs_top->on_read_error; tmp.on_write_error = bs_top->on_write_error; @@ -2103,27 +2097,6 @@ void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr) *nb_sectors_ptr = length; } -void bdrv_set_geometry_hint(BlockDriverState *bs, - int cyls, int heads, int secs) -{ - bs->cyls = cyls; - bs->heads = heads; - bs->secs = secs; -} - -void bdrv_set_translation_hint(BlockDriverState *bs, int translation) -{ - bs->translation = translation; -} - -void bdrv_get_geometry_hint(BlockDriverState *bs, - int *pcyls, int *pheads, int *psecs) -{ - *pcyls = bs->cyls; - *pheads = bs->heads; - *psecs = bs->secs; -} - /* throttling disk io limits */ void bdrv_set_io_limits(BlockDriverState *bs, BlockIOLimit *io_limits) @@ -2132,11 +2105,6 @@ void bdrv_set_io_limits(BlockDriverState *bs, bs->io_limits_enabled = bdrv_io_limits_enabled(bs); } -int bdrv_get_translation_hint(BlockDriverState *bs) -{ - return bs->translation; -} - void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error, BlockErrorAction on_write_error) { diff --git a/block.h b/block.h index e0121d5..f02316d 100644 --- a/block.h +++ b/block.h @@ -256,18 +256,6 @@ int bdrv_has_zero_init(BlockDriverState *bs); int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum); -#define BIOS_ATA_TRANSLATION_AUTO 0 -#define BIOS_ATA_TRANSLATION_NONE 1 -#define BIOS_ATA_TRANSLATION_LBA 2 -#define BIOS_ATA_TRANSLATION_LARGE 3 -#define BIOS_ATA_TRANSLATION_RECHS 4 - -void bdrv_set_geometry_hint(BlockDriverState *bs, - int cyls, int heads, int secs); -void bdrv_set_translation_hint(BlockDriverState *bs, int translation); -void bdrv_get_geometry_hint(BlockDriverState *bs, - int *pcyls, int *pheads, int *psecs); -int bdrv_get_translation_hint(BlockDriverState *bs); void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error, BlockErrorAction on_write_error); BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read); diff --git a/block_int.h b/block_int.h index 1fb5352..d72317f 100644 --- a/block_int.h +++ b/block_int.h @@ -320,7 +320,6 @@ struct BlockDriverState { /* NOTE: the following infos are only hints for real hardware drivers. They are not used by the block driver */ - int cyls, heads, secs, translation; BlockErrorAction on_read_error, on_write_error; bool iostatus_enabled; BlockDeviceIoStatus iostatus; diff --git a/blockdev.c b/blockdev.c index 4d3b707..3274923 100644 --- a/blockdev.c +++ b/blockdev.c @@ -7,8 +7,8 @@ * later. See the COPYING file in the top-level directory. */ -#include "block.h" #include "blockdev.h" +#include "hw/block-common.h" #include "monitor.h" #include "qerror.h" #include "qemu-option.h" @@ -551,17 +551,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) case IF_SCSI: case IF_XEN: case IF_NONE: - switch(media) { - case MEDIA_DISK: - if (cyls != 0) { - bdrv_set_geometry_hint(dinfo->bdrv, cyls, heads, secs); - bdrv_set_translation_hint(dinfo->bdrv, translation); - } - break; - case MEDIA_CDROM: - dinfo->media_cd = 1; - break; - } + dinfo->media_cd = media == MEDIA_CDROM; break; case IF_SD: case IF_FLOPPY: diff --git a/hw/block-common.h b/hw/block-common.h index 2f65186..ec7810d 100644 --- a/hw/block-common.h +++ b/hw/block-common.h @@ -15,6 +15,12 @@ /* Hard disk geometry */ +#define BIOS_ATA_TRANSLATION_AUTO 0 +#define BIOS_ATA_TRANSLATION_NONE 1 +#define BIOS_ATA_TRANSLATION_LBA 2 +#define BIOS_ATA_TRANSLATION_LARGE 3 +#define BIOS_ATA_TRANSLATION_RECHS 4 + void hd_geometry_guess(BlockDriverState *bs, uint32_t *pcyls, uint32_t *pheads, uint32_t *psecs, int *ptrans); diff --git a/hw/hd-geometry.c b/hw/hd-geometry.c index 7626cbb..74678a6 100644 --- a/hw/hd-geometry.c +++ b/hw/hd-geometry.c @@ -122,25 +122,10 @@ void hd_geometry_guess(BlockDriverState *bs, { int cylinders, heads, secs, translation; - bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs); - translation = bdrv_get_translation_hint(bs); - - if (cylinders != 0) { - /* already got a geometry hint: use it */ - *pcyls = cylinders; - *pheads = heads; - *psecs = secs; - if (ptrans) { - *ptrans = translation; - } - return; - } - - assert(translation == BIOS_ATA_TRANSLATION_AUTO); - if (guess_disk_lchs(bs, &cylinders, &heads, &secs) < 0) { /* no LCHS guess: use a standard physical disk geometry */ guess_chs_for_size(bs, pcyls, pheads, psecs); + translation = BIOS_ATA_TRANSLATION_AUTO; } else if (heads > 16) { /* LCHS guess with heads > 16 means that a BIOS LBA translation was active, so a standard physical disk @@ -149,7 +134,6 @@ void hd_geometry_guess(BlockDriverState *bs, translation = *pcyls * *pheads <= 131072 ? BIOS_ATA_TRANSLATION_LARGE : BIOS_ATA_TRANSLATION_LBA; - bdrv_set_translation_hint(bs, translation); } else { /* LCHS guess with heads <= 16: use as physical geometry */ *pcyls = cylinders; @@ -158,11 +142,9 @@ void hd_geometry_guess(BlockDriverState *bs, /* disable any translation to be in sync with the logical geometry */ translation = BIOS_ATA_TRANSLATION_NONE; - bdrv_set_translation_hint(bs, translation); } if (ptrans) { *ptrans = translation; } - bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs); trace_hd_geometry_guess(bs, *pcyls, *pheads, *psecs, translation); } diff --git a/hw/pc.c b/hw/pc.c index 5fc64f7..968376e 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -44,6 +44,7 @@ #include "kvm.h" #include "xen.h" #include "blockdev.h" +#include "hw/block-common.h" #include "ui/qemu-spice.h" #include "memory.h" #include "exec-memory.h" diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 0b18f8c..01c378f 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -2,6 +2,7 @@ #include "qdev.h" #include "qerror.h" #include "blockdev.h" +#include "hw/block-common.h" void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) { diff --git a/vl.c b/vl.c index 1329c30..a7b707c 100644 --- a/vl.c +++ b/vl.c @@ -130,8 +130,8 @@ int main(int argc, char **argv) #include "qemu-timer.h" #include "qemu-char.h" #include "cache-utils.h" -#include "block.h" #include "blockdev.h" +#include "hw/block-common.h" #include "block-migration.h" #include "dma.h" #include "audio/audio.h"